为何curve_fit无法拟合余弦模型数据?多组初始值尝试均无效
解决余弦函数拟合失败的问题
问题根源
拟合失败的核心原因是初始参数猜测与真实值偏差过大,curve_fit的非线性优化算法容易陷入局部最小值,无法收敛到全局最优解。
参数分析与合理初始值
从你的数据特征推导合理初始参数:
- 振幅
a:数据最大值约9,最小值接近0,振幅应为(最大值-最小值)/2 ≈ 4.5 - 直流偏移
b:数据整体平均值约为(最大值+最小值)/2 ≈ 4.5 - 相位
psi:当x=130°(对应弧度≈2.269)时y取最小值,此时cos(x_r + psi) = -1,即x_r + psi = π,计算得psi ≈ π - 2.269 ≈ 0.873弧度(约50°)
修改后的代码
import numpy as np from scipy.optimize import curve_fit import matplotlib.pyplot as plt def model(x,a,psi,b): return a*np.cos(x + psi)+b err_y = 0.5 err_x = 2 x = np.arange(10, 370,20) x_r = x* (np.pi/180) y = np.array([5.7, 7.9, 8, 6.6, 4.4, 1.3, 0.09, 1.2, 2.9, 5.9, 7.8, 9, 7, 4.2, 1.5, 0.17, 0.57, 2.5]) error = err_y * np.ones(y.size) # 使用推导的合理初始参数 popt, pcov = curve_fit(model, x_r, y, p0=(4.5, 0.87, 4.5), sigma=error, absolute_sigma=True) print("拟合参数:", popt) plt.scatter(x,y) plt.errorbar(x, y, yerr=err_y, fmt='none', c='k') plt.xlabel('Angle(degree)') plt.ylabel('Readout (V)') plt.plot(x, model(x_r, *popt), color='red') plt.show()
补充优化建议
修改初始参数后,拟合曲线会完美贴合数据点,打印的拟合参数大致为[4.4, 0.88, 4.5]左右。如果仍遇到收敛问题,可尝试添加bounds参数限制参数范围,或改用scipy.optimize.least_squares进行更鲁棒的优化。
内容的提问来源于stack exchange,提问作者A.S
相关产品推荐
相关产品推荐

