使用NumPy多项式模块的固定点

时间:2018-03-15 16:18:06

标签: python numpy polynomial-math

我正在尝试使用随NumPy v1.4发布的Polynomial模块来拟合下面示例中给出的数据。

import matplotlib.pyplot as plt
import numpy as np

# data points to fit
x = np.array([11844.6, 20204.7, 24964.8, 29724.9, 34485.0, 39245.1, 44005.2,
              48765.3, 53525.4, 58285.5, 58968.2])

y = np.array([4.2, 4.086, 4.048, 3.984, 3.949, 3.909, 3.869, 3.802, 3.723,
              3.531, 3.0])

# polynomial fit
xx = np.linspace(min(x), max(x), 500)
c = np.polynomial.polynomial.polyfit(x, y, 5)
yfit = np.polynomial.polynomial.polyval(xx, c)

# plot
plt.ion()
plt.close('all')

plt.figure()
plt.plot(x, y, 'o-', alpha=0.4, label='data')
plt.plot(xx, yfit, label='fit')
plt.xlabel('x values')
plt.ylabel('y values')
plt.legend(loc='best')

这将生成以下图表,其中蓝点是数据,橙色线是示例中的多项式拟合。 polynomial fit

我已经尝试了多项式的不同度数但是不能很好地拟合数据点。有没有办法使用NumPy中的多项式模块开发具有固定数据点的多项式拟合?

1 个答案:

答案 0 :(得分:0)

您想要的是Lagrange interpolation polynomial。 Scipy提供必要的function

import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import lagrange

# data points to fit
x = np.array([11844.6, 20204.7, 24964.8, 29724.9, 34485.0, 39245.1, 44005.2,
          48765.3, 53525.4, 58285.5, 58968.2])

y = np.array([4.2, 4.086, 4.048, 3.984, 3.949, 3.909, 3.869, 3.802, 3.723,
          3.531, 3.0])

# polynomial fit
xx = np.linspace(min(x), max(x), 500)

c=lagrange(x,y)
yfit = c(xx)

dataPointsDiff = c(x) - y
print(dataPointsDiff)
# plot
plt.ion()
plt.close('all')

plt.figure()  
plt.plot(x, y, 'o-', alpha=0.4, label='data')
plt.plot(xx, yfit, label='fit')
plt.xlabel('x values')
plt.ylabel('y values')
plt.legend(loc='best')
plt.show()
  

[ - 4.49746906e-11 5.29905009e-11 5.50018697e-10 2.20772201e-09     6.39017905e-09 1.55495092e-08 3.40470758e-08 6.83516173e-08     1.27306250e-07 2.27304275e-07 2.46438276e-07]

Plot

请记住,这会产生很多涟漪...