簡體   English   中英

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

[英]How to complete Lagrange Interpolation correctly by python

我被要求使用拉格朗日插值法繪制一條穿過圖形上幾個點的線(禁止使用 scipy.interpolate.lagrange)。

但似乎我的代碼不能給出正確的結果。 說實話,我什至不知道哪一部分是錯的。

如果我被要求找到線上特定點的值,我應該如何調整代碼來做到這一點?

第一張圖片是預期的 output。第二張圖片是我的代碼中的 output。

有人可以告訴我如何糾正嗎?

預期產出

我的源代碼輸出

源代碼

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() 行是否必要? 從我講師的筆記來看,代碼沒有這一行,但仍然可以顯示圖形。 但是在我復制的源代碼版本中,我需要添加這一行來顯示圖表。

非常感謝您注意到這個問題。

  1. 拉格朗日插值從一組給定的點生成多項式。
  2. 然后,您可以使用此多項式來查找線上特定點的值。
  3. 如果您在 Jupyter notebook(或類似筆記本)中運行代碼,則 plt.show() 不是必需的,但如果通過終端運行則需要 plt.show() 。

這是一些 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

然后您可以通過以下方式撥打 plot:

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

完全披露:我是這篇文章的作者。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM