拉格朗日插值的Python代码——确定多项式的方程

标签 python interpolation

以下代码接受单个值 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/

相关文章:

python - 用于创建完全定制的 UI 的 GUI 工具包?如果我想要完全非操作系统 native 外观,您会建议使用哪个工具包?

python - 谷歌应用引擎 blob 存储创建

python - 如何修复 ValueError : not enough values to unpack (expected 2, 得到 1)

javascript - 如何根据离散步骤插值进度?

python - 如何在 python 中平滑地转换颜色?

Matlab 重复 x 轴进行插值

Python - pickle.load() 采用一个位置参数(给定 2 个)

python - django 渲染模板不存在

c - 二维矩阵旋转与双线性插值

python - 如何使用线性插值扩展数组