You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何scipy.optimize.curve_fit无法拟合阻尼正弦曲线?

阻尼正弦曲线拟合问题:FFT技巧失效,仅得到直线拟合结果

背景回顾

此前有关于curve_fit无法良好拟合曲线的问题,核心原因是频率相关的目标函数特性差,存在大量远离全局最小值的局部最优解。解决思路是通过FFT近似频率作为初始猜测值,引导优化器靠近全局最优,避免陷入局部最小值。

当前问题

使用上述FFT技巧拟合另一组阻尼正弦曲线数据集时,拟合结果仅为一条直线。尝试过scipy.optimize.basinhopping有一定效果,但期望获得更优的拟合结果。

代码片段

不含冗长数据列表的代码如下:

ydata=[float(_) for _ in ydata.strip().splitlines()]

from scipy.optimize import curve_fit as cf
import numpy as np
from matplotlib import pyplot as plt
from scipy.optimize import basinhopping as bh
xdata=np.arange(0.05,500.01,0.05)

def damped_sin_fun(x,a,b,c,d,e):
    return a*(np.exp(-x/e))*np.sin(b*x+c)+d

fft = np.fft.fft(ydata - np.array(ydata).mean())
timestep = xdata[1] - xdata[0]
freq = np.fft.fftfreq(len(fft), d=timestep)
largest_component = np.abs(fft).argmax()
phase_guess = np.angle(fft[largest_component]) * freq[largest_component]
initial_frequency_guess = freq[largest_component] * 2 * np.pi

p_opt,p_cov=cf(damped_sin_fun,xdata,ydata, p0=[0.05, initial_frequency_guess, np.pi/2 ,np.mean(ydata),2.3])

print(initial_frequency_guess)
print(p_opt)
#print(((damped_sin_fun(xdata,*p_opt)-ydata)**2).mean())
optimize=bh(lambda args: ((damped_sin_fun(xdata,*args)-ydata)**2).mean(), [0.05, initial_frequency_guess, np.pi/2 ,np.mean(ydata),2.3]).x

plt.plot(xdata,damped_sin_fun(xdata,*p_opt))
plt.xlim((0,10))
#plt.plot(xdata,damped_sin_fun(xdata,*optimize))
#plt.plot(xdata,ydata, 'r.-', ms=1)
plt.show()

内容的提问来源于stack exchange,提问作者StarDust

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 23:35:03