版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
1、數(shù)值計算基礎實驗指導書2010 年目錄實驗一直接法解線性方程組的.3實驗二插值方法.12實驗三數(shù)值積分.6 實驗四常微分方程的數(shù)值解.8實驗五迭代法解線性方程組與非線性方程.10實驗一直接法解線性方程組一、實驗目的掌握全選主元消去法與高斯-塞德爾法解線性方程組。二、實驗內(nèi)容分別寫出Guass 列選主元消去法與追趕法的算法,編寫程序上機調(diào)試出結果,要求所編程序適用于任何一解線性方程組問題,即能解決這一類問題,而不是某一個問題。實驗中以下列數(shù)據(jù)驗證程序的正確性。1、用Guass 列選主元消去法求解方程組é2.52.3-5.1ùéx1ùé3.7
2、49;ê5.39.61.5úêxú=ê3.8úêêë8.11.7-4.3úêúûêë2úx3úûê úêë5.5úû2、用追趕法求解方程組é-20000ùéx1ùé-10ùê1-2000úêxúê0 úêúê2
3、úêúê01-200úêx3ú=ê0 úêúêúêúê001-20úêx4úê0 ú0001-2x50三、實驗儀器設備與材料主流微型計算機四、實驗原理1、Guass 列選主元消去法對于AX=BA B是上三角矩陣。即:1)、消元過程:將(A|B)進行變換為( |),其中AæaaLabö æ1aLaböç11121n1÷ç
4、121n1÷ça21a22La2nb2÷ç01La2nb2÷çMMMM÷®çMMMM÷ççèan1an2÷bøLannn÷ççè00÷bøLannn÷k從1 到n-1 a、列選主元選取第k列中絕對值最大元素maxaikk£i£n作為主元。b、換行akjbkc、歸一化Ûaij,j=k+1,L,nÛbid、消元akj /akkbk /akk&
5、#222;akj,j=k+1,L,nÞbkaij -aikakj Þaij,i=k+1,L,n;j=k+1,L,nbi -aikbk Þbi,i=k+1,L,n2)、回代過程:由( |)解出x,x,L,x。A Bbn /ann Þxn nnn-11bk -åakjxj Þxk,k=n-1,L,2,1j=k+12、追趕法線性方程組為:æacöæx öæföç11÷ç1 ÷ç1 ÷çb2çç
6、a2c2Ob3a3c3÷çx2 ÷3÷çx ÷÷ç÷çf2 ÷3çf÷ç÷OçOOO÷çM÷=çM÷çççbn-1çOan-1cn-1÷çM÷ç÷çx÷ç÷÷÷÷n-1ç÷Mç f÷
7、1;÷÷n-1èbnan øèxn øèfn ø做LU分解為:æaöæ1böç1÷ç1÷çg2a2ççga÷ç1b2÷÷çOO÷L=ç33÷,R=ç÷ççOO÷çbOç÷çO÷çç÷çOO&
8、#247;÷1n-1÷÷ègnan øè1 ø分解公式:ìgï=aïii(i=2,3,L,n)ía1 =b1 ,ai =bi -gibi-1ï(i=2,3,L,n)iïb=ciïîai(i=1,2,L,n-1)則Ax=fÞLUx=fìLy=fÞíîUx=y回代公式:y=ìf1ï1ïíyïîïia1=fi -giyi-1ai(i=
9、2,3,L,n)ìxn =yníîxi =yi -bixi+1(i=n-1,n-2,L,1)五、實驗步驟1、理解并掌握全選主元消去法與高斯-塞德爾迭代法公式;2、畫出全選主元消去法與高斯-塞德爾迭代法的流程圖3、使用C語言編寫出相應的程序并調(diào)試驗證通過六、實驗報告要求1、統(tǒng)一使用武漢科技大學實驗報告本書寫,實驗報告的內(nèi)容要求有:實驗目的、實驗內(nèi)容、程序流程圖、源程序、運行結果及實驗小結六個部分。2、源程序需打印后粘貼在實驗報告冊內(nèi);3、運行結果以屏幕截圖形式保存并打印后粘貼在實驗報告冊內(nèi)。七、實驗注意事項注意如何定義數(shù)據(jù)結構以保存矩陣和解以降低算法的復雜性。八、思
10、考題若使用全主元消去法,在編程中應如何記錄保存對于未知數(shù)的調(diào)換。實驗二插值方法一、實驗目的掌握拉格郎日插值法與牛頓插值法構造插值多項式。二、實驗內(nèi)容分別寫出拉格郎日插值法與牛頓插值法的算法,編寫程序上機調(diào)試出結果,要求所編程序適用于任何一組插值節(jié)點,即能解決這一類問題,而不是某一個問題。實驗中以下列數(shù)據(jù)驗證程序的正確性。已知下列函數(shù)表xi0.561600.562800.564010.56521yi0.827410.826590.825770.82495求x=0.5635時的函數(shù)值。三、實驗儀器設備與材料主流微型計算機四、實驗原理已知n個插值節(jié)點的函數(shù)值,則可由拉格郎日插值公式與牛頓插值公式構造
11、出插值多項式,從而由該插值多項式求出所要求點的函數(shù)值。拉格郎日插值公式與牛頓插值公式如下:1、Lagrange插值公式nLn(x)=l0(x)y0 +l1(x)y1 +.+ln(x)yn =åyklk(x)k=0(x-x)(x-x)L(x-x)(x-x)L(x-x)nx-xl(x)=01k-1 k+1 n=Õ jkk(x -x0)(xk -x1)L(xk -xk-1)(xk -xk+1)L(xk -xn)j=0j¹kxk -xj2、Newton插值公式Nn(x)=f(x0)+fx0,x1(x-x0)+fx0,x1 ,x2(x-x0)(x-x1)+L+fx0,x1
12、,Lxn(x-x0)(x-x1)L(x-xn-1)五、實驗步驟1、理解并掌握拉格郎日插值法與牛頓插值法的公式;2、畫出拉格郎日插值法與牛頓插值法算法的流程圖;3、使用C語言編寫出相應的程序并調(diào)試驗證通過。六、實驗報告要求1、統(tǒng)一使用武漢科技大學實驗報告本書寫,實驗報告的內(nèi)容要求有:實驗目的、實驗內(nèi)容、程序流程圖、源程序、運行結果及實驗小結六個部分。2、源程序需打印后粘貼在實驗報告冊內(nèi);3、運行結果以屏幕截圖形式保存并打印后粘貼在實驗報告冊內(nèi)。七、實驗注意事項Newton插值法在編程時應注意定義何種數(shù)據(jù)結構以保存差商。八、思考題比較Lagrange插值法與Newton插值法的異同。實驗三數(shù)值積分
13、一、實驗目的掌握復化梯形法與龍貝格法計算定積分。二、實驗內(nèi)容分別寫出變步長梯形法與Romberge法計算定積分的算法,編寫程序上機調(diào)試出結果,要求所編程序適用于任何類型的定積分,即能解決這一類問題,而不是某一個問題。實驗中以下列數(shù)據(jù)驗證程序的正確性。求1sinxdx,e£0.00001。ò0 x三、實驗儀器設備與材料主流微型計算機四、實驗原理通過變步長梯形法與龍貝格法,我們只要知道已知n個求積節(jié)點的函數(shù)值,則可由相應的公式求出該函數(shù)的積分值,從而不需要求該函數(shù)的原函數(shù)。變步長梯形法與龍貝格法公式如下:1、變步長梯形法å 2n-1 hTn =f(xi)+f(xi+1
14、)i=0hn-1=f(a)+2åf(xi)+f(b)2i=11hn-1T2n = Tn + åf(xi+1/2)22i=0用T2n -Tn£e來控制精度2、龍貝格法1hn-1T2n = Tn + åf(xi+1/2)22i=0Sn =41T2n - Tn33Cn =161S2n - Sn1515641Rn =C2n - Cn6363用R2n -Rn£e來控制精度五、實驗步驟1、理解并掌握變步長梯形法與龍貝格法的公式;2、畫出變步長梯形法與龍貝格法的流程圖3、使用C語言編寫出相應的程序并調(diào)試驗證通過六、實驗報告要求1、統(tǒng)一使用武漢科技大學實驗報告
15、本書寫,實驗報告的內(nèi)容要求有:實驗目的、實驗內(nèi)容、程序流程圖、源程序、運行結果及實驗小結六個部分。2、源程序需打印后粘貼在實驗報告冊內(nèi);3、運行結果以屏幕截圖形式保存并打印后粘貼在實驗報告冊內(nèi)。七、實驗注意事項1sinx在ò0x的定義。dx積分中,被積函數(shù)在x=0點函數(shù)值為1,對該點在程序設計中應注意對其八、思考題使用復化梯形法與復化Simpson法來計算該問題有何缺點?實驗四常微分方程的數(shù)值解一、實驗目的掌握改進歐拉法與四階龍格-庫塔求解一階常微分方程的初值問題。二、實驗內(nèi)容分別寫出改進歐拉法與四階龍格-庫塔求解的算法,編寫程序上機調(diào)試出結果,要求所編程序適用于任何一階常微分方程的
16、數(shù)值解問題,即能解決這一類問題,而不是某一個問題。實驗中以下列數(shù)據(jù)驗證程序的正確性。ìy¢=-xy2求íîy(0)=2(0£x£5)步長h=0.25。三、實驗儀器設備與材料主流微型計算機四、實驗原理常微分方程的數(shù)值解主要采用“步進式”,即求解過程順著節(jié)點排列次序一步一步向前推進,在單步法中改進歐拉法和四階龍格-庫塔法公式如下:1、改進歐拉法yn+1 =yn +hf(xn,yn)yn+1=yn+hf(x2n,yn)+f(xn+1,yn+1)2、四階龍格-庫塔法ìhïyn+1 =yn +6(k1 +2k2 +2k3 +
17、k4)ïïk1 =ïík2 =ïïf(xn,yn)f(x +hn2h,yn +hk1)2hïk3 =ïïîk4 =f(xn +,yn +k2)22f(xn +h,yn +hk3)五、實驗步驟1、理解并掌握改進歐拉法與四階龍格-庫塔法的公式;2、畫出改進歐拉法與四階龍格-庫塔法的流程圖3、使用C語言編寫出相應的程序并調(diào)試驗證通過六、實驗報告要求1、統(tǒng)一使用武漢科技大學實驗報告本書寫,實驗報告的內(nèi)容要求有:實驗目的、實驗內(nèi)容、程序流程圖、源程序、運行結果及實驗小結六個部分。2、源程序需打印后粘貼在實
18、驗報告冊內(nèi);3、運行結果以屏幕截圖形式保存并打印后粘貼在實驗報告冊內(nèi)。七、實驗注意事項ìy¢=-xy2íîy(0)=2精度的變化八、思考題(0£x£5)的精確解為y =2/(1+x2),通過調(diào)整步長,觀察結果的如何對四階龍格-庫塔法進行改進,以保證結果的精度。實驗五迭代法解線性方程組與非線性方程一、實驗目的掌握高斯-塞德爾迭代法求解線性方程組與牛頓迭代法求方程根。二、實驗內(nèi)容分別寫出高斯-塞德爾迭代法與牛頓迭代法的算法,編寫程序上機調(diào)試出結果,要求所編程序適用于任何一個方程的求根,即能解決這一類問題,而不是某一個問題。實驗中以下列數(shù)據(jù)
19、驗證程序的正確性。1、高斯-塞德爾迭代法求解線性方程組é721-2ùéx1ùé4ùê9153-2úêxúê7úêúê2ú=êúê-2-2 115úêx3úê-1úêúêúêúë13213ûëx4ûë0û2、用牛頓迭代法求方程x3 -x-1=
20、0的近似根,e£0.00001,牛頓法的初始值為1。三、實驗儀器設備與材料主流微型計算機四、實驗原理二分法通過將含根區(qū)間逐步二分,從而將根的區(qū)間縮小到容許誤差范圍。牛頓通過迭代的方法逐步趨進于精確解,該兩種方法的公式如下:1、高斯-塞德爾迭代法1)判斷線性方程組是否主對角占優(yōu)nåaijj=1j¹i£aii,i=1,2,L,n2)直接分離xi,即nxi =(di -åbijxj)/aii,i=1,2,L,nj=1建立高斯-塞德爾迭代格式為:(k+1)xii-1=(di -åaijxj(k+1)n-åaijxj(k)/aii,i
21、=1,2,L,nj=1j=i+13)取初值迭代求解至所要求的精度為止。2、牛頓法kx=x-f(xk)k+1kf¢(x)五、實驗步驟1、理解并掌握二分法與牛頓法的公式;2、畫出二分法與牛頓法的流程圖3、使用C語言編寫出相應的程序并調(diào)試驗證通過六、實驗報告要求1、統(tǒng)一使用武漢科技大學實驗報告本書寫,實驗報告的內(nèi)容要求有:實驗目的、實驗內(nèi)容、程序流程圖、源程序、運行結果及實驗小結六個部分。2、源程序需打印后粘貼在實驗報告冊內(nèi);3、運行結果以屏幕截圖形式保存并打印后粘貼在實驗報告冊內(nèi)。七、實驗注意事項對于二分法應注意二分后如何判斷根的區(qū)間,對于牛頓法注意如何確定迭代過程的結束八、思考題若使用
22、牛頓法是發(fā)散的,如何對牛頓法進行改進以保證其收斂性。前三個實驗的程序代碼(C/C+)和運行結果截圖#include<iostream>#include<stdlib.h>#include<math.h>usingnamespacestd;Gauss全選主元解方程組的源程序及運行結果class Matrixpublic: Matrix();Matrix();voidSetMatrix(constintn,constdoubleesp1);/構造線性方程組相應的矩陣,n為方程的未知數(shù)數(shù)目,esp1為要求的精度voidMax(constintr);/全選主元voi
23、dChangeRC(constintr);/根據(jù)主元變換矩陣的行或列voidEliminate(constintr);/處理消元工作voidResult()const;/計算方程的解voidCalculate();intGetRank()const;/返回矩陣的行數(shù)doubleGetX(consti)const;/確定方程組的第i個解(1<=i<=N)private:/指針a和b分別用于存儲方程組的未知數(shù)系數(shù)和方程"="右邊的常數(shù),esp存/儲精度double*a,*b,esp;/指針flag用于記錄方程組解的順序int*flag;/以下的結構體用于在全選主元中
24、記錄最大主元的位置structcoordinateintrow,column;location;intN;/方程組未知數(shù)的數(shù)目;intmain()intn;doubleesp1; Matrixmatrix; docout<<"請輸入方陣的階數(shù):"cin>>n;if(n<0)n=0;/如何控制非法字符的輸入?while(n=0);docout<<"請輸入計算精度:"cin>>esp1;if(esp1<0)esp1=0;/輸入不合法的精度就把精度置0while(esp1=0);cout<<
25、;"輸入線性方程組的增廣矩陣:n" matrix.SetMatrix(n,esp1);/設置矩陣內(nèi)的數(shù)據(jù)matrix.Calculate();/計算方程組的解/輸出方程組的解cout<<"nn方程組的解如下:n"for(inti=1;i<=matrix.GetRank();+i)cout<<"X"<<i<<":"<<matrix.GetX(i)<<endl;return0;Matrix:Matrix()/將Matrix類的數(shù)據(jù)成員初始化a
26、=NULL; b=NULL; flag=NULL; location.row=0; location.column=0; esp=0;N=0;Matrix:Matrix()/釋放指針a、b和flag指向的內(nèi)存空間deletea;deleteb;deleteflag;voidMatrix:SetMatrix(constintn,constdoubleesp1)N=n;esp=esp1;a=newdoubleN*N; b=newdoubleN; flag=newintN;/判斷是否成功分配存儲區(qū)if(a=NULL|b=NULL|flag=NULL)cout<<"分配存儲區(qū)失敗
27、!n"exit(EXIT_FAILURE);/讀取線性方程組的增廣矩陣for(inti=0;i<N;+i)for(intj=0;j<N;+j) cin>>*(a+i*N+j);cin>>*(b+i);/flag中存儲的值對應相應的x值,當方程的解由于列變換交換后,flag中/的值也相應交換,最后用于恢復解的順序for(i=0;i<N;+i)*(flag+i)=i;voidMatrix:Max(constintr)doublemax=0;for(inti=r;i<N;+i)for(intj=r;j<N;+j)if(max<fa
28、bs(*(a+i*N+j)max=fabs(*(a+i*N+j);/設定最大主元的行、列l(wèi)ocation.row=i;location.column=j;/最大主元小于輸入的精度時,認為方程組無解,退出程序if(max<=esp)cout<<"方程組無解!n"exit(EXIT_FAILURE);voidMatrix:ChangeRC(constintr)doubletemp;/如果最大主元所在的行不在當前行,則進行行變換if(location.row!=r)for(inti=r;i<N;+i)temp=*(a+r*N+i);*(a+r*N+i)=*
29、(a+location.row*N+i);*(a+location.row*N+i)=temp;temp=br; br=blocation.row; blocation.row=temp;/若最大主元所在的列不在當前的r列,則進行列變換if(location.column!=r)for(inti=r;i<N;+i)temp=*(a+i*N+r);*(a+i*N+r)=*(a+i*N+location.column);*(a+i*N+location.column)=temp;/交換flag中的元素來標記方程解的位置變化inttemp1;temp1=*(flag+r);*(flag+r)=
30、*(flag+location.column);*(flag+location.column)=temp1;voidMatrix:Eliminate(constintr)if(fabs(*(a+N*r+r)<=esp)cout<<"方程組無解!n"exit(EXIT_FAILURE);for(inti=r+1;i<N;+i)for(intj=r+1;j<N;+j)(*(a+i*N+j)-=(*(a+i*N+r)*(*(a+r*N+j)/(*(a+r*N+r); (*(b+i)-=(*(b+r)*(*(a+i*N+r)/(*(a+r*N+r);v
31、oidMatrix:Result()constif(fabs(*(a+N*(N-1)+N-1)<=esp)cout<<"方程組無解!n"exit(EXIT_FAILURE);doubletemp;*(b+N-1)/=(*(a+N*(N-1)+N-1);/求出XN-1/依次求出Xi(i=N-2,N-3····,1)for(inti=N-2;i>=0;-i)temp=0;for(intj=i+1;j<N;+j)temp+=(*(a+i*N+j)*(*(b+j);*(b+i)=(*(b+i)-temp)/(*(
32、a+i*N+i);/根據(jù)flag中的數(shù)據(jù)用冒泡排序法恢復方程組解的次序for(i=0;i<N-1;+i)for(intj=0;j<N-i-1;+j)if(*(flag+j)>*(flag+j+1)inttemp1;/交換解的順序temp=*(b+j);*(b+j)=*(b+j+1);*(b+j+1)=temp;/交換用于標記的元素的順序temp1=*(flag+j);*(flag+j)=*(flag+j+1);*(flag+j+1)=temp1;voidMatrix:Calculate()/根據(jù)矩陣行數(shù)重復進行尋找最大主元、變換行或列、消元for(inti=0;i<Ge
33、tRank()-1;+i) Max(i); ChangeRC(i); Eliminate(i);Result();intMatrix:GetRank()constreturnN;/返回矩陣的行數(shù)doubleMatrix:GetX(constinti)constreturn*(b+i-1);運行結果追趕法求解方程組的算法:1輸入方程組的維數(shù)n,將主對角元素b(i)(i=0:n-1),主對角元素左邊的元素a(i)(i=0:n-2),主對角元素右邊的元素c(i)(i=0:n-2),右端項的元素f(i)(i=0:n-1)2對方程組的系數(shù)矩陣作Crout分解, (0)=b(0),對于i=0:n-2,c(
34、i):=(i):=c(i)/b(i),b(i+1):=(i+1):= b(i+1)-a(i)* (i)3.解方程組Ly=fb(0):=y(0):=f(0)/ (0):=f(0)/b(0)對于i=1:n-1,b(i):=y(i):=f(i)-a(i-1)*y(i-1)/b(i)4.解方程組Ux=ya(n-1):=x(n-1):=b(n-1)對于i=n-2:0,a(i)=x(i):=b(i)-c(i)*a(i+1);5輸出方程組的解a(0:n-1)#include<iostream>#include<stdlib.h>用追趕法求解方程組的源程序及運行結果usingnames
35、pacestd;class MatrixThrpublic: MatrixThr();MatrixThr();voidSetMatrixThr(constintn);/設置三對角矩陣的數(shù)據(jù)voidResult();/計算三對角矩陣的解doubleGetX(constinti)const;/取得第i個解,i從1開始intGetN() const;/返回未知數(shù)的數(shù)目private:intN;/N為未知數(shù)的數(shù)目/b為矩陣主對角線的元素首地址,a為主對角線左邊一斜條元素的首地址,/c為主對角線右邊一斜條元素首地址,f為方程組的常數(shù)首地址double*a,*b,*c,*f;intmain()Matrix
36、Thrmatrix;intn;docout<<"輸入三對角方程組的變量的數(shù)目N:"cin>>n;while(n<3);cout<<"請依次輸入三對角方程組每行的數(shù)據(jù)(0元素除外):n" matrix.SetMatrixThr(n);/計算方程組的解matrix.Result();/輸出方程組的解cout<<"方程的解如下:n"for(inti=1;i<=matrix.GetN();+i)cout<<"X"<<i<<&qu
37、ot;:"<<matrix.GetX(i)<<endl;return0;MatrixThr:MatrixThr()/初始化相關數(shù)據(jù)N=0; a=NULL; b=NULL; c=NULL;f=NULL;MatrixThr:MatrixThr()/釋放分配的內(nèi)存空間delete a; delete b; delete c;delete f;voidMatrixThr:SetMatrixThr(constintn)/根據(jù)輸入的未知數(shù)個數(shù)設置矩陣的數(shù)據(jù)N=n;a=new doubleN; b=new doubleN; c=new doubleN; f=newdoubl
38、eN;/若內(nèi)存分配失敗,退出程序if(a=NULL|b=NULL|c=NULL|f=NULL)cout<<"初始化分配存儲空間失??!n"exit(EXIT_FAILURE);/依次輸入三對角矩陣每行的元素cin>>*b>>*c>>*f;for(inti=1;i<N-1;+i) cin>>*(a+i-1)>>*(b+i)>>*(c+i)>>*(f+i);cin>>*(a+i-1)>>*(b+i)>>*(f+i);voidMatrixThr:
39、Result()/對系數(shù)矩陣A作Crout分解for(inti=0;i<N-1;+i)/將U中的存于指針b中,L中的存于指針c中*(c+i)/=(*(b+i);*(b+i+1)-=(*(a+i)*(*(c+i);/解方程組Ly=f,求得的y值存于指針b中*b=(*f)/(*b);for(i=1;i<N;+i)*(b+i)=(*(f+i)-(*(a+i-1)*(*(b+i-1)/(*(b+i);/解方程組Ux=y,求得的x值存于指針a中*(a+N-1)=*(b+N-1);for(i=N-2;i>=0;-i)*(a+i)=*(b+i)-(*(c+i)*(*(a+i+1);intM
40、atrixThr:GetN()constreturnN;doubleMatrixThr:GetX(constinti)constreturn*(a+i-1);運行結果#include<iostream>Lagrange插值法的源程序:#include<stdlib.h>usingnamespacestd;class Lagrangepublic: Lagrange();Lagrange();voidSetLagrange(constintn);/根據(jù)用戶的輸入設置Lagrange類中的插值點數(shù)據(jù)boolExist(constdoublex,constinti);/檢測是
41、否輸入了與前i個插值結點橫坐標相同的點intGetN()const;/獲取插值結點的數(shù)目voidCalculate(constdoublea);/計算橫坐標a對應的函數(shù)值doubleGetResult()const;/返回計算的函數(shù)值private:intN;/插值結點的數(shù)目double*x,*y,zx,zy;/x、y分別用于存儲插值點的數(shù)據(jù),zx、zy表示所求的坐標點;intmain()intn=2; LagrangeL; doif(n<2)cout<<"用于模擬曲線的插值點數(shù)目N>2"<<endl;cout<<"
42、請輸入用于模擬曲線的插值點數(shù)目N:"cin>>n;while(n<2);cout<<"請輸入各插值點橫、縱坐標的數(shù)據(jù)n" L.SetLagrange(n);doublea;cout<<"請輸入所求點的橫坐標X:"cin>>a; L.Calculate(a);cout<<"橫坐標"<<a<<"-對應的函數(shù)值為:"<<L.GetResult()<<endl;return0;Lagrange:Lag
43、range()/初始化相關數(shù)據(jù)N=0;x=y=NULL;zx=zy=0;Lagrange:Lagrange()/釋放分配給指針的內(nèi)存空間delete x;delete y;boolLagrange:Exist(constdoublea,constinti)/遍歷以輸入的插值點,看是否重復插入橫坐標相同的插值點for(intj=0;j<i;+j)if(a=*(x+j)returntrue;returnfalse;voidLagrange:SetLagrange(constintn)N=n;x=newdoubleN;y=newdoubleN;/判斷是否成功為指針分配了內(nèi)存空間if(x=NUL
44、L|y=NULL)cout<<"分配存儲空間失??!"<<endl;exit(EXIT_FAILURE);/輸入插值點for(inti=0;i<GetN();+i)cin>>*(x+i)>>*(y+i);/如果不是輸入第一個坐標值,則會對輸入的橫坐標進行合法性檢測while(i!=0&&Exist(*(x+i),i)=true)cout<<"輸入了重復的橫坐標-請重新輸入第"<<i+1<<"個插入結點的數(shù)據(jù)n"cin>>
45、*(x+i)>>*(y+i);voidLagrange:Calculate(constdoublea)zx=a;for(inti=0;i<GetN();+i)/計算插值基函數(shù)doubletemp=1;for(intj=0;j<i;+j)temp*=(zx-*(x+j)/(*(x+i)-*(x+j);for(+j;j<GetN();+j)temp*=(zx-*(x+j)/(*(x+i)-*(x+j);zy+=(*(y+i)*temp);intLagrange:GetN()constreturnN;/返回插值點的數(shù)目doubleLagrange:GetResult()
46、constreturnzy;/返回求得的函數(shù)值Lagrange插值法的運行結果#include<iostream>usingnamespacestd;Newton插值法的源程序:class Matrixpublic: Matrix();Matrix();voidSetMatrix(constintn);/根據(jù)用戶輸入的插值點的數(shù)據(jù)設置計算結果的矩陣intGetN()const;/返回插值點的數(shù)目voidCalculate();/計算差商doubleGetResult(doublex)const;/根據(jù)輸入的橫坐標求函數(shù)值,返回運算結果private:double*a,*f;/a和f
47、分別用于存儲插值點的橫坐標和相應的函數(shù)值intN;/記錄插值點的數(shù)目;intmain()Matrixmatrix;intn;docout<<"輸入插值點的數(shù)目N:"cin>>n;while(n<2);cout<<"輸入插值點的數(shù)據(jù):"<<endl;matrix.SetMatrix(n);matrix.Calculate();doublex;cout<<"輸入所求的橫坐標:"cin>>x;cout<<"所求的函數(shù)值為:"<
48、<matrix.GetResult(x)<<endl;return1;Matrix:Matrix()/初始化數(shù)據(jù)a=f=NULL;N=0;Matrix:Matrix()/釋放指針a、f指向的內(nèi)存空間delete a;delete f;voidMatrix:SetMatrix(intn)N=n;/為插值點創(chuàng)建動態(tài)數(shù)組a=newdoubleN;f=newdoubleN;/輸入插值點的數(shù)據(jù)for(inti=0;i<GetN();+i) cin>>*(a+i)>>*(f+i);intMatrix:GetN()constreturnN;voidMatrix
49、:Calculate()/將差商存儲在一個一維數(shù)組內(nèi)for(inti=0;i<GetN();+i)for(intj=GetN()-1;j>i;-j)*(f+j)=(*(f+j)-*(f+j-1)/(*(a+j)-*(a+j-i-1);doubleMatrix:GetResult(doublex)const/利用差商和插值點的橫坐標及第一個插值點的縱坐標計算函數(shù)值double result=*f;/指針f指向第一個插值點的縱坐標for(inti=1;i<GetN();+i)doubletemp=1;for(intj=0;j<i;+j)temp*=(x-*(a+j);/計算
50、(x-x0)*(x-x1)*···*(x-x(i-1)result+=(*(f+i)*temp;/指針(f+i)指向第i號差商returnresult;Newton插值法的運行結果變步長梯形法求定積分的源程序:#include<iostream>#include<math.h>using namespacestd;doublefunction(constdoublex);/求被積函數(shù)的值并返回/accumulate()為求定積分的函數(shù),a、b 分別為積分的上下限,默認精度為0.00001 doubleaccumulate(constdoub
51、lea,constdoubleb,constdoubleeps=0.00001);intmain()doublea,b,eps;/a,b分別為定積分的上限和下限,h為步長,eps 為要求的精度a=0; b=1; eps=0.00001;cout<<"(sinX/X)在0 到1上的積分為:"<<accumulate(a,b)<<endl;return0;doublefunction(constdoublex)if(x=0)return1;/x為0 時函數(shù)值為1 return(sin(x)/x);doubleaccumulate(constd
52、oublea,constdoubleb,constdouble eps)intn=1;doubleh=b-a;/h為步長doubleT1=h*(function(a)+function(b)/2;doubleT2=T1/2+h*function(a+h/2)/2;/計算結果不滿足精度,則繼續(xù)while(fabs(T2-T1)>eps)n*=2; h/=2;/步長折半T1=T2;/利用T1 計算T2 doubletemp=0;for(int i=1;i<=n;+i)temp+=function(a+(i-1.0/2)*h); T2=T1/2+h*temp/2;returnT2;/返回
53、步長h最合適時定積分的近似值1sinx變步長梯形法求定積分ò0的運行結果xRomberg算法求定積分的源程序:#include<iostream>#include<math.h>usingnamespacestd;/求被積函數(shù)的值并返回doublefun(constdoublex);/Romberge()為求定積分的函數(shù),a、b分別為積分的上下限,默認精度為0.00001 doubleRomberg(constdoublea,constdoubleb,constdoubleeps=0.0001);/函數(shù)Tm()為T-數(shù)表的計算公式doubleTm(constd
54、oubleT1,constdoubleT2,constintm);intmain()doublea,b,eps;/a,b分別為定積分的上限和下限,h為步長,eps 為要求的精度a=0; b=1; eps=0.00001;cout<<"所求積分為:"<<Romberg(a,b,eps)<<endl;return0;doublefun(constdoublex)if(x=0)return1;/x為0 時函數(shù)值為1 return(sin(x)/x);/返回被積函數(shù)的值doubleTm(constdouble T1,constdoubleT2,c
55、onstintm)/根據(jù)T1、T2 和m計算出下一個數(shù)并返回return(pow(4,m)*T1-T2)/(pow(4,m)-1);doubleRomberg(constdoublea,constdoubleb,constdoubleeps)doubleT10;/用于存儲T-數(shù)表某一行的數(shù)據(jù)int l=1;T0=(b-a)*(fun(a)+fun(b)/2;doubleT1,T2;intflag;/flag用于標記十分求得符合精度的值doflag=0;intn=pow(2,l-1);/n表示區(qū)間等分數(shù)doubleh=(b-a)/n;/h為步長doubletemp=0;for(int i=0;i<n;+i)temp+=fun(a+(i+1.0/2)*h); T1=T0/2+h*temp/2
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年溝通技巧培訓合同3篇
- 2024年股權獎勵合同書標準格式版B版
- 2024年資金監(jiān)管:項目募集三方協(xié)議范例
- 2023年乙丙醇胺項目建設方案
- 2024新勞動法對人力資源信息化與智能化合同3篇
- 高中科研項目的開展計劃
- 2024年購房意向合同(二手房)3篇
- 教研工作的調(diào)研成果展示
- 《質(zhì)量法及練習題》課件
- 科技賦能財務助力企業(yè)數(shù)字化轉(zhuǎn)型
- 2024年企業(yè)團購:銷售合作協(xié)議3篇
- 2024-2025學年八年級語文上學期期末真題復習 專題06 文言文閱讀
- 制藥課程設計三廢處理
- 期末測試卷(試題)-2024-2025學年北師大版數(shù)學五年級上冊
- 關于培訓的課件
- 2024上海市房屋租賃合同范本下載
- 2025年蛇年年度營銷日歷營銷建議【2025營銷日歷】
- 2024-2025學年北師大版七年級上冊數(shù)學期末專項復習:期末壓軸題分類(原卷版)
- 2024年全國《汽車加氣站操作工》安全基礎知識考試題庫與答案
- 2024-2025學年北師大版小學六年級上學期期末英語試卷及解答參考
- 2024年人教版八年級道德與法治下冊期末考試卷(附答案)
評論
0/150
提交評論