Python中多拟合曲线求交点时计算根与图表不符的问题
拟合曲线交点计算与可视化结果不符的原因
问题背景
使用4组数据通过curve_fit拟合五次多项式曲线,拟合代码如下:
center_540=np.sort(center_540,axis=0) y=center_540[itr,:] x=[0.2 ,0.4, 0.6, 0.8, 1, 2, 3, 4, 5,6] popt, pcov,info,msg, ier= curve_fit(objective, x, y,full_output=True) # 提取拟合参数 a, b, c ,d,e,f= popt # 绘制原始数据点 pyplot.scatter(x, y) # 生成拟合曲线的x序列 x_line = np.linspace(min(x), max(x), 100) # 计算拟合曲线的y值 y_line = objective(x_line, a, b, c,d,e,f) # 绘制拟合曲线 pyplot.plot(x_line, y_line, '--', color='red') pyplot.xlabel('Rate') pyplot.ylabel('PSNR') err = np.dot(info['fvec'], info['fvec']) plt.title('interpolation error resolution 540p: err=%f' %err) pyplot.show()
拟合完成后,通过以下函数求解任意两组曲线的交点:
def find_root(a1,b1,c1,d1,e1,f1,a2,b2,c2,d2,e2,f2): coeff=[a1-a2,b1-b2,c1-c2,d1-d2,e1-e2,f1-f2] print(np.roots(coeff))
调用示例:
find_root(0.0063 , -0.1260 , 1.0146,-4.2147,10.4717,14.9473,0.0179 , -0.3148 , 2.1038,-6.7798,11.6871,15.5829)#1080 vs 720 find_root(0.0063 , -0.1260 , 1.0146,-4.2147,10.4717,14.9473,0.0189 , -0.3332 , 2.2272,-7.1543,12.0520,15.3168)# 1080 vs 540 find_root(0.0063 , -0.1260 , 1.0146,-4.2147,10.4717,14.9473,0.0178 , -0.3181 , 2.1672,-7.0761,11.6511,15.8349)#1080 vs 360 find_root(0.0179 , -0.3148 , 2.1038,-6.7798,11.6871,15.5829,0.0189 , -0.3332 , 2.2272,-7.1543,12.0520,15.3168) # 720 vs 540 find_root( 0.0179 , -0.3148 , 2.1038,-6.7798,11.6871,15.5829,0.0178 , -0.3181 , 2.1672,-7.0761,11.6511,15.8349)#720 vs 360 find_root(0.0189 , -0.3332 , 2.2272,-7.1543,12.0520,15.3168,0.0178 , -0.3181 , 2.1672,-7.0761,11.6511,15.8349)# 540 vs 360
出现的问题:图表中所有交点都小于1,但find_root输出的实根存在大于1或负数的情况,例如:
[ 7.19666881+0.j 4.11941032+2.23825508j 4.11941032-2.23825508j 1.14334481+0.j -0.30297219+0.j ]
原因分析
多项式外推无实际意义
拟合数据的x范围是[0.2,6],五次多项式在该区间外的走势是不受真实数据约束的。图表仅绘制了区间内的曲线,但求解交点时得到的根可能落在区间之外——这些是数学上的解,但和你的实际数据场景无关,不具备业务意义。高次多项式过拟合引发虚假交点
五次多项式自由度极高,容易对数据中的噪声过度拟合,导致曲线在数据区间外产生剧烈波动,进而生成无意义的虚假交点。你看到的大于1或负数的根,就是这种过度拟合的产物。未限定有效区间筛选根
两个五次多项式相减得到的差函数是五次多项式,最多有5个根(含复根)。只有落在数据有效区间(或你关心的x范围,比如[0.2,1])内的实根,才是对应图表中观察到的真实交点,其他根仅为数学解,不符合你的业务场景。多项式参数对应关系可能出错
检查objective函数的定义是否为标准五次多项式形式:f(x) = a*x^5 + b*x^4 + c*x^3 + d*x^2 + e*x + f。如果参数顺序和你提取的a,b,c,d,e,f不匹配,会导致拟合参数错误,进而计算出错误的交点根。
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

