2017-07-27 56 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期限,因爲這是恆定的零。您也可以將b0退出,因爲這與偏移量相同。這不是顛簸的原因,但刪除了兩個冗餘的擬合參數。

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) 

除此之外,預期結果。您允許的頻率越多,您的情節中的頻率就越高。顛簸是具有低振幅和高頻率的正弦或餘弦函數。繪製擬合曲線時,在x軸上使用更多的數據點可以讓您觀察到顛簸也像sin函數一樣平滑。

+0

非常感謝!實際上,刪除多餘的術語似乎已經平滑了圖形。 – Giovanni