質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

2205閲覧

Pythonのフーリエ級数展開について

gymgym

総合スコア97

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/04/24 01:25

編集2018/04/27 07:10

Pythonでフーリエ級数展開をしたいと考えています

Python

1# -*- coding: utf-8 -*- 2from pylab import * 3from scipy.integrate import quad 4 5x_min = -pi - 0.5 6x_max = pi*2 + 0.5 7y_min = -0.25 8y_max = 1.25 9axis([x_min, x_max, y_min, y_max]) 10xs = linspace(x_min, x_max, 256) 11 12n_max = 5 13 14def fun(x): 15 x = (x + pi) % (pi * 2) - pi 16 f = abs(x) 17 18 return f 19 """ 20 if x >= 0: 21 return 1 22 else: 23 return 0 24 """ 25 26def fourier(fun, n_max): 27 a = [] 28 b = [] 29 res, err = quad(lambda x:fun(x), -pi, pi) 30 a += [res/pi] 31 b += [0.0] 32 for n in range(1, 1+n_max): 33 res, err = quad(lambda x:fun(x)*cos(n*x), -pi, pi) 34 a+=[res/pi] 35 for n in range(1, 1+n_max): 36 res, err = quad(lambda x:fun(x)*sin(n*x), pi, pi) 37 b+=[res/pi] 38 39 return a, b 40 41a, b = fourier(fun, n_max) 42 43def fourier_function(x,a,b): 44 f = 0.5 * a[0] 45 for n in range(1, len(a)): 46 f += a[n]*cos(n*x) + b[n]*sin(n*x) 47 return f 48 49f_fn = amap(lambda x:fourier_function(x,a,b),xs) 50 51 52#plot(xs, amap(f, xs), 'b:', lw=1) 53plot(xs, f_fn, 'r-', lw=1) 54show()

イメージ説明

a, bをちゃんと求めるようにして実行できるように組んでみたのですが、やはりうまくいきません。

何度も申し訳ないのですがアドバイスいただけたらありがたいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

矩形波ならフーリエ係数を数式で簡単に求められるので、まずはその振幅を正しく計算できていることを確認するのが先でしょうね。a, bは正しい値を持っていますか?

投稿2018/04/24 01:38

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

(tachikomaさんご指摘のとおり)fourierに間違いがありますね。

プログラミングの問題というよりはフーリエ級数展開の数式そのものの間違いなので、ヒントだけ申し上げますと間違いは2点あります。

おそらく矩形波のフーリエ級数展開の係数を手計算により求めるような解説をご覧になったのだろうと想像します。

手計算では「偶数項が0になるから奇数項だけ残せばよい」みたいな三角関数の計算上の最適化を工夫したりしますが、例えば次数0~N-1の奇数項だけ計算すればよいといった工夫をそのままプログラミングするならrange(N)ではなくrange(1, N, 2)のようにしないとまずいですよね?

プログラムでは数値計算的に係数を計算していますので、そういう工夫は必ずしも必要ありません。かえって混乱しやすくなると思います。手計算で行うような最適化は考えずに、理論式を単純に当てはめればそういう間違いをすることもなく、すんなりでてくると思います。

2点のうち1点は単純なケアレスミスなのでヒントをいっちゃうと答えになってしまいます。ご自分で見つけてみてください。

投稿2018/04/24 04:26

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gymgym

2018/04/27 07:12

せっかくアドバイスいただいてやってみたのですが、まだうまく実行できませんでした。 もう少しアドバイスいただけないでしょうか。 よろしくお願いします。
KSwordOfHaste

2018/04/27 07:25

quadは定積分を計算する関数ということはおわかりですよね?
gymgym

2018/05/01 03:41

間違いに気づきました。 お手数をおかけしてすみませんでした。
KSwordOfHaste

2018/05/01 03:55

気づいてしまえば「あ・・・しまった」と思われたことでしょう。 quad(f, pi, pi)だと積分区間の幅が0なのでbの項が全部0になってしまいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問