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

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

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

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2420閲覧

python フ―リエ級数展開した式をグラフに出力する。

tiroha

総合スコア109

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/11/12 05:45

元の関数f(t)=1(ーπ<t<=0)かつ 0(0<t<=π)のフ―リエ級数展開した式をグラフに出力したいです。
フ―リエ級数展開は1/2+(Σ(k=1~∞)1-(-1)のk乗*sin(nπx)/nπ)
def f(t,k)の所を何度も変えても波は重なりません。ただ、最初の1.0を無くすと重なりますが、グラフの形が違う上に、フ―リエ級数展開は1.0もシグマの中に含んでいるので、絶対この位置だと思います。

python

1# -*- coding: utf-8 -*- 2import numpy as np 3import matplotlib.pyplot as plt 4 5def f(t,k): 6 return -(1.0-np.power(-1,k)*np.sin(k*np.pi*t))/k*np.pi 7 #return -np.sin((2.0*k-1.0)*t)/(2.0*k-1.0)*np.pi 8 9dt = 0.01 10start = -2.0*np.pi 11end = 2.0*np.pi 12 13# 横軸 t の作成.-6.28 から 6.28 を0.01 おきに.t は横ベクトル. 14t = np.arange(start, end, dt) 15 16K=1 17s1 = (1.0/2.0)*np.ones(t.size) 18for k in range(K): 19 s1 = s1 + f(t,k+1) 20K=3 21s3 = (1.0/2.0)*np.ones(t.size) 22for k in range(K): 23 s3 = s3 + f(t,k+1) 24 25K=10 26s10 = (1.0/2.0)*np.ones(t.size) 27for k in range(K): 28 s10 = s10 + f(t,k+1) # k+1 にしているのは,ranng(5) は 0 はじまりのため. 29 30K=100 31s100 = (1.0/2.0)*np.ones(t.size) 32for k in range(K): 33 s100 = s100 + f(t,k+1) 34 35K=1000 36s1000 = (1.0/2.0)*np.ones(t.size) 37for k in range(K): 38 s1000 = s1000 + ft,k+1) 39 40 41fig=plt.figure(0) 42plt.plot (t, s3, linewidth=1.0, color="r",linestyle="solid",label="$ K=3 $") 43plt.plot (t, s10, linewidth=1.0, color="g",linestyle="solid",label="$ K=10 $") 44plt.plot (t, s100, linewidth=1.0, color="b",linestyle="solid",label="$ K=100 $") 45plt.plot (t, s1000, linewidth=1.0, color="m",linestyle="solid",label="$ K=1000 $") 46plt.grid() 47plt.legend() 48plt.show() 49fig.savefig('f102.pdf') 50

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

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

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

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

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

guest

回答2

0

ベストアンサー

元の関数で表される矩形波を表示したいってことですね。
下記の出力が期待結果であってますか?

python

1# 修正前:return -(1.0-np.power(-1,k)*np.sin(k*np.pi*t))/k*np.pi 2 3#修正後 4return (-1) * (1.0 - np.power(-1,k)) * (np.sin(k * t) / (k * np.pi))

あと、下記が"("漏れでした。

s1000 = s1000 + ft,k+1) ^^^^^^^ f(t,k+1)

修正後の出力
イメージ説明

元の関数f(t)=1(ーπ<t<=0)かつ 0(0<t<=π)
フ―リエ級数展開は1/2+(Σ(k=1~∞)1-(-1)のk乗*sin(nπx)/nπ)

あまり数学は得意ではありませんが、フーリエ級数展開は、1/2 - (Σ(k=1~∞)(1-(-1)^k) * sin(kt) / (k * pi)) ですかね?

投稿2020/11/13 00:15

編集2020/11/13 00:16
sukekeke0

総合スコア331

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

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

tiroha

2020/11/13 00:22

回答ありがとうございます! こんなようなグラフを出力したかったんです!ありがとうございます! フ―リエ級数展開は惜しいです。 正しくは1/2 - (Σ(k=1~∞)(1-(-1)^k) * sin(nπt) / (n * pi)) sin(nt)のところにπが抜けています。 なので、return (-1) * (1.0 - np.power(-1,k)) * (np.sin(k * t) / (k * np.pi)) のnp.sin(k*np.pi*t)にしたら正しくグラフが出力されました!
guest

0

かっこの位置が間違っているようです。

質問者様のコード

Python

1 return -(1.0-np.power(-1,k)*np.sin(k*np.pi*t))/k*np.pi

正しそうなコード

Python

1 return -(1.0-np.power(-1,k))*np.sin(k*np.pi*t)/k*np.pi

投稿2020/11/12 14:04

toast-uz

総合スコア3266

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

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

tiroha

2020/11/13 00:22

回答ありがとうございます! ()の位置でこんなに変わるんですね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問