插值與多項(xiàng)式逼近的數(shù)組計(jì)算方法實(shí)驗(yàn)講解_第1頁(yè)
插值與多項(xiàng)式逼近的數(shù)組計(jì)算方法實(shí)驗(yàn)講解_第2頁(yè)
插值與多項(xiàng)式逼近的數(shù)組計(jì)算方法實(shí)驗(yàn)講解_第3頁(yè)
插值與多項(xiàng)式逼近的數(shù)組計(jì)算方法實(shí)驗(yàn)講解_第4頁(yè)
插值與多項(xiàng)式逼近的數(shù)組計(jì)算方法實(shí)驗(yàn)講解_第5頁(yè)
已閱讀5頁(yè),還剩25頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

插值與多項(xiàng)式逼近的數(shù)組計(jì)算方法實(shí)驗(yàn)鄭發(fā)進(jìn)2012042020022【摘要】計(jì)算機(jī)軟件中經(jīng)常要用到庫(kù)函數(shù),如,,,它們是用多項(xiàng)式逼近來(lái)計(jì)算的。雖然目前最先進(jìn)的逼近方法是有理函數(shù)(即多項(xiàng)式的商),但多項(xiàng)式逼近理論更適于作為數(shù)值分析的入門課程。在已知數(shù)據(jù)具有高精度的情況下,通常用組合多項(xiàng)式來(lái)構(gòu)造過(guò)給定數(shù)據(jù)點(diǎn)的多項(xiàng)式。構(gòu)造組合多項(xiàng)式的方法有許多種,如線性方程求解、拉格朗日系數(shù)多項(xiàng)式以及構(gòu)造牛頓多項(xiàng)式的方分和系數(shù)表。關(guān)鍵字泰勒級(jí)數(shù)、拉格朗日插值法、牛頓插值法、帕德逼近實(shí)驗(yàn)?zāi)康耐ㄟ^(guò)具體實(shí)驗(yàn),掌握泰勒級(jí)數(shù)、拉格朗日插值法、牛頓插值法、帕德逼近的編程技巧。比較各插值方法的優(yōu)劣并掌握。實(shí)驗(yàn)原理泰勒級(jí)數(shù)在數(shù)學(xué)中,泰勒級(jí)數(shù)(英語(yǔ):Taylorseries)用無(wú)限項(xiàng)連加式——級(jí)數(shù)來(lái)表示一個(gè)函數(shù),這些相加的項(xiàng)由函數(shù)在某一點(diǎn)的導(dǎo)數(shù)求得。如果

在點(diǎn)x=x0具有任意階導(dǎo)數(shù),則冪級(jí)數(shù)稱為

在點(diǎn)x0處的泰勒級(jí)數(shù)。在泰勒公式中,取x0=0,得到的級(jí)數(shù)稱為麥克勞林級(jí)數(shù)。函數(shù)的麥克勞林級(jí)數(shù)是x的冪級(jí)數(shù),那么這種展開(kāi)是唯一的,且必然與的麥克勞林級(jí)數(shù)一致。2.拉格朗日插值法如對(duì)實(shí)踐中的某個(gè)物理量進(jìn)行觀測(cè),在若干個(gè)不同的地方得到相應(yīng)的觀測(cè)值,拉格朗日插值法可以找到一個(gè)多項(xiàng)式,其恰好在各個(gè)觀測(cè)的點(diǎn)取到觀測(cè)到的值。這樣的多項(xiàng)式稱為拉格朗日(插值)多項(xiàng)式。數(shù)學(xué)上來(lái)說(shuō),拉格朗日插值法可以給出一個(gè)恰好穿過(guò)二維平面上若干個(gè)已知點(diǎn)的多項(xiàng)式函數(shù)。在平面上有(x1,y1)(x2,y2)...(xn,yn)共n個(gè)點(diǎn),現(xiàn)作一條函數(shù)f(x)使其圖像經(jīng)過(guò)這n個(gè)點(diǎn)。作n個(gè)多項(xiàng)式pi(x),i=1,2,3...,n,使得最后可得

