拟合傅里叶函数时scipy curve_fit不生成平滑图

时间:2017-07-27 16:58:56

标签: python matplotlib scipy curve-fitting

在将数据拟合到此函数时使用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函数中发生的?另一件事是,根据我是否向函数添加更多或更少的项,函数将自行平滑,或再次变得颠簸。

1 个答案:

答案 0 :(得分: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函数一样平滑。