【问题标题】:Use fixed points with the NumPy Polynomial module在 NumPy 多项式模块中使用定点
【发布时间】:2018-03-15 16:18:05
【问题描述】:

我正在尝试使用随 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')

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

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

【问题讨论】:

  • 您是否希望多项式与给定数据点的值完全匹配,即 P(xx) = y for xx in x ?
  • @ma3oun 拟合需要包含每个数据点。
  • NumPy 1.4?新的?大约十年前,大约 2010 年或 2009 年底(Github 发布日期为 2009 年 12 月 27 日)。
  • 这个数据看起来不像多项式是一个合理的模型。
  • 如果您希望曲线通过每个数据点,您可能不需要拟合,而是需要插值:docs.scipy.org/doc/scipy/reference/tutorial/interpolate.html

标签: python numpy polynomial-math


【解决方案1】:

您想要的称为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]

请记住,这会导致很多涟漪...

【讨论】:

  • 也许还会在您的示例中添加三次插值,这可能看起来更像 OP 所期望的。
  • 这种方法适用于中间点,但开头和结尾的拟合很差。
  • 你不能同时拥有它。您的模型不是完美的多项式拟合。如果您想要在完美拟合您的数据点并且最小化欧几里得距离之间的东西,您需要编写一个自定义成本函数,这将成为一个优化问题......无论如何,它不会改变您的现实不是完美多项式拟合的数据。
猜你喜欢
  • 2015-12-17
  • 1970-01-01
  • 2017-09-30
  • 2021-07-24
  • 2020-05-28
  • 2012-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多