牛頓插值法插值法利用函數(shù)f(x)在某區(qū)間中若干點(diǎn)的函數(shù)值,作出適當(dāng)?shù)奶囟ê瘮?shù),在這些點(diǎn)上取已知值,在區(qū)間的其他點(diǎn)上用這特定函數(shù)的值作為函數(shù)f(x)的近似值。如果這特定函數(shù)是多項(xiàng)式,就稱它為插值多項(xiàng)式。利用插值基函數(shù)很容易得到拉格朗日插值多項(xiàng)式,公式結(jié)構(gòu)緊湊,在理論分析中甚為方便,但當(dāng)插值節(jié)點(diǎn)增減時(shí)全部插值基函數(shù)均要隨之變化,整個(gè)公式也將發(fā)生變化,這在實(shí)際計(jì)算中是很不方便的,為了克服這一缺點(diǎn),提出了牛頓插值。牛頓插值通過(guò)求各階差商,遞推得到的一個(gè)公式:牛頓插值與拉格朗日插值具有唯一性。帕德逼近它不僅與逼近論中其他許多方法有著密切的關(guān)系,而且在實(shí)際問(wèn)題特別是許多物理問(wèn)題中有著廣泛的應(yīng)用。設(shè)是在原點(diǎn)某鄰域內(nèi)收斂的、具有復(fù)系數(shù)的麥克勞林級(jí)數(shù)。欲確定一個(gè)有理函數(shù),式中,使得前次方的系數(shù)為0,即使得此處約定qk=0(k>n)。雖然所求得的Pm(z)和Qn(z)不惟一,但是比式卻總是惟一的。有理函數(shù)稱為F(z)的(m,n)級(jí)帕德逼近,記為(m/n)。由(m/n)所形成的陣列稱為帕德表。實(shí)驗(yàn)內(nèi)容P154.1:用plot命令,在同一幅圖中繪制區(qū)間-1≤x≤1上的sin(x),以及P5(x),P7(x)和P9(x)。其中:

