如何使用scipy curve_fit求解含已知参数方程的未知参数
代码问题说明
你的拟合结果完全不可信,代码存在三个致命问题:
- 错把已知固定参数
e当成了待拟合参数。curve_fit会自动将函数中自变量x后的所有入参识别为待优化参数,当前写法会让算法直接拟合a、b、c、d、e五个未知量,你预先定义的已知e数组根本没有参与计算,最终输出的e是算法迭代生成的随机拟合值,和你已知的e没有任何关系。 - 固定参数传参逻辑错误。已知不需要拟合的参数不能放在待拟合参数列表里,需要通过闭包或者
curve_fit的args参数传入。 - 测试数据无逻辑关联。你用的x、y、e都是独立生成的均匀随机数,本身不存在三次函数映射关系,拟合本身就没有实际意义,你得到的d值高达-24200081就是算法在无规律数据上迭代发散的典型表现。
修正后的代码示例
import numpy as np from scipy.optimize import curve_fit np.random.seed(0) # 测试阶段建议先用已知参数生成模拟数据验证逻辑,避免无意义拟合 x = np.random.randint(0, 100, 100) e = np.random.randint(0, 100, 100) # 已知固定参数 # 预设真实参数生成带噪声的y,用于验证拟合准确性 true_a, true_b, true_c, true_d = 0.0001, -0.01, 0.2, 5 y = true_a * x**3 + true_b * x**2 + true_c * x + true_d + e + np.random.normal(0, 1, size=100) # 待拟合参数a/b/c/d放在前面,已知固定参数放最后,拟合时通过args传入 def cubic(x, a, b, c, d, e_fixed): return a * x**3 + b * x**2 + c * x + d + e_fixed # p0传入参数初始猜测值,可大幅降低拟合发散概率 popt, pcov = curve_fit(cubic, x, y, p0=[0, 0, 0, 0], args=(e,)) a, b, c, d = popt # 输出拟合结果,可和预设的真实参数对比验证准确性 print(f"拟合得到a={a:.6f}, b={b:.6f}, c={c:.6f}, d={d:.6f}")
拟合注意事项
- 如果
e是和x长度一致的逐点对应数组,必须通过args传入,不能当做全局常数处理,否则会出现值匹配错误。 - 拟合完成后可对返回的协方差矩阵
pcov取对角线元素开根号,得到每个参数的拟合标准误,如果标准误远大于参数本身的数值,说明模型和数据不匹配,拟合结果不可靠。 - 不要用完全独立的随机数测试拟合逻辑,先用已知参数生成的模拟数据跑通全流程,确认参数能准确回算后再替换成真实业务数据。
内容的提问来源于stack exchange,提问作者user032020
相关产品推荐
相关产品推荐

