在将数据拟合到此函数时使用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)
合身本身没问题,唯一的问题是线条凹凸不平。由于我只用常数拟合正弦和余弦,这怎么可能发生呢?这是在matplotlib还是在curve_fitting函数中发生的?另一件事是,根据我是否向函数添加更多或更少的项,函数将自行平滑,或再次变得颠簸。
答案 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函数一样平滑。