Python 确定勒让德系数后获得勒让德多项式形式

Python 确定勒让德系数后获得勒让德多项式形式,python,numpy,Python,Numpy,我已经获得了最适合我的数据的勒让德多项式的系数。现在我需要在数据的每个时间步确定多项式的值。我需要这样做,以便从数据中减去拟合。我已经看过Legendre模块的文档,我不确定我是否只是不了解我的选项,或者是否没有一个本地工具来满足我的需求。如果我的数据点是均匀分布的,那么linspace将是一个不错的选择,但这里的情况并非如此。有没有人对尝试什么有什么建议 对于那些希望获得最少工作代码示例的人,只需使用一个随机数组,获取系数,然后告诉我您将如何继续。价值观本身并不重要。这就是我在这里要问的技术。

我已经获得了最适合我的数据的勒让德多项式的系数。现在我需要在数据的每个时间步确定多项式的值。我需要这样做,以便从数据中减去拟合。我已经看过Legendre模块的文档,我不确定我是否只是不了解我的选项,或者是否没有一个本地工具来满足我的需求。如果我的数据点是均匀分布的,那么linspace将是一个不错的选择,但这里的情况并非如此。有没有人对尝试什么有什么建议


对于那些希望获得最少工作代码示例的人,只需使用一个随机数组,获取系数,然后告诉我您将如何继续。价值观本身并不重要。这就是我在这里要问的技术。谢谢。

一旦你有了一个函数,你就可以为时间点生成一个numpy数组:

>>> import numpy as np
>>> timepoints = [1,3,7,15,16,17,19]
>>> myarray = np.array(timepoints)
>>> def mypolynomial(bins, pfinal):   #pfinal is just the estimate of the final array (i'll do quadratic)
...     a,b,c = pfinal  # obviously, for a*x^2 + b*x + c
...     return (a*bins**2) + b*bins + c
>>> mypolynomial(myarray, (1,1,0))
array([  2,  12,  56, 240, 272, 306, 380])
它会为numpy数组中的每个时间点自动计算它

现在你所要做的就是重写MyPolymone,从一个简单的二次型到一个合适的Legendre多项式。将函数视为正在计算浮点以返回值,当在numpy数组上调用时,它将自动为每个值计算该函数

编辑: 假设我想把它推广到所有标准多项式:

>>> import numpy as np
>>> timepoints = [1,3,7,15,16,17,19]
>>> myarray = np.array(timepoints)
>>> def mypolynomial(bins, pfinal):   #pfinal is just the estimate of the final array (i'll do quadratic)
>>>     hist = np.zeros((1, len(myarray)))    # define blank return
...     for i in range(len(pfinal)):
...         # fixed a typo here, was pfinal[-i] which would give -0 rather than -1, since negative indexing starts at -1, not -0
...         const = pfinal[-i-1]    # negative index to go from 0 exponent to highest exponent
...         hist += const*(bins**i)
...     return hist
>>> mypolynomial(myarray, (1,1,0))
array([  2,  12,  56, 240, 272, 306, 380])
编辑2:排版修正

编辑3:

@艾哈迈德说荷马规则有利于数值稳定性是完全正确的。这方面的执行情况如下:

>>> def horner(coeffs, x):
...     acc = 0
...     for c in coeffs:
...         acc = acc * x + c
...     return acc
>>> horner((1,1,0), myarray)
array([  2,  12,  56, 240, 272, 306, 380])
根据此处的代码,稍微修改以保持与以前相同的参数顺序:

一旦有了函数,就可以为时间点生成一个numpy数组:

>>> import numpy as np
>>> timepoints = [1,3,7,15,16,17,19]
>>> myarray = np.array(timepoints)
>>> def mypolynomial(bins, pfinal):   #pfinal is just the estimate of the final array (i'll do quadratic)
...     a,b,c = pfinal  # obviously, for a*x^2 + b*x + c
...     return (a*bins**2) + b*bins + c
>>> mypolynomial(myarray, (1,1,0))
array([  2,  12,  56, 240, 272, 306, 380])
它会为numpy数组中的每个时间点自动计算它

现在你所要做的就是重写MyPolymone,从一个简单的二次型到一个合适的Legendre多项式。将函数视为正在计算浮点以返回值,当在numpy数组上调用时,它将自动为每个值计算该函数

编辑: 假设我想把它推广到所有标准多项式:

