三次多项式曲线拟合:批量与单独计算结果不一致问题求助
三次多项式曲线拟合计算结果不一致问题
问题背景
我正在用三次多项式做数据曲线拟合,代码如下:
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),所有运算都以高精度浮点数执行,结果是正确的拟合值。
解决方法
- 手动将整数输入转换为浮点数后再调用函数:
objective3(11999.0, a, b, c, d) # 结果与x_line4[4]的计算值一致
- 修改
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
相关产品推荐
相关产品推荐

