以下代码接受单个值 x 和点列表 X,并通过给定 x 值处的点列表确定拉格朗日多项式的值。
def chunkIt(seq, num):
avg = len(seq) / float(num)
out = []
last = 0.0
while last < len(seq):
out.append(seq[int(last):int(last + avg)])
last += avg
return out
def product(list):
p = 1
for i in list:
p *= i
return p
def Lagrange(x,X):
T = np.zeros((2,len(X)))
list = []
for i in range(len(X)):
for j in range(len(X)):
if i != j:
list.append((x-X[j][0])/(X[i][0]-X[j][0]))
p = []
for i in chunkIt(list,len(X)):
p.append(product(i))
for i in range(len(X)):
T[0][i] = p[i]
T[1][i] = X[i][1]
list2 = []
for i in range(len(X)):
list2.append(T[0][i]*T[1][i])
return sum(list2)
例如:
x, X = 3, [[0,0],[1,1],[2,0.5]]
给出的值为 -1.5。
如何修改此代码以通过点列表确定多项式的方程式?即,如果我将 x = 'x'
作为输入,我希望它返回 -0.75x**2 + 1.75x
[对于给定的示例]
最佳答案
import numpy as np
from pypoly import Polynomial
x, X = 3, [[0, 0], [1, 1], [2, 0.5]]
order = len(X)
这是所得拉格朗日多项式的阶数。对于您的示例,阶数是 3。
equations = np.array([[point[0] ** i for i in range(order)] for point in X])
values = np.array([point[1] for point in X])
coefficients = np.linalg.solve(equations, values)
这通过将点代入一般多项式来建立联立方程。对于 3 阶,一般多项式为:
a * x ** 2 + b * x ** 1 + c * x ** 0 = y
它求解联立方程组以找到系数。对于订单 3,我们得到 a、b、c 的值。
print 'coefficients', list(coefficients)
coefficients [0.0, 1.75, -0.75]
p = Polynomial(*coefficients)
在这里,* 运算符将类似数组的元素拆分为单个值,作为参数传递给 Polynomial()。
print p
1.75 * X - 0.75 * X**2
print p(x)
-1.5
安装PyPolynomial使用 pip,使用:
对于 Python 2:
pip install PyPolynomial
对于 Python 3:
pip3 install PyPolynomial
关于拉格朗日插值的Python代码——确定多项式的方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44471236/