標籤:org 3.3 對象 2.0 應用 特性 網站 官方網站 class
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 ansx=[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 lagrangex=[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]這種形式,來提取出來對應冪的係數。
拉格朗日插值Python代碼實現