關於拉格朗日和內維爾插值算法的python實現


系統:windows7  編輯器:eclipse+pydev  環境:python 3.4

先是逐步插值,主體十分簡單,關鍵在於算法部分,我運用了二維數組的數據結構來存儲每次迭代后的新值。角標的循環初看可能有些復雜,自己動手走一遍就會很清楚啦

 1 #coding=gbk
 2 '''
 3 Created on 2014-8-31  4 
 5 @author: Administrator  6 '''
 7 
 8 def Neville(xt,m,n,x):  9     for i in range(1,n): 10         for j in range(1,n): 11             w[i-j][i]=(x-xt[i-j])/(xt[i]-xt[i-j]) 12             m[i][j]=m[i-1][j-1]+w[i-j][i]*(m[i][j-1]-m[i-1][j-1]) 13     for i in range(n): 14         for j in range(0,i+1): 15             if j%n==0: 16                 print("\n") 17             print(' %f' %m[i][j]) 18 
19 n = int(input('插入節點個數:')) 20 x = float(input('輸入x的值:')) 21 m = [[0 for i in range(n)] for j in range(n)] #創建n*n矩陣 22 w = [[0 for i in range(n)] for j in range(n)] 23 xt = [0]*n 24 for i in range(n): 25     m[i][0] = float(input('插入第%d個y值:' %(i+1))) 26 for i in range(n): 27     xt[i] = float(input('插入第%d個x值:' %(i+1))) 28 Neville(xt,m,n,x)

 

 

下面的是拉格朗日插值算法,十分簡單,分享借鑒。

 1 #coding=gbk
 2 '''
 3 Created on 2014-8-31  4 
 5 @author: Administrator  6 '''
 7 def lagrange(x,xt,yt,n):  8     y = 0  9     for i in range(n): 10         t = 1
11         for j in range(n): 12             if i!=j: 13                 t = t*(x-xt[j])/(xt[i]-xt[j]) 14         y = y+t*yt[i] 15     print("結果為:%f" %y) 16 
17 xt = [] 18 yt = [] 19 x = float(input("插值x;")) 20 n = int(input("節點數目;")) 21 for i in range(n): 22     xt.append(float(input("第%d個x的值" %(i+1)))) 23 for i in range(n): 24     yt.append(float(input("第%d個x的值" %(i+1)))) 25   
26 lagrange(x,xt,yt,n)

 


免責聲明!

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



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