寻找数字序列的多项式公式
Finding a polynomial formula for sequence of numbers
我想知道 Python(或与此相关的任何语言)是否有一种方法,我可以在其中提供一个数字列表,然后我得到一个导致该列表的最小次数的多项式数字。
例如如果我提供序列 1,4,9,16
我应该返回 n**2
或 n^2
.
您可以使用 Python 中的 sympy
模块自行编写例程。 (这是 Python 的流行 third-party 模块。)此代码使用 Lagrange polynomial 的基本公式,即产生给定序列的最小次数的多项式。除了 y
值之外,此代码还允许您定义自己的 x
值:如果您未定义 x
值,则此例程将使用 1, 2, ...
.请注意,还有其他方法可以获得此多项式——我在 link.
中使用了维基百科中使用的公式
import sympy
x = sympy.symbols('x')
zeropoly = x - x
onepoly = zeropoly + 1
def lagrangepoly(yseq, xseq=None):
"""Build a Lagrange polynomial from a sequence of `y` values.
If no sequence of `x`s is given, use x = 1, 2, ..."""
if xseq is None:
xseq = list(range(1, len(yseq) + 1))
assert len(yseq) == len(xseq)
result = zeropoly
for j, (xj, yj) in enumerate(zip(xseq, yseq)):
# Build the j'th base polynomial
polyj = onepoly
for m, xm in enumerate(xseq):
if m != j:
polyj *= (x - xm) / (xj - xm)
# Add in the j'th polynomial
result += yj * polyj
return sympy.expand(result)
使用该例程,执行 print(lagrangepoly([1, 4, 9, 16]))
得到打印输出
x**2
这是 Python 表示法中的 x^2
。
我想知道 Python(或与此相关的任何语言)是否有一种方法,我可以在其中提供一个数字列表,然后我得到一个导致该列表的最小次数的多项式数字。
例如如果我提供序列 1,4,9,16
我应该返回 n**2
或 n^2
.
您可以使用 Python 中的 sympy
模块自行编写例程。 (这是 Python 的流行 third-party 模块。)此代码使用 Lagrange polynomial 的基本公式,即产生给定序列的最小次数的多项式。除了 y
值之外,此代码还允许您定义自己的 x
值:如果您未定义 x
值,则此例程将使用 1, 2, ...
.请注意,还有其他方法可以获得此多项式——我在 link.
import sympy
x = sympy.symbols('x')
zeropoly = x - x
onepoly = zeropoly + 1
def lagrangepoly(yseq, xseq=None):
"""Build a Lagrange polynomial from a sequence of `y` values.
If no sequence of `x`s is given, use x = 1, 2, ..."""
if xseq is None:
xseq = list(range(1, len(yseq) + 1))
assert len(yseq) == len(xseq)
result = zeropoly
for j, (xj, yj) in enumerate(zip(xseq, yseq)):
# Build the j'th base polynomial
polyj = onepoly
for m, xm in enumerate(xseq):
if m != j:
polyj *= (x - xm) / (xj - xm)
# Add in the j'th polynomial
result += yj * polyj
return sympy.expand(result)
使用该例程,执行 print(lagrangepoly([1, 4, 9, 16]))
得到打印输出
x**2
这是 Python 表示法中的 x^2
。