函數插值法之牛頓插值法 python代碼實現

老規矩,原理什麼的就不寫了。

這裏比較詳細的講了原理,在這我只關注如何代碼實現。

直接貼代碼和實例演示,以下代碼基於python和numpy。

什麼是差商表?就用一張圖解釋。
差商表的構造

差商表是求近似值的前一步,那這裏實現求近似值嗎?

答案是:現在不。

因爲求近似值還要選擇節點、代入迭代公式,雖然代碼可以實現,但博主覺得“選擇節點、代入迭代公式”這個要用代碼實現,好像特別麻煩的樣子,因爲涉及決策的問題,所以還不如自己對照着代入更方便一點。

如果哪天突然覺得後者更麻煩,不排除用代碼實現近似值的求解。

構建差商表

首先

import numpy as np

以下便是我定義的函數:

def csb(x,f,j):
    f0=np.zeros((j+1,x.shape[0]))
    if type(f) is np.ndarray:
        f0[0]=f.copy()
    else:
        for i in range(x.shape[0]):
            f0[0,i]=f(x[i])
    for i in range(1,j+1):
        for k in range(i,j+1):
            f0[i,k]=(f0[i-1,k]-f0[i-1,k-1])/(x[k]-x[k-i])
    f1=np.vstack([x,f0])
    print('所求%d階差商表如下所示' % j,'\n',f1.T)
    return f1.T

參數說明

“x”是上圖中第一列“xk”的值組成的數組。

“f”是上圖中的第二列,輸入的可以是確定值,也可以是函數,後面會具體演示兩者有什麼區別。

“j”是最大階數,在上圖中,最大階數是3階,那麼“j”就是3。

實例運行

拿個實例運行一下,在這個實例中“f”是確定值。

x=np.array([-1,0,1,3])
f=np.array([4,-1,2,6])
csb(x,f,3)

得出以下結果:

所求3階差商表如下所示
[[-1. 4. 0. 0. 0. ]
[ 0. -1. -5. 0. 0. ]
[ 1. 2. 3. 4. 0. ]
[ 3. 6. 2. -0.33333333 -1.08333333]]

這個數組對照着下圖看就知道每一列數字代表着什麼意思。

三階差商表

在上個實例中,“f”是確定值。下面再運行一個實例,其中的“f”是函數。

x=np.array([-1,0,1,3])
f=lambda x:x**2
csb(x,f,3)

得出以下結果:

所求3階差商表如下所示
[[-1. 1. 0. 0. 0.]
[ 0. 0. -1. 0. 0.]
[ 1. 1. 1. 1. 0.]
[ 3. 9. 4. 1. 0.]]

求解近似值

待補充。

補充是不可能補充的,最近是不可能補充的,等忙完這一陣吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章