??插值,不論在數(shù)學(xué)中的數(shù)值分析中,還是在我們實(shí)際生產(chǎn)生活中,都不難發(fā)現(xiàn)它的身影,比如造船業(yè)和飛機(jī)制造業(yè)中的三次樣條曲線。那么,什么是插值呢?我們可以先看一下插值的定義,如下:
?? 插值的定義無疑是清楚明了的,而在眾多的數(shù)學(xué)函數(shù)中,多項(xiàng)式無疑是最簡單,最常見的函數(shù),關(guān)于它的理論研究也最為透徹。因此,我們可以不妨先考慮利用多項(xiàng)式來進(jìn)行插值。那么,這樣的多項(xiàng)式是否總是存在呢?答案是肯定的,因?yàn)槲覀冇腥缦露ɡ恚?/p>
??有了以上定理,我們可以放心地使用多項(xiàng)式進(jìn)行插值,同時,通過上述定理,我們可以用歸納法來構(gòu)造此多項(xiàng)式,但是,這樣的方法難免復(fù)雜麻煩。于是,天才的法國數(shù)學(xué)家拉格朗日(Lagrange)創(chuàng)造性地發(fā)明了一種實(shí)用的插值多項(xiàng)式方法來解決這個問題,那么,他的方法是怎么樣的?
??以上就是拉格朗日插值多項(xiàng)式的理論介紹部分,接下來我們就要用Python中的Sympy模塊來實(shí)現(xiàn)拉格朗日插值多項(xiàng)式啦~~
??實(shí)現(xiàn)拉格朗日插值多項(xiàng)式的Python代碼如下:
from sympy import *
def Lagrange_interpolation(keys, values):
x = symbols('x')
t = len(keys)
ploy = []
for i in range(t):
lst = ['((x-'+str(_)+')/('+str(keys[i])+'-'+str(_)+'))' for _ in keys if _ != keys[i]]
item = '*'.join(lst)
ploy.append(str(values[i])+'*'+item)
ploy = '+'.join(ploy)
return factor(expand(ploy))
def main():
#example 1, interpolation a line
x_1 = [1,2]
y_1 = [3,5]
if len(x_1) != len(y_1):
print('The lengths of two list are not equal!')
else:
print('Lagrange_interpolation polynomials is:')
print(Lagrange_interpolation(x_1,y_1))
#example 2, interpolation a parabola
x_2 = [0,2,3]
y_2 = [1,2,4]
if len(x_2) != len(y_2):
print('The lengths of two list are not equal!')
else:
print('Lagrange_interpolation polynomials is:')
print(Lagrange_interpolation(x_2,y_2))
#example 3
x_3 = [0,1,2,3]
y_3 = [2,1,0,-1]
if len(x_3) != len(y_3):
print('The lengths of two list are not equal!')
else:
print('Lagrange_interpolation polynomials is:')
print(Lagrange_interpolation(x_3,y_3))
main()
函數(shù)Lagrange_interpolation()具體實(shí)現(xiàn)了拉格朗日插值多項(xiàng)式,參數(shù)(keys, values)為list形式的點(diǎn)對,在main()函數(shù)中舉了三個Lagrange_interpolation()函數(shù)的應(yīng)用實(shí)例,一個是插值兩個點(diǎn),即直線,一個是插值三個點(diǎn),即拋物線,一個是插值四個點(diǎn),但結(jié)果卻是一次多項(xiàng)式。該程序的運(yùn)行結(jié)果如下:
??接下來,我們將介紹一個拉格朗日插值多項(xiàng)式的應(yīng)用,即求
的求和公式,其中$x,k$為正整數(shù)。分析如下:
??首先,該求和公式應(yīng)當(dāng)是一個至多為k+1次的關(guān)于x的多項(xiàng)式。然后,我們可以通過取k+2個不同的點(diǎn),利用拉格朗日插值多項(xiàng)式的辦法來求解,這k+2個不同的點(diǎn)的橫坐標(biāo)可以取x=1,2,...,k+2,在求出其對應(yīng)的縱坐標(biāo)的值。
??以下代碼分別求出k=1,2,...,50的求和公式,并將其插入到Redis中。
from sympy import *
import redis
def Lagrange_interpolation(keys, values):
x = symbols('x')
t = len(keys)
ploy = []
for i in range(t):
lst = ['((x-'+str(_)+')/('+str(keys[i])+'-'+str(_)+'))' for _ in keys if _ != keys[i]]
item = '*'.join(lst)
ploy.append(str(values[i])+'*'+item)
ploy = '+'.join(ploy)
return factor(expand(ploy))
def degree_of_sum(k):
x_list, y_list = [], []
degree = k # degree=k in expression of 1^k+2^k+...+x^{k}
cul_sum = 0
for i in range(1,degree+3):
x_list.append(i)
cul_sum += i**degree
y_list.append(cul_sum)
return Lagrange_interpolation(x_list,y_list)
def main():
r = redis.Redis(host='localhost', port=6379,db=0)
for k in range(1,51):
expression = str(degree_of_sum(k))
r.hset('sum_%s'%k,'degree',str(k))
r.hset('sum_%s'%k,'expression',expression)
print('Degree of %d inserted!'%k)
main()
運(yùn)行以上程序,結(jié)果如下:
在Redis中的儲存結(jié)果如下:
我們可以具體查看當(dāng)$k=2$時的求和公式,如下:
??這樣我們就介紹完了一個拉格朗日插值多項(xiàng)式的應(yīng)用了??戳松厦娴慕榻B,聰明又機(jī)智的你是否能想到更多拉格朗日插值多項(xiàng)式的應(yīng)用呢?歡迎大家交流哦~~
??新的一年,新的氣象,就從這一篇開始~~