一、實驗目的
在己知f(x),x∈[a,b]的表達式,但函數值不便計算或不知f(x),x∈[a,b]而又需要給出其在[a,b]上的值時,按插值原則f(xi)=yi (i=0,1,……, n)求出簡單函數P(x)(常是多項式),使其在插值基點xi處成立(xi)= yi(i=0,1,……,n),而在[a,b]上的其它點處成立f(x)≈P(x).
二、實驗原理
三、實驗內容
求f(x)=x4在[0,2]上按5個等距節點確定的Lagrange插值多項式
四、實驗程序
import matplotlib.pyplot as plt from pylab import mpl import math x = [0, 0.5, 1, 1.5, 2] y = [0, 0.0625, 1, 5.0625, 16] """計算四次差商的值""" def four_order_difference_quotient(x, y): # i記錄計算差商的次數,這里循4次,計算4次差商。 i = 0 quotient = [0, 0, 0, 0, 0] while i < 4: j = 4 while j > i: if i == 0: quotient[j]=((y[j]-y[j-1])/(x[j]-x[j-1])) else: quotient[j] = (quotient[j]-quotient[j-1])/(x[j]-x[j-1-i]) j -= 1 i += 1 return quotient; def function(data): return parameters[0] + parameters[1]*(data-0) + parameters[2]*(data-0)*(data-0.5) + parameters[3]*(data-0)*(data-0.5)*(data-1) + parameters[4]*(data-0)*(data-0.5)*(data-1)*(data-1.5) """計算插值多項式的值""" def calculate_data(x,parameters): returnData=[]; for data in x: returnData.append(function(data)) return returnData """畫函數的圖像 newData為曲線擬合后的曲線 """ def draw(newData): plt.scatter(x,y,label="離散數據",color="blue") plt.plot(datax,newData,label="牛頓插值擬合數據",color="orange") plt.scatter(1.75,1.75**4, label="准確值",color="red") plt.title("牛頓插值法擬合數據") mpl.rcParams['font.sans-serif'] = ['SimHei'] mpl.rcParams['axes.unicode_minus'] = False plt.legend(loc="upper left") plt.show() parameters=four_order_difference_quotient(x,y) datax=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2] datay=calculate_data(datax,parameters) draw(datay) print("牛頓插值多項式為:N(x) = %f(x-0) + %f(x-0)(x-0.5) + %f(x-0)(x-0.5)(x-1) + %f(x-0)(x-0.5)(x-1)(x-1.5)"%(parameters[1], parameters[2], parameters[3],parameters[4]))
五、運算結果
(1) 圖像
(2)運算結果
六、心得體會
通過本次實驗,我對數值分析有了更深一個層次的認識 ,將數學理論和計算機 軟件結合會得到意想不到的結果 比如插值法,在先學習了拉格朗日插值法后,對其理解透徹,了解了其中的原理和思想,再學習之后的牛頓插值以及三次樣條插值等等,都很容易的融會貫通,很容易的就理解了其中所想,其中心思想並沒有多大的變化,但是使用的方式卻是不同的每個不同的思考方式帶來的都是不同的算法。
在不斷學習的過程中,知識在不斷的獲取,能力在不斷的提升。同時在老師的指導下,我的知識更上一個台階,總而言之,本次實驗演示我受益匪淺。