为何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
相关产品推荐
相关产品推荐

