数值分析之牛顿插值方法

数值分析之牛顿插值方法详解

数据点通用格式

x 0 x 1 x 2 x n
y 0 y 1 y 2 y n

算法描述

数据点有 n + 1
设置常系数项 n + 1 个,即:

[ a 0 , a 1 , a 2 , , a n 2 , a n 1 , a n ]

设置系数函数 P n ( x ) ,如下:
P n ( x ) = a 0 + ( x x 0 ) a 1 + ( x x 0 ) ( x x 2 ) a 2 + + ( x x 0 ) ( x x 1 ) ( x x n 1 ) a n

利用合并同类项找出规律:
假设 n = 3 ,则 P 3 ( x ) 的表达式如下:
P 3 ( x ) = a 0 + ( x x 0 ) a 1 + ( x x 0 ) ( x x 1 ) a 2 + ( x x 0 ) ( x x 1 ) ( x x 2 ) a 3 = a 0 + ( x x 0 ) { a 1 + ( x x 1 ) [ a 2 + ( x x 2 ) a 3 ] } .

于是:假设
P 0 ( x ) = a 3
P 1 ( x ) = a 2 + ( x x 2 ) P 0 ( x )
P 2 ( x ) = a 1 + ( x x 1 ) P 1 ( x )
P 3 ( x ) = a 0 + ( x x 0 ) P 2 ( x )

将其推广到一般情况:
P 0 ( x ) = a n
P 1 ( x ) = a n 1 + ( x x n 1 ) P 0 ( x )
P 2 ( x ) = a n 2 + ( x x n 2 ) P 1 ( x )
P 3 ( x ) = a n 3 + ( x x n 3 ) P 2 ( x )
P 4 ( x ) = a n 4 + ( x x n 4 ) P 3 ( x )

P k ( x ) = a n k + ( x x n k ) P k 1 ( x )

P n 2 ( x ) = a 2 + ( x x 2 ) P n 3 ( x )
P n 1 ( x ) = a 1 + ( x x 1 ) P n 2 ( x )
P n ( x ) = a 0 + ( x x 0 ) P n 1 ( x )
充分利用公式: y i = P n ( x i ) ,使得多项式穿过每一个点,利用数据,最终求得每一个常系数 a i
y 0 = P n ( x 0 ) = a 0
y 1 = P n ( x 1 ) = a 0 + ( x 1 x 0 ) P n 1 ( x 1 ) = a 0 + ( x 1 x 0 ) ( a 1 + ( x 1 x 1 ) P n 2 ( x 1 ) )
y 2 = P n ( x 2 ) = a 0 + ( x 2 x 0 ) a 1 + ( x 2 x 0 ) ( x 2 x 1 ) a 2

y n 2 = P n ( x n 2 ) = a 0 + ( x n 2 x 0 ) a 1 + + ( x n 2 x 0 ) ( x n 2 x 1 ) ( x n 2 x n 3 ) a n 2
y n 1 = P n ( x n 1 ) = a 0 + ( x n 1 x 0 ) a 1 + + ( x n 1 x 0 ) ( x n 1 x 1 ) ( x n 1 x n 2 ) a n 1
y n = P n ( x n ) = a 0 + ( x n x 0 ) a 1 + + ( x n x 0 ) ( x n x 1 ) ( x n x n 1 ) a n
知识点补充Introducing the divided differences
y i = y i y 0 x i x 0 i = 1 , 2 , , n
2 y i = y i y 1 x i x 1 i = 2 , 3 , , n
3 y i = 2 y i 2 y 2 x i x 2 i = 3 , 4 , , n

n y n = n 1 y n n 1 y n 1 x n x n 1 n
求常系数 a i
a 0 = y 0 a 1 = y 1 a 2 = 2 y 2 a n = n y n
列表分析:当 n = 4

x 0 y 0
x 1 y 1 y 1
x 2 y 2 y 2 2 y 2
x 3 y 3 y 3 2 y 3 3 y 3
x 4 y 4 y 4 2 y 4 3 y 4 4 y 4

牛顿插值算法Python代码

import numpy as np
def coeffts(xData,yData):
    m = len(xData)
    Table = np.zeros((m,m))
    Table[:,0] = np.array(yData)
    for k in range(1,m):
        for i in range(k,m):
            Table[i,k] = (Table[i,k-1]-Table[k-1,k-1])/(xData[i]-xData[k-1])
    return np.diag(Table)


def evalPoly(a,xData,x):
    n = len(xData) - 1 # Degree of polynomial
    p = a[n]
    for k in range(1,n+1):
        p = a[n-k] + (x -xData[n-k])*p
    return p 

案例分析

import numpy as np
xData = np.array([0.15,2.3,3.15,4.85,6.25,7.95])
yData = np.array([4.79867,4.49013,4.2243,3.47313,2.66674,1.51909])
a = coeffts(xData,yData)
print(" x    yInterp")
print('-'*20)
for x in np.arange(0.0,8.1,0.5):
    y = evalPoly(a,xData,x)
    print('{:3.1f} {:9.5f}'.format(x,y))

插值结果:

猜你喜欢

转载自www.cnblogs.com/brightyuxl/p/9062184.html
今日推荐