2016-12-03 8 views
0

私は、複合フーリエ級数に展開してインパルス関数を拡張しようとしていました。以下のほとんどの作業例を参照してください:複合フーリエ級数展開エラー(Python)

import numpy as np 
import matplotlib.pyplot as plt 

Tp = 1 
N = 1000 
w = 0.05 
t = np.linspace(-Tp/2, Tp/2, N) 
dt = Tp/N 

xp = np.zeros(N) 
xp[abs(t) <= w*Tp] = 1 
xp = xp + 0.0*(np.random.rand(N)-0.5) 

def cn(x, t, dt, Tp, n): 
    return np.trapz(x*np.exp(-1j*2*np.pi*n*t/Tp),dx=dt)*1/Tp 

def c(x, t, dt, Tp, N): 
    return [cn(x, t, dt, Tp, i) for i in range(-N,N)] 

def rek_c(x, t, dt, Tp, N): 
    _c=c(x, t, dt, Tp, N) 
    out=np.zeros(len(x),dtype='complex') 
    for i in range(-N,N): 
     out += _c[N+i]*np.exp(1j*2*np.pi*(i)*t/Tp) 
    return out 

plt.plot(t, xp) 
plt.plot(t, rek_c(xp, t, dt, Tp,50), 'r') 
plt.show() 

予想通り上記の例では、 enter image description here

を生成します。しかし、何かが本当に奇妙なことは、展開が1000要素に向かうときです。したがって、plt.plot(t, rek_c(xp, t, dt, Tp, 1000), 'r')と入力すると、これは明らかに間違ったプロットになります。 enter image description here

なぜですか?それをどうやって修正するのですか?

+0

ポイント数が増えると丸め誤差が悪化すると思います。多分方程式のいくつかの再編成はこれを避けることができますか? –

答えて

1

あなたのコードの周りビットを演奏した後、私は次を発見:

増加Nはヘッダにあなたがより多くの要素を扱うことができる場合はN(rek_cの入力パラメータ)。だから、

K=N-1 
plt.plot(t, rek_c(xp, t, dt, Tp,K), 'r') 

はあなたに最後の許容可能な結果が得られます、しばらく

K=N 
plt.plot(t, rek_c(xp, t, dt, Tp,K), 'r') 

は、最初に間違った結果が得られます。

今すぐrek_cコマンドKの最後のパラメータを呼び出します.Nはヘッダに定義されているメッシュポイントの数です。 私はあなたの入力がメッシュポイントNを持っているよりも高い頻度Kで説明できないと思います。(完全な)離散フーリエ変換は2N-1の周波数を与えます。 K = Nの場合は、2Nの周波数で展開します。これはかなりです。

詳細な解析のためには、Nyquist frequency(離散データの可能な最高頻度)とnumpy.fft.fftを調べる価値があります。

+0

私はちょうどあなたのアルゴリズムについて疑いがあることを認識しました。多分numpy.fft.fftとのクロスチェックの価値があります –