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

三次多项式曲线拟合:批量与单独计算结果不一致问题求助

三次多项式曲线拟合计算结果不一致问题

问题背景

我正在用三次多项式做数据曲线拟合,代码如下:

def objective3(x, a, b, c,d):
    return a * x + b * x**2 + c * x**3 +d
y=center_1080[itr,:]
x=[1000 ,2000, 3000, 4000, 5000, 6000, 8000, 10000, 12000]
popt, pcov,info,msg, ier= curve_fit(objective3, x, y,full_output=True)
a, b, c ,d= popt

y与x形状一致。之后我用以下代码基于拟合曲线计算新的y值:

x_line4 = arange(min(x), max(x), 1)
# calculate the output for the range
y_line4 = objective3(x_line4, a, b, c,d)

假设x_line4为形状(5,)的数组:

11995
11996
11997
11998
11999

当传入整个x_line4调用objective3时,输出为:

66.4718
66.4732
66.4746
66.4759
66.4773

但单独传入x_line4的元素时结果却不同:例如objective3(11999,a,b,c,d)=81.11075844620781,而objective3(x_line4[4],a,b,c,d)=66.4773。已知拟合参数为a=0.003184157353698613,b=-2.2820353448818053e-07,c=8.475420387015893e-12,d=61.11802131658904。

问题根源

问题出在输入数据的类型差异:

  • 直接传入整数11999时,Python会以整数类型执行运算。三次项x**3会得到极大的整数值(11999**3=1727095209999),后续与极小的系数c(8.475e-12)相乘时,整数与浮点数的混合运算会触发精度丢失,导致结果偏差。
  • x_line4是numpy.arange生成的数组,默认类型为浮点数(如numpy.float64),所有运算都以高精度浮点数执行,结果是正确的拟合值。

解决方法

  1. 手动将整数输入转换为浮点数后再调用函数:
objective3(11999.0, a, b, c, d)  # 结果与x_line4[4]的计算值一致
  1. 修改objective3函数,强制将输入x转为浮点数,避免类型差异:
import numpy as np
def objective3(x, a, b, c,d):
    x = np.asarray(x, dtype=np.float64)
    return a * x + b * x**2 + c * x**3 +d

内容的提问来源于stack exchange,提问作者david

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:40:42