·········································式(1)····································式(2)····························式(3)P171.2:下表(表一)給出了11月8號(hào)美國(guó)洛杉磯的一個(gè)郊區(qū)在5小時(shí)內(nèi)的測(cè)量溫度。(a)對(duì)表一中的數(shù)據(jù)構(gòu)造一個(gè)拉格朗日插值多項(xiàng)式。(b)估計(jì)這5小時(shí)內(nèi)的平均溫度。(c)在同一坐標(biāo)系中畫出表中的數(shù)據(jù)和由(a)得到的多項(xiàng)式。討論用(a)中的多項(xiàng)式計(jì)算平均溫度可能產(chǎn)生的誤差。時(shí)間(下午)華氏度166266365464563663表1P178.1:用牛頓插值多項(xiàng)式計(jì)算實(shí)驗(yàn)P171.2的內(nèi)容。P194.1:比較對(duì)于函數(shù)的逼近:泰勒多項(xiàng)式逼近:····························式(4)帕德逼近:································式(5)(a)在同一坐標(biāo)系中畫出f(x),T4(x),R2,2(x)的曲線。(b)分別求出在區(qū)間[-1,1]上用T4(x)和R2,2(x)逼近f(x)的最大誤差。P194.3:比較對(duì)于函數(shù)f(x)=tan(x)的逼近:泰勒多項(xiàng)式逼近:·······················式(6)帕德逼近:·····························式(7)(a)在同一坐標(biāo)系中畫出f(x),T9(x),R5,4(x)的曲線。(b)分別求出在區(qū)間[-1,1]上用T9(x)和R5,4(x)逼近f(x)的最大誤差。實(shí)驗(yàn)結(jié)果及分析P154.1:實(shí)驗(yàn)描述:(1)plot繪圖的原理為連續(xù)點(diǎn)繪圖,只需輸入一組等間距的坐標(biāo)點(diǎn)即可完成;(2)坐標(biāo)點(diǎn)的計(jì)算使用C++完成,計(jì)算完成后輸入文件中;(3)繪圖使用matlab的plot函數(shù)完成,具體方法為從文件中讀取出坐標(biāo)點(diǎn),之后使用plot函數(shù)繪圖。實(shí)驗(yàn)結(jié)果:表2x及sin(x)及5,7,9階泰勒展開(kāi)公式計(jì)算結(jié)果xy=sin(x)y=P5(x)y=P7(x)y=P9(x)-100000000-0.84147098-0.84166667-0.84146825-0.84147101-0.90000000-0.78332691-0.78342075-0.78332585-0.78332692-0.80000000-0.71735609-0.71739733-0.71735572-0.71735609-0.70000000-0.64421769-0.64423392-0.64421758-0.64421769-0.60000000-0.56464247-0.56464800-0.56464245-0.56464247-0.50000000-0.47942554-0.47942708-0.47942553-0.47942554-0.40000000-0.38941834-0.38941867-0.38941834-0.38941834-0.30000000-0.29552021-0.29552025-0.29552021-0.29552021-0.20000000-0.19866933-0.19866933-0.19866933-0.19866933-0.10000000-0.09983342-0.09983342-0.09983342-0.099833420.000000000.000000000.000000000.000000000.000000000.100000000.099833420.099833420.099833420.099833420.200000000.198669330.198669330.198669330.198669330.300000000.295520210.295520250.295520210.295520210.400000000.389418340.389418670.389418340.389418340.500000000.479425540.479427080.479425530.479425540.600000000.564642470.564648000.564642450.564642470.700000000.644217690.644233920.644217580.644217690.800000000.717356090.717397330.717355720.717356090.900000000.783326910.783420750.783325850.783326921.000000000.841470980.841666670.841468250.84147101圖1y=sin(x)及其5,7,9階泰勒展開(kāi)函數(shù)實(shí)驗(yàn)結(jié)論:(1)由表二可知,隨著泰勒展開(kāi)階數(shù)的增加,Pn(x)越來(lái)越接近于原函數(shù),當(dāng)展開(kāi)階數(shù)n=9時(shí),在誤差delta=1e-7的精度要求下可以認(rèn)為P9(x)與sin(x)完全擬合;(2)當(dāng)y=sin(x)的泰勒展開(kāi)函數(shù)Pn(x)的展開(kāi)階數(shù)為5,7,9時(shí),其函數(shù)圖像與原函數(shù)圖像基本相符;(3)綜上,當(dāng)y=sin(x)泰勒展開(kāi)到達(dá)5階時(shí),其五階泰勒展開(kāi)函數(shù)P5(x)便近似于原函數(shù),可在范圍內(nèi)用于替代計(jì)算。P171.2:實(shí)驗(yàn)描述:(1)拉格朗日插值多項(xiàng)式的公式為:

·········································式(8)以及·················式(9)(2)進(jìn)行計(jì)算時(shí),因?yàn)楝F(xiàn)有坐標(biāo)點(diǎn)關(guān)于(3.5,y(3.5))點(diǎn)呈中心對(duì)稱,故取y(3.5)的值近似替代五小時(shí)溫度的平均值;(3)拉格朗日插值多項(xiàng)式及已知點(diǎn)的繪圖使用matlab的plot函數(shù)完成,為完成繪圖需將拉格朗日插值多項(xiàng)式及已知坐標(biāo)點(diǎn)的坐標(biāo)輸入到文件中,以便于使用matlab讀取。實(shí)驗(yàn)結(jié)果:(1)擬合后的6次拉格朗日插值多項(xiàng)式為:

式(10)(2)這五小時(shí)的平均溫度為:64.5(華氏度)(3)圖2溫度的拉格朗日插值多項(xiàng)式擬合曲線圖P178.1:實(shí)驗(yàn)描述:(1)拉格朗日插值多項(xiàng)式的公式為:

··············式(11)其中為給出坐標(biāo)點(diǎn)的各階差商。(2)進(jìn)行計(jì)算時(shí),因?yàn)楝F(xiàn)有坐標(biāo)點(diǎn)關(guān)于(3.5,y(3.5))點(diǎn)呈中心對(duì)稱,故取y(3.5)的值近似替代五小時(shí)溫度的平均值;(3)牛頓插值多項(xiàng)式及已知點(diǎn)的繪圖使用matlab的plot函數(shù)完成,為完成繪圖需將牛頓插值多項(xiàng)式及已知坐標(biāo)點(diǎn)的坐標(biāo)輸入到文件中,以便于使用matlab讀取。實(shí)驗(yàn)結(jié)果:(1)擬合后的6次牛頓插值多項(xiàng)式為:

