2017-07-27 17 views
1

この関数にデータをフィッティングするときにscipy curve_fitを使用すると、奇妙な結果になります。scipy curve_fitフーリエ関数フィッティング時に滑らかなグラフが生成されない

def func(t, freq, offset, a0, b0, a1, b1, a2, b2, a3, b3): 
    return (
     + a0*np.sin(2.*0*np.pi*freq*t) 
     + b0*np.cos(2.*0*np.pi*freq*t)  
     + a1*np.sin(2.*1*np.pi*freq*t) 
     + b1*np.cos(2.*1*np.pi*freq*t)  
     + a2*np.sin(2.*2*np.pi*freq*t) 
     + b2*np.cos(2.*2*np.pi*freq*t)  
     + a3*np.sin(2.*3*np.pi*freq*t) 
     + b3*np.cos(2.*3*np.pi*freq*t) 
     + offset) 

これは、フィットの結果ですが、フィット感自体は大丈夫です Bumpy curve fit line

をプロットした、という唯一の問題は、ラインがでこぼこであるということです。私はサインとコサインに定数をつけているだけなので、どのように起こっているのでしょうか?これはmatplotlibやcurve_fitting関数で起こっていますか?もう一つは、関数に多かれ少なかれ項を追加するかどうかに応じて、関数自体が滑らかになるか、やり直しになるということです。

答えて

4

a0という用語は、定数0であるため、そのまま使用することができます。 b0は、オフセットと同じにすることもできます。これはバンプの原因ではありませんが、2つの冗長フィッティングパラメータを削除します。

def func(t, freq, offset, a1, b1, a2, b2, a3, b3): 
    return ( 
     + a1*np.sin(2.*1*np.pi*freq*t) 
     + b1*np.cos(2.*1*np.pi*freq*t)  
     + a2*np.sin(2.*2*np.pi*freq*t) 
     + b2*np.cos(2.*2*np.pi*freq*t)  
     + a3*np.sin(2.*3*np.pi*freq*t) 
     + b3*np.cos(2.*3*np.pi*freq*t) 
     + offset) 

それ以外は、結果が期待されます。あなたが許可する周波数が多いほど、あなたのプロットの周波数は高くなります。バンプは振幅が小さく、周波数が高いsin関数またはcos関数です。フィッティングカーブをプロットするときに、x軸上でより多くのデータポイントを使用すると、バンプがsin関数のように滑らかであることがわかります。

+0

ありがとうございます!実際には、冗長な用語を削除すると、グラフが滑らかになっているように見えました。 – Giovanni

関連する問題