拉格朗日插值Python代碼實現


1. 數學原理

對某個多項式函數有已知的k+1個點,假設任意兩個不同的都互不相同,那么應用拉格朗日插值公式所得到的拉格朗日插值多項式為:

  其中每個lj(x)為拉格朗日基本多項式(或稱插值基函數),其表達式為:

 

2. 輕量級實現

 利用

直接編寫程序,可以直接插值,並且得到對應的函數值。但是不能得到系數,也不能對其進行各項運算。

def h(x,y,a):
    ans=0.0 
    for i in range(len(y)):
        t=y[i]
        for j in range(len(y)):
            if i !=j:
                t*=(a-x[j])/(x[i]-x[j])
        ans +=t
    return ans
x=[1,0]
y=[0,2]
print(h(x,y,2))

 上述代碼中,h(x,y,a)就是插值函數,直接調用就行。參數說明如下:

  • x,y分別是對應點的x值和y值。具體詳解下解釋。
  • a為想要取得的函數的值。

事實上,最簡單的拉格朗日插值就是兩點式得到的一條直線。

例如:

p點(1,0)q點(0,2)

這兩個點決定了一條直線,所以當x=2的時候,y應該是-2

該代碼就是利用這兩個點插值,然后a作為x=2調用函數驗證的。

3. 引用庫

3.1 庫的安裝

主要依賴與 scipy。官方網站見:https://www.scipy.org/install.html

安裝的方法很簡單,就是使用pip install scipy 如果失敗,則將whl文件下載到本地再利用命令進行安裝。

可能如果沒有安裝numpy

3.2 庫的使用

from scipy.interplotate import lagrange

直接調用lagrange(x,y)這個函數即可,返回 一個對象。

參數x,y分別是對應各個點的x值和y值。

例如:(1,2) (3,5) (5,9)這三個點,作為函數輸入應該這么寫:

x=[1,3,5]

y =[2, 5, 9]

a=lagrange(x,y)

直接輸出該對象,就能看到插值的函數。

利用該對象,能得到很多特性。具體參見:https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.poly1d.html

  • a.order得到階
  • a[]得到系數
  • a()得到對應函數值
  • 此外可以對其進行加減乘除運算

3.3 代碼實現

from scipy.interpolate import lagrange
x=[1,2,3,4,7]
y=[5,7,10,3,9]
a=lagrange(x,y)
print(a)
print(a(1),a(2),a(3))
print(a[0],a[2],a[3])

結果是:

<class 'numpy.lib.polynomial.poly1d'> 4
            4            3              2
0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13
5.0 7.0 10.0
28.1333333333 30.6527777778 -7.30555555556

解釋:

<class 'numpy.lib.polynomial.poly1d'> 4

這一行是輸出a的類型,以及最高次冪。

              4            3              2
0.5472 x - 7.306 x + 30.65 x - 47.03 x + 28.13

第二行和第三行就是插值的結果,顯示出的函數。

第二行的數字是對應下午的x的冪,如果對應不齊,則是排版問題。

5.0 7.0 10.0

第四行是代入的x值,得到的結果。

也就是說,用小括號f(x)的這種形式,可以直接得到計算結果。

28.1333333333 30.6527777778 -7.30555555556

最后一行是提取出的系數。也就是說,可以用f[a]這種形式,來提取出來對應冪的系數。

本文已在版權印備案,如需轉載請訪問版權印27723140


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM