太原理工大學(xué)計算機數(shù)值方法實驗報告_第1頁
太原理工大學(xué)計算機數(shù)值方法實驗報告_第2頁
太原理工大學(xué)計算機數(shù)值方法實驗報告_第3頁
太原理工大學(xué)計算機數(shù)值方法實驗報告_第4頁
太原理工大學(xué)計算機數(shù)值方法實驗報告_第5頁
已閱讀5頁,還剩25頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上本科實驗報告課程名稱: 計算機數(shù)值方法 實驗地點: 專業(yè)班級: 學(xué)號:學(xué)生姓名: 指導(dǎo)教師: 成 績: 年 月 日專心-專注-專業(yè)太原理工大學(xué)學(xué)生實驗報告學(xué)院名稱計算機科學(xué)與技術(shù)學(xué)院專業(yè)班級學(xué)號學(xué)生姓名實驗日期成績課程名稱計算機數(shù)值方法實驗題目實驗一 方程求根1、 實驗?zāi)康暮鸵螅海?)實驗?zāi)康模?熟悉使用二分法、迭代法、牛頓法、割線法等方法對給定的方程進行根的求解。求方程:f(x)=x*x*x+4*x*x-10=0在1,2內(nèi)的一個實根,且要求滿足精度|x*-xn|<0.001(2)實驗要求:1.應(yīng)用C,C+或JAVA編出通用程序,源程序要有詳細的注釋和說明;2

2、.比較計算結(jié)果,對不同方法進行比較分析;3.實驗完成,提交實驗結(jié)果并寫出報告,分析計算結(jié)果是否符合問題的要求,找出計算成功的原因或計算失敗的教訓(xùn)。2、 實驗內(nèi)容和原理: (1) 增值尋根法:基本思想為:從初始值x0開始,按規(guī)定的一個初始步長h來增值。令x(n+1)=x(n)+h,(n=0,1,2.),同時計算f(x(n+1).在增值過程中會遇到三種情況:1. f(x(n+1))=0,此時x(n+1)即為方程根。2. f(x(n))和f(x(n+1)同號,說明區(qū)間內(nèi)無根。3. f(x(n))和f(x(n+1)同號,說明區(qū)間內(nèi)有根,則把步長縮小,直至滿足精度要求為止,x(n)或x(n+1)就是滿足

3、精度的近似根。 (2) 二分法:基本思想為:設(shè)f(x)在a,b內(nèi)連續(xù),且f(a)*f(b)<0,則方程f(x)=0在(a,b)內(nèi)有實根x*.然后逐步對分區(qū)間a,b,通過判斷兩端點函數(shù)值乘積的符號,進一步縮小有根區(qū)間從而求出滿足精度要求的近似值。(3) 牛頓迭代法:基本思想為給定一個初始值由牛頓法的迭代公式:x(n+1)=x(n)-f(x(n)/f(x(n) (n=0,1,2.)逐步求出x(n),直至(x(n+1)-x(n))的絕對值小于給定精度,則x(n+1)即可作為近似值。 (4) 雙點割線法:由給出的兩個初始近似值,再根據(jù)雙點割線法迭代公式:x(n+1)=x(n)-(f(x(n)/(

4、f(x(n)-f(x(n-1)*(x(n)-x(n-1),(n=1,2,3.)逐步求出x(n),直至x(n+1)-x(n)的絕對值滿足精度,則x(n+1)即可作為近似值。 (5) 單點割線法:由給出的兩個初始近似值,再根據(jù)雙點割線法迭代公式:x(n+1)=x(n)-(f(x(n)/(f(x(n)-f(x(0)*(x(n)-x(0),(n=1,2,3.)逐步求出x(n),直至x(n+1)-x(n)的絕對值滿足精度,則x(n+1)即可作為近似值。3、 主要儀器設(shè)備:筆記本電腦 4、 操作方法:源代碼:(1)增值尋根法: #include<stdio.h>double fun(doubl

5、e x) /原函數(shù) return(x*x*x+4*x*x-10);/求解方程f(x)=x*x*x+4*x*x-10=0的根,精度為10-3. int main() double a=1.25,h=1,x=a; printf("初始近似值為:%lfn",a); doif(fun(x)=0)printf("根為:%f",x);return 0; /*如果初始值函數(shù)值為0,則初始值即為根*/ else if(fun(x)*fun(x+h)>0) /*如果fun(x)和fun(x+h)同號則使X加h并跳出本次循環(huán)執(zhí)行下一次*/ x=x+h;continue

6、; else if(fun(x)*fun(x+h)<0) /若異號則說明在X和X+h之間存在函數(shù)根,則縮/短步長繼續(xù)尋根 h=h/10.0;while(h>0.001);/當不滿足精度要求時繼續(xù)執(zhí)行循環(huán)體 printf("根為:%fn",x);/跳出循環(huán)說明滿足精度要求則x可近似作為方程根 return 0;(2)二分法:#include<stdio.h>#include<math.h>#define esp 1e-3 /精度double f(double x) /原函數(shù) return (x*x*x+4*x*x-10);double ro

7、ot(double (*fun)(double),double left,double right,double deviation)/用二分法求方程根 /其中形參*fun為指向原函數(shù)的指針 double x,y; while(fabs(right-left)>deviation)/當不滿足精度要求繼續(xù)執(zhí)行循環(huán)體 x=(right+left)/2; /求出中點的橫坐標 y=fun(x); /計算中點的函數(shù)值if(y=0)return x; /如果中點函數(shù)值等于0則中點即為所求根if(y>0)right=x; /若中點函數(shù)值大于0則令其為區(qū)間右終點值else left=x; /否則令

8、其為左端點值 return(right+left)/2; /以中點值作為最終近似值int main() double a,b;printf("請輸入?yún)^(qū)間左右端點值:n");scanf("%lf%lf",&a,&b);printf("近似根為%lfn",root(f,1,2,esp); return 0;(3)牛頓迭代法:#include<stdio.h>#include<math.h>double f1(double x) /原函數(shù) return x*x*x+4*x*x-10;double f2

9、(double x) /導(dǎo)函數(shù) return 3*x*x+8*x;double newton(double x0,double e) double x1; do x1=x0; /按牛頓迭代公式Xn+1=Xn-(f1(Xn)/f2(Xn)求解x0=x1-f1(x1)/f2(x1); while(fabs(x0-x1)>e); /當不滿足精度要求時繼續(xù)執(zhí)行循環(huán)體 return x0; /滿足精度要求時返回Xn+1的值int main()double x0=1.5;/初始近似值double e=pow(10,-3); /精度printf("初始近似值為:%lfn",x0);

10、 printf("近似根為:%lfn",newton(x0,e); return 0;(4)雙點割線法:# include <stdio.h># include <math.h>#define esp 10e-3 /精度 double f(double x) /原函數(shù) return(x*x*x+4*x*x-10); double fun(double x0,double x1) /雙點割線法求近似根 double x; int i=0; while(fabs(x1-x0)>esp) /當不滿足精度要求繼續(xù)執(zhí)行循環(huán)體 x=x1-f(x1)*(x1

11、-x0)/(f(x1)-f(x0); x0=x1; x1=x; i+; /達到精度要求后跳出循環(huán) printf("執(zhí)行循環(huán)次數(shù)為 i=%dn",i); return (x1); /返回最終近似根main () double m,n,result; printf("請輸入兩個雙精度初始近似值 m n: n"); /輸入兩個雙精度初始近似值 scanf("%lf%lf",&m,&n); result=fun(m,n); printf("result=%lfn",result);/輸出最后結(jié)果,保留四位小

12、數(shù)(5)單點割線法:# include <stdio.h># include <math.h>#define esp 5*(10e-3) /精度 double f(double x) /原函數(shù) return(x*x*x-3*x-1); double fun(double x0,double x1) /單點割線法求近似根 double x; int i=0; while(fabs(x1-x0)>esp) /當不滿足精度要求繼續(xù)執(zhí)行循環(huán)體 x=x1-f(x1)*(x1-x0)/(f(x1)-f(x0); x1=x; i+; /達到精度要求后跳出循環(huán) printf(&q

13、uot;執(zhí)行循環(huán)次數(shù)為 i=%dn",i); return (x1); /返回最終近似根main () double m,n,result; printf("please input m n: n"); /輸入兩個雙精度初始近似值 scanf("%lf%lf",&m,&n); result=fun(m,n); printf("result=%.4fn",result);/輸出最后結(jié)果,保留四位小數(shù)5、 實驗結(jié)果: 程序運行結(jié)果:(1)增值尋根法:初始近似值為:1.根為:1.Press any key to c

14、ontinue(2)二分法:請輸入?yún)^(qū)間左右端點值:1 2近似根為1.Press any key to continue (3)牛頓迭代法:初始近似值為:1.近似根為:1.Press any key to continue(4) 雙點割線法:請輸入兩個雙精度初始近似值 m n:1 2執(zhí)行循環(huán)次數(shù)為 i=4result=1.Press any key to continue(5)單點割線法:please input m n:1 2執(zhí)行循環(huán)次數(shù)為 i=15result=1.Process returned 14 (0xE) execution time : 4.411 sPress any key

15、to continue. 6、 結(jié)果分析: (1)通過對不同方法比較可知,收斂速度:牛頓迭代法>雙點割線法> 單點割線法,二分法和增值尋根法的收斂速度就相對較慢,且結(jié)果相對前三種方法較不精確。(2)但二分法和增值尋根法的優(yōu)點是簡單,對f(x)只要求連續(xù),局限性是只能用于求實根,不能求復(fù)根及偶數(shù)重根。(3)牛頓法則收斂很快,而且可求復(fù)根,缺點是對重根收斂較慢,要求函數(shù)一階導(dǎo)數(shù)存在。(4)割線法省去了牛頓法求函數(shù)導(dǎo)數(shù)過程,簡化了計算步驟,且收斂速度也較快,其中雙點割線法比單點割線法收斂速度快。 七、心得體會: 本次實驗內(nèi)容較為簡單,最主要的是要學(xué)會將數(shù)學(xué)方法轉(zhuǎn)變?yōu)槌绦蛏蠙C實現(xiàn),同時要學(xué)

16、會對不同方法進行比較,確定時間復(fù)雜度最小的算法。 實驗地點指導(dǎo)教師 太原理工大學(xué)學(xué)生實驗報告學(xué)院名稱計算機科學(xué)與技術(shù)學(xué)院專業(yè)班級學(xué)號學(xué)生姓名實驗日期成績課程名稱計算機數(shù)值方法實驗題目實驗二 線性方程組的直接求解法1、 實驗?zāi)康暮鸵?(1)實驗?zāi)康模汉侠砝肎auss消元法、LU分解法求解下列方程組:0.001X1+2.000X2+3.000X3=1.000-1.000X1+3.712X2+4.623X3=2.000-2.000X1+1.072X2+5.643X3=3.000(2)實驗要求:1.應(yīng)用C,C+或JAVA編出通用程序,源程序要有詳細的注釋和說明;2.比較計算結(jié)果,對不同方法進行比較

17、分析;3.實驗完成,提交實驗結(jié)果并寫出報告,分析計算結(jié)果是否符合問題的要求,找出計算成功的原因或計算失敗的教訓(xùn)。2、 實驗內(nèi)容和原理:(1)Gauss消元法:基本思想為:對于n階線性方程組,只要各步主元素不為0,經(jīng)過n-1步消元,就可以得到一個等價的的系數(shù)矩陣為上三角形矩陣的方程組,然后再利用回代過程即可求得原方程的解。時間復(fù)雜度約為O(n3)。(2)Gauss列主元素消元法:基本思想:在用高斯消元法求解方程組時,用作除法的小主元素可能使舍入誤差增加,因此需要考慮依次按列選主元素,然后換行使之變到主元素位置上,再進行消元計算。(3)Gauss完全主元素消元法:基本思想:首先在系數(shù)矩陣A中選取絕

18、對值最大的元素作為主元素,然后交換相應(yīng)行和列,進行高斯消元,其次在A(1)的2n行及2n列選取主元素進行消元,依次進行下去。(4)LU分解法:當系數(shù)矩陣A滿足順序主子式不為0時,可將A分解為為一個單位下三角矩陣L和一個上三角矩陣U的乘積,且分解唯一,然后方程式變?yōu)長y=b,Ux=y,接著先求y,再求出x。三、主要儀器設(shè)備:筆記本電腦四、操作方法:(1)Gauss消元法: 源代碼:/*矩陣A用于存放線性方程組的增廣矩陣,向量X表示線性方程組的解,例題為P43例2*/#include<stdio.h>#include<math.h>int main() double m,p

19、,A1010,X10; int n,i,j,k,q; char c; printf("請輸入方程的階數(shù)(小于等于8):n"); scanf("%d",&n); for(i=1;i<=n;i+)/方便起見從A11開始存入數(shù)據(jù) printf("請輸入增廣矩陣第%d行:n",i); for(j=1;j<=n+1;j+) scanf("%lf",&Aij); /for for(i=1;i<n;i+) m=fabs(Aii);j=i; /m表示矩陣第i列中的最大值,j用來標記最大值所在的行數(shù)

20、 for(k=i+1;k<=n;k+) if(fabs(Aki)>m)m=fabs(Aki);j=k;/易錯 /for for(q=i;q<=n+1;q+)/交換第i行和第j行 p=Aiq;Aiq=Ajq;Ajq=p; /for /*消去過程* for(k=i+1;k<=n;k+) m=-Aki/Aii; for(j=i;j<=n+1;j+) Akj=Akj+Aij*m;/易錯 /for /for /*回代過程* Xn=Ann+1/Ann; for(i=n-1;i>=1;i-) p=0.0;for(j=i+1;j<=n;j+)p=p+Aij*Xj;Xi

21、=(Ain+1-p)/Aii; /for printf("線性方程組的解為:n"); for(i=1;i<=n;i+) printf("x%d=%lfn",i,Xi); c=getchar(); return 0;(2)Gauss列主元素消元法: 源代碼:/*矩陣A用于存放線性方程組的增廣矩陣,向量X表示線性方程組的解,例題為P43例2*/#include<stdio.h>#include<math.h>int main() double m,p,A1010,X10; int n,i,j,k,q; char c; print

22、f("請輸入方程的階數(shù)(小于等于8):n"); scanf("%d",&n); for(i=1;i<=n;i+)/方便起見從A11開始存入數(shù)據(jù) printf("請輸入增廣矩陣第%d行:n",i); for(j=1;j<=n+1;j+) scanf("%lf",&Aij); /for for(i=1;i<n;i+) m=fabs(Aii);j=i; /m表示矩陣第i列中的最大值,j用來標記最大值所在的行數(shù) for(k=i+1;k<=n;k+) if(fabs(Aki)>m

23、)m=fabs(Aki);j=k;/易錯 /for for(q=i;q<=n+1;q+)/交換第i行和第j行 p=Aiq;Aiq=Ajq;Ajq=p; /for /*消去過程* for(k=i+1;k<=n;k+) m=-Aki/Aii; for(j=i;j<=n+1;j+) Akj=Akj+Aij*m;/易錯 /for /for /*回代過程* Xn=Ann+1/Ann; for(i=n-1;i>=1;i-) p=0.0;for(j=i+1;j<=n;j+)p=p+Aij*Xj;Xi=(Ain+1-p)/Aii; /for printf("線性方程組的

24、解為:n"); for(i=1;i<=n;i+) printf("x%d=%.3lfn",i,Xi); c=getchar(); return 0;(3)Gauss完全主元素消元法: 源代碼:/*矩陣A用于存放線性方程組的增廣矩陣,向量X表示線性方程組的解*/#include<stdio.h>#include<math.h>int main() double m,p,A1010,X10; int n,i,j,k,q,l,c,w; char a; printf("請輸入方程的階數(shù)(小于等于8):n"); scanf(

25、"%d",&n); for(i=1;i<=n;i+)/方便起見從A11開始存入數(shù)據(jù) printf("請輸入增廣矩陣第%d行:n",i); for(j=1;j<=n+1;j+) scanf("%lf",&Aij); /for for(i=1;i<n;i+) m=fabs(Aii);j=i;l=i; /m表示矩陣第i列中的最大值,j用來標記最大值所在的行數(shù),l用來標記最大值所在的列數(shù) for(k=i;k<=n;k+) for(c=i;c<=n;c+) if(fabs(Akc)>m)m=f

26、abs(Akc);j=k;l=c;/易錯,忘加fabs for(q=i;q<=n+1;q+)/交換第i行和第j行 p=Aiq;Aiq=Ajq;Ajq=p; /for for(w=i;w<=n;w+)/交換第i列與第c列 p=Awi; Awi=Awc; Awc=p; /*消去過程* for(k=i+1;k<=n;k+) m=-Aki/Aii; for(j=i;j<=n+1;j+) Akj=Akj+Aij*m;/易錯 /for /for /*回代過程* Xn=Ann+1/Ann; for(i=n-1;i>=1;i-) p=0.0;for(j=i+1;j<=n;j

27、+)p=p+Aij*Xj;Xi=(Ain+1-p)/Aii; /for printf("線性方程組的解為:n"); for(i=1;i<=n;i+) printf("x%d=%lfn",i,Xi); a=getchar(); return 0;(4)LU分解法: 源代碼:#include<stdio.h>#include<math.h>int main() double p,A1212,x12,L1212,R1212,b12,y12; int n,i,j,k,m; printf("請輸入方程組的階數(shù)(小于等于10)

28、:n"); scanf("%d",&n); for(i=1;i<=n;i+) printf("請輸入系數(shù)矩陣的第%d行:n",i);for(j=1;j<=n;j+)scanf("%lf",&Aij); /for printf("請輸入右端向量b:n"); for(i=1;i<=n;i+) scanf("%lf",&bi); for(j=1;j<=n;j+) R1j=A1j;/上三角矩陣R的第一行為A的第一行 for(i=2;i<=n

29、;i+) Li1=Ai1/R11;/求出L的第一列 for(k=2;k<=n-1;k+) for(j=k;j<=n;j+)p=0.0; for(m=1;m<=k-1;m+)p=p+Lkm*Rmj;Rkj=Akj-p;/forfor(i=k+1;i<=n;i+) p=0.0; for(m=1;m<=k-1;m+)p=p+Lim*Rmk; Lik=(Aik-p)/Rkk;/for /for p=0.0; for(j=1;j<=n-1;j+)/求Rnn p=p+Lnj*Rjn; Rnn=Ann-p; y1=b1;/回代過程求y for(k=2;k<=n;k+

30、) p=0.0;for(j=1;j<=k-1;j+)p=p+Lkj*yj;yk=bk-p; /for xn=yn/Rnn;/回代過程求方程解x for(k=n-1;k>=1;k-) p=0.0;for(j=k+1;j<=n;j+)p=p+Rkj*xj;xk=(yk-p)/Rkk; /for printf("線性方程組的解為:n"); for(i=1;i<=n;i+) printf("x%d=%.3lfn",i,xi); getchar(); return 0;五、實驗結(jié)果:程序運行結(jié)果:(1)Gauss消元法:請輸入方程的階數(shù)(小

31、于等于8):3請輸入增廣矩陣第1行:0.001 2.000 3.000 1.000請輸入增廣矩陣第2行:-1.000 3.712 4.623 2.000請輸入增廣矩陣第3行:-2.000 1.072 5.643 3.000線性方程組的解為:x1=-0.490x2=-0.051x3=0.368Process returned 0 (0x0) execution time : 57.365 sPress any key to continue.(2)Gauss列主元素消元法:請輸入方程的階數(shù)(小于等于8):3請輸入增廣矩陣第1行:0.001 2.000 3.000 1.000請輸入增廣矩陣第2行:

32、-1.000 3.712 4.623 2.000請輸入增廣矩陣第3行:-2.000 1.072 5.643 3.000線性方程組的解為:x1=-0.490x2=-0.051x3=0.368Process returned 0 (0x0) execution time : 57.365 sPress any key to continue.(3)Gauss完全主元素消元法:請輸入方程的階數(shù)(小于等于8):3請輸入增廣矩陣第1行:0.001 2.000 3.000 1.000請輸入增廣矩陣第2行:-1.000 3.712 4.623 2.000請輸入增廣矩陣第3行:-2.000 1.072 5.6

33、43 3.000線性方程組的解為:x1=-0.491x2=-0.051x3=0.367Process returned 0 (0x0) execution time : 57.365 sPress any key to continue.(4)LU分解法:請輸入方程組的階數(shù)(小于等于10):3請輸入系數(shù)矩陣的第1行:0.001 2.000 3.000請輸入系數(shù)矩陣的第2行:-1.000 3.712 4.623請輸入系數(shù)矩陣的第3行:-2.000 1.072 5.643請輸入右端向量b:1.000 2.000 3.000線性方程組的解為:x1=-0.490x2=-0.051x3=0.368Pro

34、cess returned 0 (0x0) execution time : 47.830 sPress any key to continue.六、結(jié)果分析:通過對不同方法比較可知:(1)運算的簡單程度:高斯消元法>列主元素消元法>完全主元素消元法,同時LU分解法的運算量與高斯消元法差不多。(2)運算精確度:高斯消元法解方程的時候,用做除法的小主元素可能使舍入誤差增加,而完全主元素消元法和列主元素消元法可以避免采用絕對值小的主元素,使高斯消元法有較好的數(shù)值穩(wěn)定性,減小舍入誤差。同時通過對程序分析可知完全主元素消元法比列主元素更精確些。七、心得體會: 將一種數(shù)學(xué)方法轉(zhuǎn)化為程序還應(yīng)考

35、慮它的通用性,應(yīng)將程序設(shè)計成通用性高,能夠解決一類問題而不是一種問題,這才是一個計算機專業(yè)人員應(yīng)該考慮的。實驗地點指導(dǎo)教師 太原理工大學(xué)學(xué)生實驗報告學(xué)院名稱計算機科學(xué)與技術(shù)學(xué)院專業(yè)班級學(xué)號學(xué)生姓名實驗日期成績課程名稱計算機數(shù)值方法實驗題目實驗三 線性方程組的迭代求解法1、 實驗?zāi)康暮鸵螅海?)實驗?zāi)康模菏褂醚趴杀鹊ɑ蚋咚?賽德爾迭代法對下列方程組進行求解。 10X1-X2-2X3=7.2 -X1+10X2-2X3=8.3 -X1-X2+5X3=4.2(2)實驗要求:1.應(yīng)用C,C+或JAVA編出通用程序,源程序要有詳細的注釋和說明;2.比較計算結(jié)果,對不同方法進行比較分析;3.實驗完成,

36、提交實驗結(jié)果并寫出報告,分析計算結(jié)果是否符合問題的要求,找出計算成功的原因或計算失敗的教訓(xùn)。2、 實驗內(nèi)容和原理:(1)雅克比迭代:基本思想:對線性方程組AX=b的系數(shù)矩陣A可逆且主對角元素均不為0,令D=diag(a11,a22,a33,.ann),并將A分解成A=(A-D)+D,從而方程組可寫為DX=(D-A)X+b,令X=B1X+f1,其中B1=I-AD-1,f1=bD-1,以B1為迭代矩陣的迭代法公式:X(k+1)=B1X(k)+f1,稱為雅克比迭代法。(2)高斯賽德爾迭代法:基本思想:由雅克比迭代法可知,在迭代的每一步都是用X(k)的全部分量來計算X(k+1)的所有分量,在計算Xi(

37、k+1)時,Xi(k+1)(i=0,1,.i-1)沒有被利用。因此,對這些最新計算出來的第k+1次近似X(k+1)的分量加以利用,就得到解方程組的高斯賽德爾迭代法。3、 主要儀器設(shè)備: 筆記本電腦4、 操作方法:源代碼:(1)雅克比迭代法:#include<stdio.h>#include<math.h>int main() double e,m,q,A1212,x012,x112;/*x0和x1分別表示第k次和第k+1次迭代結(jié)果,且初始x0=0*/ int n,i,j,k; printf("請輸入方程組的階數(shù)(小于等于10):n"); scanf(

38、"%d",&n); for(i=1;i<=n;i+) printf("請輸入增廣矩的第%d行:n",i);/逐行輸入增廣矩陣,并對x0賦初值 for(j=1;j<=n+1;j+) scanf("%lf",&Aij); x0i=0.0; /forprintf("請輸入誤差限e:n");scanf("%lf",&e);for(i=1;i<=n;i+)/*按照迭代公式x1i=(Ain+1-Aij*x0j)/Aii(1<=i<=n,j!=i,k=0,

39、1,2,3.)計算求解*/ m=0.0; for(j=1;j<=i-1;j+) m=m+Aij*x0j; for(j=i+1;j<=n;j+) m=m+Aij*x0j; x1i=(Ain+1-m)/Aii;/forq=0.0;/q為x1與x0間的誤差for(i=1;i<=n;i+) q=q+fabs(x1i-x0i);while(q>e) /*當不滿足精度要求則執(zhí)行迭代過程*/ for(i=1;i<=n;i+) x0i=x1i; for(i=1;i<=n;i+) m=0.0; for(j=1;j<=i-1;j+) m=m+Aij*x0j; for(j=

40、i+1;j<=n;j+) m=m+Aij*x0j; x1i=(Ain+1-m)/Aii;/forq=0.0;for(i=1;i<=n;i+) q=q+fabs(x1i-x0i);/whileprintf("線性方程組的解為:n");for(i=1;i<=n;i+) printf("x%d=%.4lfn",i,x1i);return 0;(2)高斯賽德爾迭代法: #include<stdio.h>#include<math.h>int main() double e,m,q,A1212,x012,x112;/*x0

41、和x1分別表示第k次和第k+1次迭代結(jié)果,且初始x0=0*/ int n,i,j,k; printf("請輸入方程組的階數(shù)(小于等于10):n"); scanf("%d",&n); for(i=1;i<=n;i+) printf("請輸入增廣矩的第%d行:n",i);/逐行輸入增廣矩陣,并對x0賦初值 for(j=1;j<=n+1;j+) scanf("%lf",&Aij); x0i=0.0; /forprintf("請輸入誤差限e:n");scanf("%

42、lf",&e);for(i=1;i<=n;i+)/*按照迭代公式x1i=(bi-Aij*x1j-Aij*x0j)/Aii(1<=i<=n,j!=i,k=0,1,2,3.)計算求解*/ m=0.0; for(j=1;j<=i-1;j+) m=m+Aij*x1j; for(j=i+1;j<=n;j+) m=m+Aij*x0j; x1i=(Ain+1-m)/Aii;/forq=0.0;/q為x1與x0間的誤差for(i=1;i<=n;i+) q=q+fabs(x1i-x0i);while(q>e) /*當不滿足精度要求則執(zhí)行迭代過程*/ f

43、or(i=1;i<=n;i+) x0i=x1i; for(i=1;i<=n;i+) m=0.0; for(j=1;j<=i-1;j+) m=m+Aij*x1j; for(j=i+1;j<=n;j+) m=m+Aij*x0j; x1i=(Ain+1-m)/Aii;/forq=0.0;for(i=1;i<=n;i+) q=q+fabs(x1i-x0i);/whileprintf("線性方程組的解為:n");for(i=1;i<=n;i+) printf("x%d=%.4lfn",i,x1i);return 0;5、 實驗結(jié)

44、果: 程序運行結(jié)果:(1)雅克比迭代法:請輸入方程組的階數(shù)(小于等于10):3請輸入增廣矩的第1行:10 -1 -2 7.2請輸入增廣矩的第2行:-1 10 -2 8.3請輸入增廣矩的第3行:-1 -1 5 4.2請輸入誤差限e:0.0005線性方程組的解為:x1=1.0999x2=1.1999x3=1.2999Process returned 0 (0x0) execution time : 36.599 sPress any key to continue.(2)高斯賽德爾迭代法:請輸入方程組的階數(shù)(小于等于10):3請輸入增廣矩的第1行:10 -1 -2 7.2請輸入增廣矩的第2行:-1

45、 10 -2 8.3請輸入增廣矩的第3行:-1 -1 5 4.2請輸入誤差限e:0.0005線性方程組的解為:x1=1.1000x2=1.2000x3=1.3000Process returned 0 (0x0) execution time : 65.704 sPress any key to continue.6、 結(jié)果分析:(1)當系數(shù)矩陣A為嚴格對角優(yōu)勢矩陣時雅克比迭代法和高斯賽德爾迭代法均收斂。(2)通過對兩種方法進行比較,高斯賽德爾是對雅克比的進一步改進,雅克比每迭代一次需計算一次矩陣和向量的乘法,在計算機中需兩組存儲單元用來存放 X(k)和X(k+1)。高斯賽德爾對新計算出來的X

46、(k+1)加以利用,只需一組存儲單元來存放近似解,且收斂更快。(3)所以在兩種方法都收斂的情況下,高斯賽德爾比雅克比方法收斂更快,但二者都可得到較為準確的近似解。七、心得體會: 設(shè)計程序時在實現(xiàn)功能的同時還應(yīng)考慮設(shè)計一個友好的用戶界面,當需要輸入信息時給以必要的提示。實驗地點指導(dǎo)教師太原理工大學(xué)學(xué)生實驗報告學(xué)院名稱計算機科學(xué)與技術(shù)學(xué)院專業(yè)班級學(xué)號學(xué)生姓名實驗日期 成績課程名稱計算機數(shù)值方法實驗題目實驗四 矩陣特征值與特征向量問題1、 實驗?zāi)康暮鸵螅海?)實驗?zāi)康模?使用冪法求A模為最大的特征值及其相應(yīng)的特征向量。A=2351034361(2)實驗要求: 1.應(yīng)用C,C+或JAVA編出通用程序

47、,源程序要有詳細的注釋和說明; 2.比較計算結(jié)果,對不同方法進行比較分析; 3.實驗完成,提交實驗結(jié)果并寫出報告,分析計算結(jié)果是否符合問題的要求,找出計算成功的原因或計算失敗的教訓(xùn)。2、 實驗內(nèi)容和原理: 基本原理:冪法是一種由已知的非零向量x0和矩陣A的乘冪構(gòu)造向量序列Xk以計算矩陣A的按模最大特征值及其對應(yīng)特征向量的迭代算法。在計算過程中常采用把每步迭代的向量Xk進行規(guī)范化,迭代公式為:Yk=Ax(k-1),m(k)=max(Yk),x(k)=Y(k)/m(k),(k=1,2,3.),則最大特征值近似取m(k),最大特征向量近似取x(k).3、 主要儀器設(shè)備: 筆記本電腦4、 操作方法:源

48、代碼:#include<stdio.h>#include<math.h>int main() double s,m,lm,mk,e,A1111,x11,y11; int n,i,j,k; printf("請輸入矩陣的階數(shù)(小于等于10):n"); scanf("%d",&n); for(i=1;i<=n;i+) printf("請輸入第%d行:n",i); for(j=1;j<=n;j+) scanf("%lf",&Aij);printf("請輸入誤差限:n");scanf("%lf",&e);printf("請輸入初始向量:n");for(i=1;i<=n;i+)scanf("%lf",&xi);k=0;mk=0;do k=k+1; /k代表迭代次數(shù) lm=mk; mk=0; for(i=1;i<=n;i+)

溫馨提示

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

評論

0/150

提交評論