我有以下数据:
>>> x
array([ 3.08, 3.1 , 3.12, 3.14, 3.16, 3.18, 3.2 , 3.22, 3.24,
3.26, 3.28, 3.3 , 3.32, 3.34, 3.36, 3.38, 3.4 , 3.42,
3.44, 3.46, 3.48, 3.5 , 3.52, 3.54, 3.56, 3.58, 3.6 ,
3.62, 3.64, 3.66, 3.68])
>>> y
array([ 0.000857, 0.001182, 0.001619, 0.002113, 0.002702, 0.003351,
0.004062, 0.004754, 0.00546 , 0.006183, 0.006816, 0.007362,
0.007844, 0.008207, 0.008474, 0.008541, 0.008539, 0.008445,
0.008251, 0.007974, 0.007608, 0.007193, 0.006752, 0.006269,
0.005799, 0.005302, 0.004822, 0.004339, 0.00391 , 0.003481,
0.003095])
现在,我想用一个4次多项式来拟合这些数据。
>>> coefs = np.polynomial.polynomial.polyfit(x, y, 4)
>>> ffit = np.poly1d(coefs)
现在我为x值创建一个新的栅格来计算拟合函数ffit
:
>>> x_new = np.linspace(x[0], x[-1], num=len(x)*10)
当我使用以下命令进行所有绘图(数据集和拟合曲线)时:
>>> fig1 = plt.figure()
>>> ax1 = fig1.add_subplot(111)
>>> ax1.scatter(x, y, facecolors='None')
>>> ax1.plot(x_new, ffit(x_new))
>>> plt.show()
我得到了以下结果:
fitting_data.png
我期望的是拟合函数能够正确拟合(至少在数据的最大值附近)。我做错了什么?
2条答案
按热度按时间lsmd5eda1#
不幸的是,
np.polynomial.polynomial.polyfit
返回的系数顺序与np.polyfit
和np.polyval
(或者,如您使用np.poly1d
)的顺序相反。一般来说:
np.polynomial.polynomial.polyfit
返回系数[A, B, C]
到A + Bx + Cx^2 + ...
,而np.polyfit
返回:... + Ax^2 + Bx + C
.因此,如果要使用此函数组合,则必须颠倒系数的顺序,如下所示:
但是,the documentation明确指出要避免使用
np.polyfit
、np.polyval
和np.poly1d
,而只使用新的(更好的)包。只使用多项式包是最安全的:
或者,要创建多项式函数:
jv4diomz2#
请注意,您可以直接使用Polynomial类进行拟合并返回Polynomial示例。
p
使用缩放和平移的x值来保证数值稳定性。如果需要系数的常用形式,则需要遵循