python - scipy curve_fit 在拟合傅里叶函数时不产生平滑的图形

标签 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 函数中发生的?另一件事是,取决于我是否向函数添加了更多或更少的项,函数将自行平滑,或者再次变得颠簸。

最佳答案

您可以省略 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 函数一样平滑。

关于python - scipy curve_fit 在拟合傅里叶函数时不产生平滑的图形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45356848/

相关文章:

python - 沿 3D 数组轴的矢量化欧几里德距离 - Python

Python/Scipy 滤波器离散化

python - 如何从python客户端发送JSON对象到kafka

python - 使用 mplot3d 的 matplotlib 中的箭头

python - PyLab : Plotting axes to log scale, 但在轴上标记特定点

python - 如何更改 matplotlib barh 图中的宽度

python - numpy/scipy 等效于 R ecdf(x)(x) 函数?

python - 函数 def 中的 True & False

python - 在 python 上组合或压缩列表

python - 编写 PythonGDB 扩展时尝试继承 gdb.Breakpoint 时出错