【问题标题】:Python code for Lagrange interpolation - determining the equation of the polynomial用于拉格朗日插值的 Python 代码 - 确定多项式的方程
【发布时间】:2017-06-10 08:31:49
【问题描述】:

以下代码采用单个值 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 [对于给定的示例]

【问题讨论】:

  • 也许这是一个开始的地方:sympy.org

标签: python interpolation


【解决方案1】:
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)

系数 [0.0, 1.75, -0.75]

p = Polynomial(*coefficients)

这里,* 运算符将类似数组的元素拆分为单独的值,以作为参数传递给 Polynomial()。

print p

1.75 * X - 0.75 * X**2

print p(x)

-1.5

要使用 pip 安装 PyPolynomial,请使用:

对于 Python 2:

pip install PyPolynomial

对于 Python 3:

pip3 install PyPolynomial

【讨论】:

    猜你喜欢
    • 2015-01-20
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-09
    • 1970-01-01
    相关资源
    最近更新 更多