>>> import numpy as np
>>> timepoints = [1,3,7,15,16,17,19]
>>> myarray = np.array(timepoints)
>>> def mypolynomial(bins, pfinal):   #pfinal is just the estimate of the final array (i'll do quadratic)
>>>     hist = np.zeros((1, len(myarray)))    # define blank return
...     for i in range(len(pfinal)):
...         # fixed a typo here, was pfinal[-i] which would give -0 rather than -1, since negative indexing starts at -1, not -0
...         const = pfinal[-i-1]    # negative index to go from 0 exponent to highest exponent
...         hist += const*(bins**i)
...     return hist
>>> mypolynomial(myarray, (1,1,0))
array([  2,  12,  56, 240, 272, 306, 380])
编辑2:排版修正

编辑3:

@艾哈迈德说荷马规则有利于数值稳定性是完全正确的。这方面的执行情况如下:

>>> def horner(coeffs, x):
...     acc = 0
...     for c in coeffs:
...         acc = acc * x + c
...     return acc
>>> horner((1,1,0), myarray)
array([  2,  12,  56, 240, 272, 306, 380])
根据此处的代码,稍微修改以保持与以前相同的参数顺序:

当您使用一个好的库来拟合多项式时,根据我的经验,库通常会有一个函数来计算它们。所以我认为知道如何生成这些系数是很有用的

在下面的示例中,我在numpy中使用了两个函数,这使得拟合和计算勒让德多项式变得非常简单,而无需调用霍纳规则或自己记账。(尽管我确实使用霍纳规则生成了一些示例数据。)

这是一个完整的例子,我从一个已知的多项式生成一些稀疏数据,将一个勒让德多项式拟合到它,在密集的网格上计算该多项式,然后绘制。请注意,由于numpy库完成了所有的繁重工作,装配和评估零件需要三行

它生成以下图形:


当你使用一个很好的库来拟合多项式时,根据我的经验,库通常会有一个函数来计算它们。所以我认为知道如何生成这些系数是很有用的

在下面的示例中,我在numpy中使用了两个函数,这使得拟合和计算勒让德多项式变得非常简单,而无需调用霍纳规则或自己记账。(尽管我确实使用霍纳规则生成了一些示例数据。)

这是一个完整的例子,我从一个已知的多项式生成一些稀疏数据,将一个勒让德多项式拟合到它,在密集的网格上计算该多项式,然后绘制。请注意,由于numpy库完成了所有的繁重工作,装配和评估零件需要三行

它生成以下图形:


简化艾哈迈德的例子

In [1]: from numpy.polynomial import Polynomial, Legendre

In [2]: p = Polynomial([0.5, 0.3, 0.1])

In [3]: x = np.random.rand(10) * 10

In [4]: y = p(x)

In [5]: pfit = Legendre.fit(x, y, 2)

In [6]: plot(*pfit.linspace())
Out[6]: [<matplotlib.lines.Line2D at 0x7f815364f310>]

In [7]: plot(x, y, 'o')
Out[7]: [<matplotlib.lines.Line2D at 0x7f81535d8bd0>]

但这并不推荐。

为了简化艾哈迈德的例子

In [1]: from numpy.polynomial import Polynomial, Legendre

In [2]: p = Polynomial([0.5, 0.3, 0.1])

In [3]: x = np.random.rand(10) * 10

In [4]: y = p(x)

In [5]: pfit = Legendre.fit(x, y, 2)

In [6]: plot(*pfit.linspace())
Out[6]: [<matplotlib.lines.Line2D at 0x7f815364f310>]

In [7]: plot(x, y, 'o')
Out[7]: [<matplotlib.lines.Line2D at 0x7f81535d8bd0>]

但不建议这样做。

您可以编写匿名函数,这取决于具体情况。您可以动态地定义参数的数量,然后慢慢地改进如何定义多项式。我将添加编辑。添加编辑。这将是一个在有限范围内动态定义数学函数的例子。我将对此进行快速测试,但这可能是公认的答案。这是直截了当和透明的,我在Python职业生涯的这个阶段需要这两样东西。多谢!确保您使用该工具获得良好的数值稳定性。您永远不希望将多项式计算为
a+b*x+c*x**2+…
。霍纳说
a+x*(b+x*(c+…)
。当然使用霍纳法则。而且总是有用的。在什么样的框架内?Print dir(变量),然后它应该告诉您如何返回元组或列表。您可以编写匿名函数,这取决于。您可以动态地定义参数的数量,然后慢慢地改进如何定义多项式。我将添加编辑。添加编辑。这将是一个在有限范围内动态定义数学函数的例子。我将对此进行快速测试,但这可能是公认的答案。这是直截了当和透明的,我在Python职业生涯的这个阶段需要这两样东西。多谢!确保您使用该工具获得良好的数值稳定性。您永远不希望将多项式计算为
a+b*x+c*x**2+…
。霍纳说
a+x*(b+x*(c+…)
。当然使用霍纳法则。而且总是有用的。在什么样的框架内?Print dir(变量),然后它应该告诉您如何返回元组或列表