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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 16:55:04