python如何正确完成拉格朗日插值

jaxagkaj  于 2022-12-10  发布在  Python
关注(0)|答案(1)|浏览(130)

我被要求使用拉格朗日插值法来画一条穿过图上几个点的线(scipy.interpolate.lagrange被禁止)。
但是我的代码似乎不能给予正确的结果,坦白说,我甚至不知道哪一部分是错的。
如果我被要求求出直线上某个特定点的值,我应该如何调整代码来实现这一点呢?
第一个图像是预期的输出。第二个是我的代码的输出。
有人能告诉我怎么改正吗?

源代码

import numpy as np
import matplotlib.pyplot as plt

m = 4
X = np.array([0, 1, 1.5, 2, 3])
Y = np.array([2, 8, 12, 10, 20])

def p(x): 
    px = 0;
    for j in range(m+1):
        Lmj = 1
        for k in range(m+1):
            if k != j:
                Lmj *= (x - X[k])/(X[j] - X[k])
            px += Y[j] * Lmj;
        return px

plt.scatter(X, Y)
Xinterp = np.linspace(min(X), max(X), 100)
plt.plot(Xinterp, p(Xinterp))
plt.show()

另外,plt.show()行是必要的吗?根据我的讲师的笔记,代码中没有这一行,但仍然可以显示图形。但在我复制的源代码中,我需要添加这一行来显示图形。
非常感谢您注意到这个问题。

abithluo

abithluo1#

1.拉格朗日插值法从一组给定的点生成多项式。
1.然后,您可以使用此多项式来找出直线上特定点的值。
1.如果plt.show在Jupyter笔记本电脑(或类似设备)中运行代码,则不需要www.example.com(),但如果通过终端运行,则需要。
下面是一些python代码,它可以根据点集生成numpy.polynomial

import numpy as np
from numpy.polynomial import Polynomial
import matplotlib.pyplot as plt

X = np.array([0, 1, 1.5, 2, 3])
Y = np.array([2, 8, 12, 10, 20])

n = len(X)
poly = Polynomial(np.zeros(n))

for j in range(n):
    k = [k for k in range(n) if k != j]
    roots = -1 * X[k]

    sub_poly = Polynomial.fromroots(X[k])
    scale = Y[j] / np.prod(X[j] - X[k])
    sub_poly.coef *= scale

    poly.coef += sub_poly.coef

然后您可以通过以下方式绘制:

plt.scatter(X, Y)
Xinterp = np.linspace(min(X), max(X), 100)
plt.plot(Xinterp, poly(Xinterp))
plt.show()

或查找特定值:

print(poly(0.5))

请参阅此处了解更多信息:https://learn.64bitdragon.com/articles/computer-science/numerical-analysis/lagrange-interpolation
充分披露:我是这篇文章的作者。

相关问题