·······································式(12)(2)這5小時(shí)的平均溫度為:64.5華氏度(3)圖三溫度的牛頓插值多項(xiàng)式擬合曲線圖實(shí)驗(yàn)結(jié)論:(1)當(dāng)日下午1至6時(shí)的平均溫度估計(jì)為64.5華氏度。(2)由于采樣點(diǎn)的數(shù)據(jù)容量較小,平均溫度可能存在誤差。(3)對(duì)比拉格朗日插值與牛頓插值,牛頓插值的計(jì)算量更小,且當(dāng)取5次點(diǎn)的時(shí)候,兩者擬合精度都比較高。4.P194.1:實(shí)驗(yàn)描述:(1)實(shí)驗(yàn)畫圖使用matlab中的plot函數(shù)完成(2)誤差的最大值使用matlab中的max函數(shù)完成實(shí)驗(yàn)結(jié)果:(1)圖4f(x)及其泰勒逼近T4(x)及帕德逼近R2,2(x)曲線圖(2)圖5泰勒逼近及帕德逼近誤差曲線圖泰勒逼近f(x)的最大誤差:E4(x)=0.0099帕德逼近f(x)的最大誤差:E2,2(x)=0.004實(shí)驗(yàn)結(jié)論:(1)在區(qū)間內(nèi),T4(x)與R2,2(x)與原函數(shù)y=ex大致完全擬合;(2)相較與T4(x),R2,2(x)的誤差在區(qū)間內(nèi)更小,且隨|x|的增大,誤差也逐漸增大。5.P194.3:實(shí)驗(yàn)描述:(1)實(shí)驗(yàn)畫圖使用matlab中的plot函數(shù)完成(2)誤差的最大值使用matlab中的max函數(shù)完成實(shí)驗(yàn)結(jié)果:(1)圖6f(x)及其泰勒逼近T9(x)及帕德逼近R5,4(x)曲線圖(2)圖7泰勒逼近及帕德逼近誤差曲線圖泰勒逼近f(x)的最大誤差:E4(x)=-0.0149帕德逼近f(x)的最大誤差:E2,2(x)=-3.1725e-07實(shí)驗(yàn)結(jié)論:(1)在區(qū)間內(nèi),T4(x)與R2,2(x)與原函數(shù)y=tan(x)大致完全擬合;(2)相較與T9(x),R5,4(x)的誤差在區(qū)間內(nèi)更小,且隨|x|的增大,誤差也逐漸增大;(3)與實(shí)驗(yàn)四相對(duì)比可得出,隨著逼近次數(shù)的增加,計(jì)算精度也隨之增加附件(代碼):P154.1:#include<stdlib.h>#include<iostream>#include<fstream>#include<iomanip>#include<cmath>usingnamespacestd;structX_FX//定義一個(gè)用于存放x,sin(x),P5(x),P7(x),P9(x)的數(shù)據(jù)類型{ doublex; doubley1; doubley2; doubley3; doubley4;};intmain(){ inti; X_FXFx[21];//定義一個(gè)一維數(shù)組,此數(shù)組用于儲(chǔ)存x,f(x),P5(x),P7(x),P9(x) doublex=-1; i=0; doubleFsinx(double); doublePsinx(double,int); ofstreamoutfile; while(x<=1)//依次產(chǎn)生各x值,x=-1+0.1k,k=0,1,2...20 { Fx[i].x=x; x=x+0.1; i++; } for(i=0;i<=20;i++) { Fx[i].y1=sin(Fx[i].x);//依次計(jì)算各x對(duì)應(yīng)的sin(x)的值 Fx[i].y2=Psinx(Fx[i].x,5);//依次計(jì)算各x對(duì)應(yīng)的P5(x)的值 Fx[i].y3=Psinx(Fx[i].x,7);//依次計(jì)算各x對(duì)應(yīng)的P7(x)的值 Fx[i].y4=Psinx(Fx[i].x,9);//依次計(jì)算各x對(duì)于的P9(x)的值 } outfile.open("154_1.txt"); //輸出計(jì)算結(jié)果,并將結(jié)果保存到文件“154_1.txt”中 cout<<std::left<<setw(15)<<"x"<<std::left<<setw(15)<<"sin(x)"<<std::left<<setw(15)<<"P5(x)"<<std::left<<setw(15)<<"P7(x)"<<std::left<<setw(15)<<"P9(x)"<<endl; for(i=0;i<=20;i++) { cout<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].x; cout<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y1; cout<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y2; cout<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y3; cout<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y4<<endl; outfile<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].x; outfile<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y1; outfile<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y2; outfile<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y3; outfile<<std::left<<setw(15)<<setiosflags(ios::fixed)<<setprecision(10)<<Fx[i].y4<<endl; } outfile.close(); system("pause"); return0;}//此函數(shù)為用于計(jì)算y=sin(x)的解泰勒展開(kāi)y=Pn(x)的函數(shù),n為展開(kāi)階數(shù)//輸x為y=Pn(x)的自變量x//輸入n為y=Pn(x)的展開(kāi)階數(shù)n//輸入y為y=Pn(x)的因變量ydoublePsinx(doublex,intn){ doubley=0; inti,j=1; intinf(int); for(i=1;i<=n;i=i+2) { y=y+j*pow(x,i)/inf(i); j=-j; } returny;}//此函數(shù)用于計(jì)算x的階乘//輸入x為要求階乘x!的數(shù)x//輸出y為對(duì)x做階乘運(yùn)算的結(jié)果intinf(intx){ inti,y=1; for(i=1;i<=x;i++) y=y*i; returny;}Matlab繪制曲線函數(shù)Val=load('154_1.txt');%從文件中取出計(jì)算結(jié)果X=(Val(:,1))';%將x值保存到矩陣X中SinX=(Val(:,2))';%將y=sin(x)保存到矩陣SinX中P5X=(Val(:,3))';%將y=P5(x)保存到矩陣P5X中P7X=(Val(:,4))';%將y=P7(x)保存到矩陣P7X中P9X=(Val(:,5))';%將y=P9(x)保存到矩陣P9X中figure(1)subplot(2,2,1)%繪制y=sin(x)曲線plot(X,SinX,'g')legend('y=sin(x)')subplot(2,2,2);%繪制y=P5(x)曲線plot(X,P5X,'r')legend('y=P5(x)')subplot(2,2,3);%繪制y=P7(x)曲線plot(X,P7X,'y')legend('y=P7(x)')subplot(2,2,4);%繪制y=P9(x)曲線plot(X,P9X,'b')legend('y=P9(x)')P171.2:#include<iostream>#include<stdlib.h>#include<cmath>#include<iomanip>#include<fstream>usingnamespacestd;structCoordinate//構(gòu)建一個(gè)用于保存坐標(biāo)點(diǎn)的數(shù)據(jù)類型{ doublex; doubley;};intmain(){ ofstreamoutfile; intN,i; doubleadv; double*lagran_build(Coordinate*,int); voidlagran_output(double*,Coordinate*,int); doublelagran(double*,Coordinate*,int,double); cout<<"請(qǐng)輸入坐標(biāo)點(diǎn)的個(gè)數(shù):"; cin>>N; Coordinate*Data;//構(gòu)建變量Data,用于保存坐標(biāo)點(diǎn) double*lagran_coefficient;//構(gòu)建變量lagran_coefficient,用于保存拉格朗日插值多項(xiàng)式的系數(shù) Data=newCoordinate[N-1]; cout<<"請(qǐng)依次輸入各點(diǎn)坐標(biāo):"<<endl; for(i=0;i<N;i++)//輸入已知坐標(biāo)點(diǎn)坐標(biāo) cin>>Data[i].x>>Data[i].y; lagran_coefficient=lagran_build(Data,N);//構(gòu)建拉格朗日插值多項(xiàng)式 lagran_output(lagran_coefficient,Data,N);//輸出N階的拉格朗日插值多項(xiàng)式函數(shù) adv=lagran(lagran_coefficient,Data,N,3.5);//計(jì)算5小時(shí)的平均溫度 cout<<"這五小時(shí)的平均溫度估計(jì)為:"<<adv<<"華氏度"<<endl; outfile.open("171_2.txt"); for(i=0;i<N;i++)//將坐標(biāo)點(diǎn)及拉格朗日插值多項(xiàng)式系數(shù)輸出到文件"171_2.txt" { outfile<<std::left<<setw(10)<<setiosflags(ios::fixed)<<setprecision(5)<<Data[i].x; outfile<<std::left<<setw(10)<<setiosflags(ios::fixed)<<setprecision(5)<<Data[i].y; outfile<<std::left<<setw(10)<<setiosflags(ios::fixed)<<setprecision(5)<<lagran_coefficient[i]<<endl; } outfile.close(); system("pause"); return0;}//此函數(shù)為用于計(jì)算N次拉格朗日插值多項(xiàng)是系數(shù)的函數(shù)//輸入Data為已知坐標(biāo)點(diǎn)的指針//輸入N為要求的拉格朗日插值多項(xiàng)式的次數(shù)//輸出拉lagran為N次拉格朗日插值多項(xiàng)式的系數(shù)矩陣的地址double*lagran_build(Coordinate*Data,intN){ inti,j; double*lagran; lagran=newdouble[N-1];//生成一個(gè)一維矩陣,用于保存N次拉格朗日插值多項(xiàng)式的系數(shù) for(i=0;i<N;i++)//計(jì)算N次拉格朗日插值多項(xiàng)式的系數(shù) { lagran[i]=1; for(j=0;j<i;j++) lagran[i]=lagran[i]*(Data[i].x-Data[j].x); for(j=i+1;j<N;j++) lagran[i]=lagran[i]*(Data[i].x-Data[j].x); lagran[i]=1/lagran[i]; } returnlagran;}//此函數(shù)用于輸出一個(gè)N次拉格朗日插值多項(xiàng)式//輸入lagran_coefficient為保存N次拉格朗日插值多項(xiàng)式的一維矩陣的地址//輸入Data為保存已知坐標(biāo)點(diǎn)的地址//輸入N為N次拉格朗日插值多項(xiàng)式的次數(shù)voidlagran_output(double*lagran_coefficient,Coordinate*Data,intN){ inti,j; cout<<"擬合后的"<<N<<"次拉格朗日插值函數(shù)為:"<<endl; cout<<"P"<<N<<"(x)="; for(i=0;i<N;i++) { cout<<Data[i].y*lagran_coefficient[i]; for(j=0;j<i;j++) cout<<"(x-"<<Data[j].x<<")"; for(j=i+1;j<N;j++) cout<<"(x-"<<Data[j].x<<")"; if(i<N+1) cout<<"+"; } cout<<endl; return;}//此函數(shù)為計(jì)算N次拉格朗日插值多項(xiàng)式在某一點(diǎn)的值的函數(shù)//輸入lagran_coefficient為保存N次拉格朗日插值多項(xiàng)式系數(shù)的一維矩陣的地址//輸入Data為用于保存已知坐標(biāo)點(diǎn)的地址//輸入N為N此拉格朗日插值多項(xiàng)式的次數(shù)//輸入x為要求N次拉格朗日插值的擬合點(diǎn)的x坐標(biāo)//輸出y為要求N次拉格朗日插值的擬合點(diǎn)的y坐標(biāo)doublelagran(double*lagran_coefficient,Coordinate*Data,intN,doublex){ doubley=0,yk; inti,j; for(i=0;i<N;i++) { yk=Data[i].y*lagran_coefficient[i]; for(j=0;j<i;j++) yk=yk*(x-Data[j].x); for(j=i+1;j<N;j++) yk=yk*(x-Data[j].x); y=y+yk; } returny;}Matlab繪圖函數(shù)主函數(shù)Val=load('171_2.txt');%從文件’172_2.txt’中取出已知點(diǎn)的坐標(biāo)及拉格朗日插值多項(xiàng)式系數(shù)X=(Val(:,1))';%將已知坐標(biāo)點(diǎn)x值保存到矩陣X中Y=(Val(:,2))';%將拉格朗日插值多項(xiàng)式系數(shù)保存到矩陣Lagran中Lagran=(Val(:,3))';%將拉格朗日插值多項(xiàng)式系數(shù)保存到矩陣Lagran中corf=Y.*Lagran;x=linspace(1,6);y=lagran(X,corf,x);%計(jì)算繪圖點(diǎn)坐標(biāo)plot(X,Y,'o')%繪制已知點(diǎn)及拉格朗日插值多項(xiàng)式函數(shù)holdall;plot(x,y);legend('采樣點(diǎn)','溫度擬合曲線')被調(diào)用的函數(shù)lagran%此函數(shù)用于計(jì)算拉格朗日插值多項(xiàng)式的擬合值%X為已知點(diǎn)的x坐標(biāo)%coef為拉格朗日插值多項(xiàng)式系數(shù)%x為被求點(diǎn)x坐標(biāo)%y為被求點(diǎn)y坐標(biāo)functiony=lagran(X,coef,x)n=length(X);y=0;fori=1:nyk=coef(i);forj=1:i-1yk=yk.*(x-X(j));endforj=i+1:nyk=yk.*(x-X(j));endy=y+yk;endend3.P178.1:#include<iostream>#include<stdlib.h>#include<cmath>#include<iomanip>#include<fstream>usingnamespacestd;structCoordinate//構(gòu)建一個(gè)用于保存坐標(biāo)點(diǎn)的數(shù)據(jù)類型{ doublex; doubley;};intmain(){ ofstreamoutfile; intN,i; doubleadv; double*newton_build(Coordinate*,int); voidnewton_output(double*,Coordinate*,int); doublenewton(double*,Coordinate*,int,double); cout<<"請(qǐng)輸入坐標(biāo)點(diǎn)的個(gè)數(shù):"; cin>>N; Coordinate*Data;//構(gòu)建數(shù)組Data,用于保存坐標(biāo)點(diǎn) double*newton_coefficient;//構(gòu)建數(shù)組new_coefficient,用于保存牛頓插值多項(xiàng)式的系數(shù) Data=newCoordinate[N-1]; Data=newCoordinate[N-1]; cout<<"請(qǐng)依次輸入各點(diǎn)坐標(biāo):"<<endl; for(i=0;i<N;i++)//輸入已知點(diǎn)坐標(biāo) cin>>Data[i].x>>Data[i].y; newton_coefficient=newton_build(Data,N);//構(gòu)建次牛頓插值多項(xiàng)式 newton_output(newton_coefficient,Data,N);//輸出N次牛頓插值多項(xiàng)式 adv=newton(newton_coefficient,Data,N,3.5);//計(jì)算5小數(shù)平均溫度 cout<<"這五小時(shí)的平均溫度估計(jì)為:"<<adv<"華氏度"<<endl; outfile.open("178_1.txt");//將坐標(biāo)點(diǎn)及牛頓插值多項(xiàng)式系數(shù)輸出到文件"178_1.txt" for(i=0;i<N;i++) { outfile<<std::left<<setw(10)<<setiosflags(ios::fixed)<<setprecision(5)<<Data[i].x; outfile<<std::left<<setw(10)<<setiosflags(ios::fixed)<<setprecision(5)<<Data[i].y; outfile<<std::left<<setw(10)<<setiosflags(ios::fixed)<<setprecision(5)<<newton_coefficient[i]<<endl; } outfile.close(); system("pause"); return0;}//此函數(shù)為用于計(jì)算N次牛頓插值多項(xiàng)式系數(shù)的函數(shù)//輸入Data為已知坐標(biāo)點(diǎn)的指針//輸入N為要求的牛頓插值多項(xiàng)式的次數(shù)//輸出newton_coefficient為N次牛頓插值多項(xiàng)式的系數(shù)矩陣的地址double*newton_build(Coordinate*Data,intN){ inti,j; doubledeltax; double*newton_coefficient; newton_coefficient=newdouble[N-1];//生成一個(gè)一維數(shù)組,用于保存N次牛頓插值多項(xiàng)式的系數(shù) for(i=0;i<N;i++)//計(jì)算N次牛頓插值多項(xiàng)式的系數(shù) { newton_coefficient[i]=Data[i].y; } for(i=0;i<N;i++) { deltax=Data[i+1].x-Data[0].x; for(j=N-1;j>i;j--) newton_coefficient[j]=(newton_coefficient[j]-newton_coefficient[j-1])/deltax; } returnnewton_coefficient;}//此函數(shù)用于輸出一個(gè)N次牛頓插值多項(xiàng)式//輸入newton_coefficient為保存N次牛頓插值多項(xiàng)式的一維矩陣的地址//輸入Data為保存已知坐標(biāo)點(diǎn)的數(shù)組的地址//輸入N為N次牛頓插值多項(xiàng)式的次數(shù)voidnewton_output(double*newton_coefficient,Coordinate*Data,intN){ inti,j; cout<<"擬合后的"<<N<<"次牛頓插值函數(shù)為:"<<endl; cout<<"P"<<N<<"(x)="; for(i=0;i<N;i++) { cout<<newton_coefficient[i]; for(j=0;j<i;j++) cout<<"(x-"<<Data[j].x<<")"; if(i<N-1) cout<<"+"; } cout<<endl; return;}//此函數(shù)為計(jì)算N次牛頓插值多項(xiàng)式在某一點(diǎn)的值的函數(shù)//輸入newton_coefficient為保存N次牛頓插值多項(xiàng)式系數(shù)的一維矩陣的地址//輸入Data為用于保存已知坐標(biāo)點(diǎn)的數(shù)組的地址//輸入N為N次牛頓插值多項(xiàng)式的次數(shù)//輸入x為要求N次牛頓插值的擬合點(diǎn)的x坐標(biāo)//輸出y為要求N次牛頓插值的擬合點(diǎn)的y坐標(biāo)doublenewton(double*newton_coefficient,Coordinate*Data,intN,doublex){ doubley=0,yk; inti,j; for(i=0;i<N;i++) { yk=newton_coefficient[i]; for(j=0;j<i;j++) yk=yk*(x-Data[j].x); y=y+yk; } returny;}Matlab繪圖函數(shù)Val=load('178_1.txt');%從文件’178_1.txt’中取出已知點(diǎn)坐標(biāo)及牛頓插值多項(xiàng)式系數(shù)X=(Val(:,1))';%將已知點(diǎn)坐標(biāo)的x值保存到矩陣X中Y=(Val(:,2))';%將已知點(diǎn)坐標(biāo)的y值保存到矩陣Y中Newton=(Val(:,3))';%繪制已知點(diǎn)及牛頓插值多項(xiàng)式函數(shù)x=linspace(1,6);y=newton(X,Newton,x);%計(jì)算繪圖點(diǎn)坐標(biāo)plot(X,Y,'o')%繪制已知點(diǎn)及牛頓插值多項(xiàng)式函數(shù)holdall;plot(x,y);legend('采樣點(diǎn)','溫度擬合曲線')被調(diào)用的函數(shù)newton%此函數(shù)用于計(jì)算牛頓插值多項(xiàng)式的擬合值%X為已知點(diǎn)的x坐標(biāo)%coef為牛頓插值多項(xiàng)式系數(shù)%x為被求點(diǎn)x坐標(biāo)%y為被求點(diǎn)y坐標(biāo)functiony=newton(X,coef,x)n=length(X);y=0;fori=1:nyk=coef(i);forj=1:i-1yk=yk.*(x-X(j));endy=y+yk;endendP194.1:x=linspace(-1,1);%生成x=[-1,1]y1=exp(x);%計(jì)算f(x)=exp(x)y2=1;%計(jì)算T4(x)fori=1:4y2=y2+(x.^i)/factorial(i);endy3=(12+6*x+x.^2)./(12-6*x+x.^2);%計(jì)算R2,2(x)figure(1)%繪制f(x),T4(x),R2,2(x)曲線subplot(2,2,1)plot(x,y1,'r')holdallplot(x,y2,'g')holdallplot(x,y3,'b')legend('y=exp(x)','y=T4(x)','y=R2,2(x)')subplot(2,2,2)plot(x,y1,'r')lege

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論