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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:39:27