




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、精選優(yōu)質(zhì)文檔-傾情為你奉上本科實(shí)驗(yàn)報(bào)告課程名稱: 計(jì)算機(jī)數(shù)值方法 實(shí)驗(yàn)地點(diǎn): 專業(yè)班級(jí): 學(xué)號(hào):學(xué)生姓名: 指導(dǎo)教師: 成 績(jī): 年 月 日專心-專注-專業(yè)太原理工大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告學(xué)院名稱計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè)班級(jí)學(xué)號(hào)學(xué)生姓名實(shí)驗(yàn)日期成績(jī)課程名稱計(jì)算機(jī)數(shù)值方法實(shí)驗(yàn)題目實(shí)驗(yàn)一 方程求根1、 實(shí)驗(yàn)?zāi)康暮鸵螅海?)實(shí)驗(yàn)?zāi)康模?熟悉使用二分法、迭代法、牛頓法、割線法等方法對(duì)給定的方程進(jìn)行根的求解。求方程:f(x)=x*x*x+4*x*x-10=0在1,2內(nèi)的一個(gè)實(shí)根,且要求滿足精度|x*-xn|<0.001(2)實(shí)驗(yàn)要求:1.應(yīng)用C,C+或JAVA編出通用程序,源程序要有詳細(xì)的注釋和說明;2
2、.比較計(jì)算結(jié)果,對(duì)不同方法進(jìn)行比較分析;3.實(shí)驗(yàn)完成,提交實(shí)驗(yàn)結(jié)果并寫出報(bào)告,分析計(jì)算結(jié)果是否符合問題的要求,找出計(jì)算成功的原因或計(jì)算失敗的教訓(xùn)。2、 實(shí)驗(yàn)內(nèi)容和原理: (1) 增值尋根法:基本思想為:從初始值x0開始,按規(guī)定的一個(gè)初始步長(zhǎng)h來增值。令x(n+1)=x(n)+h,(n=0,1,2.),同時(shí)計(jì)算f(x(n+1).在增值過程中會(huì)遇到三種情況:1. f(x(n+1))=0,此時(shí)x(n+1)即為方程根。2. f(x(n))和f(x(n+1)同號(hào),說明區(qū)間內(nèi)無根。3. f(x(n))和f(x(n+1)同號(hào),說明區(qū)間內(nèi)有根,則把步長(zhǎng)縮小,直至滿足精度要求為止,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)有實(shí)根x*.然后逐步對(duì)分區(qū)間a,b,通過判斷兩端點(diǎn)函數(shù)值乘積的符號(hào),進(jìn)一步縮小有根區(qū)間從而求出滿足精度要求的近似值。(3) 牛頓迭代法:基本思想為給定一個(gè)初始值由牛頓法的迭代公式:x(n+1)=x(n)-f(x(n)/f(x(n) (n=0,1,2.)逐步求出x(n),直至(x(n+1)-x(n))的絕對(duì)值小于給定精度,則x(n+1)即可作為近似值。 (4) 雙點(diǎn)割線法:由給出的兩個(gè)初始近似值,再根據(jù)雙點(diǎn)割線法迭代公式: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)的絕對(duì)值滿足精度,則x(n+1)即可作為近似值。 (5) 單點(diǎn)割線法:由給出的兩個(gè)初始近似值,再根據(jù)雙點(diǎn)割線法迭代公式: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)的絕對(duì)值滿足精度,則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)同號(hào)則使X加h并跳出本次循環(huán)執(zhí)行下一次*/ x=x+h;continue
6、; else if(fun(x)*fun(x+h)<0) /若異號(hào)則說明在X和X+h之間存在函數(shù)根,則縮/短步長(zhǎng)繼續(xù)尋根 h=h/10.0;while(h>0.001);/當(dāng)不滿足精度要求時(shí)繼續(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)/當(dāng)不滿足精度要求繼續(xù)執(zhí)行循環(huán)體 x=(right+left)/2; /求出中點(diǎn)的橫坐標(biāo) y=fun(x); /計(jì)算中點(diǎn)的函數(shù)值if(y=0)return x; /如果中點(diǎn)函數(shù)值等于0則中點(diǎn)即為所求根if(y>0)right=x; /若中點(diǎn)函數(shù)值大于0則令其為區(qū)間右終點(diǎn)值else left=x; /否則令
8、其為左端點(diǎn)值 return(right+left)/2; /以中點(diǎn)值作為最終近似值int main() double a,b;printf("請(qǐng)輸入?yún)^(qū)間左右端點(diǎn)值: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); /當(dāng)不滿足精度要求時(shí)繼續(xù)執(zhí)行循環(huán)體 return x0; /滿足精度要求時(shí)返回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)雙點(diǎn)割線法:# 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) /雙點(diǎn)割線法求近似根 double x; int i=0; while(fabs(x1-x0)>esp) /當(dāng)不滿足精度要求繼續(xù)執(zhí)行循環(huán)體 x=x1-f(x1)*(x1
11、-x0)/(f(x1)-f(x0); x0=x1; x1=x; i+; /達(dá)到精度要求后跳出循環(huán) printf("執(zhí)行循環(huán)次數(shù)為 i=%dn",i); return (x1); /返回最終近似根main () double m,n,result; printf("請(qǐng)輸入兩個(gè)雙精度初始近似值 m n: n"); /輸入兩個(gè)雙精度初始近似值 scanf("%lf%lf",&m,&n); result=fun(m,n); printf("result=%lfn",result);/輸出最后結(jié)果,保留四位小
12、數(shù)(5)單點(diǎn)割線法:# 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) /單點(diǎn)割線法求近似根 double x; int i=0; while(fabs(x1-x0)>esp) /當(dāng)不滿足精度要求繼續(xù)執(zhí)行循環(huán)體 x=x1-f(x1)*(x1-x0)/(f(x1)-f(x0); x1=x; i+; /達(dá)到精度要求后跳出循環(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"); /輸入兩個(gè)雙精度初始近似值 scanf("%lf%lf",&m,&n); result=fun(m,n); printf("result=%.4fn",result);/輸出最后結(jié)果,保留四位小數(shù)5、 實(shí)驗(yàn)結(jié)果: 程序運(yùn)行結(jié)果:(1)增值尋根法:初始近似值為:1.根為:1.Press any key to c
14、ontinue(2)二分法:請(qǐng)輸入?yún)^(qū)間左右端點(diǎn)值:1 2近似根為1.Press any key to continue (3)牛頓迭代法:初始近似值為:1.近似根為:1.Press any key to continue(4) 雙點(diǎn)割線法:請(qǐng)輸入兩個(gè)雙精度初始近似值 m n:1 2執(zhí)行循環(huán)次數(shù)為 i=4result=1.Press any key to continue(5)單點(diǎn)割線法: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)通過對(duì)不同方法比較可知,收斂速度:牛頓迭代法>雙點(diǎn)割線法> 單點(diǎn)割線法,二分法和增值尋根法的收斂速度就相對(duì)較慢,且結(jié)果相對(duì)前三種方法較不精確。(2)但二分法和增值尋根法的優(yōu)點(diǎn)是簡(jiǎn)單,對(duì)f(x)只要求連續(xù),局限性是只能用于求實(shí)根,不能求復(fù)根及偶數(shù)重根。(3)牛頓法則收斂很快,而且可求復(fù)根,缺點(diǎn)是對(duì)重根收斂較慢,要求函數(shù)一階導(dǎo)數(shù)存在。(4)割線法省去了牛頓法求函數(shù)導(dǎo)數(shù)過程,簡(jiǎn)化了計(jì)算步驟,且收斂速度也較快,其中雙點(diǎn)割線法比單點(diǎn)割線法收斂速度快。 七、心得體會(huì): 本次實(shí)驗(yàn)內(nèi)容較為簡(jiǎn)單,最主要的是要學(xué)會(huì)將數(shù)學(xué)方法轉(zhuǎn)變?yōu)槌绦蛏蠙C(jī)實(shí)現(xiàn),同時(shí)要學(xué)
16、會(huì)對(duì)不同方法進(jìn)行比較,確定時(shí)間復(fù)雜度最小的算法。 實(shí)驗(yàn)地點(diǎn)指導(dǎo)教師 太原理工大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告學(xué)院名稱計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè)班級(jí)學(xué)號(hào)學(xué)生姓名實(shí)驗(yàn)日期成績(jī)課程名稱計(jì)算機(jī)數(shù)值方法實(shí)驗(yàn)題目實(shí)驗(yàn)二 線性方程組的直接求解法1、 實(shí)驗(yàn)?zāi)康暮鸵?(1)實(shí)驗(yàn)?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)實(shí)驗(yàn)要求:1.應(yīng)用C,C+或JAVA編出通用程序,源程序要有詳細(xì)的注釋和說明;2.比較計(jì)算結(jié)果,對(duì)不同方法進(jìn)行比較
17、分析;3.實(shí)驗(yàn)完成,提交實(shí)驗(yàn)結(jié)果并寫出報(bào)告,分析計(jì)算結(jié)果是否符合問題的要求,找出計(jì)算成功的原因或計(jì)算失敗的教訓(xùn)。2、 實(shí)驗(yàn)內(nèi)容和原理:(1)Gauss消元法:基本思想為:對(duì)于n階線性方程組,只要各步主元素不為0,經(jīng)過n-1步消元,就可以得到一個(gè)等價(jià)的的系數(shù)矩陣為上三角形矩陣的方程組,然后再利用回代過程即可求得原方程的解。時(shí)間復(fù)雜度約為O(n3)。(2)Gauss列主元素消元法:基本思想:在用高斯消元法求解方程組時(shí),用作除法的小主元素可能使舍入誤差增加,因此需要考慮依次按列選主元素,然后換行使之變到主元素位置上,再進(jìn)行消元計(jì)算。(3)Gauss完全主元素消元法:基本思想:首先在系數(shù)矩陣A中選取絕
18、對(duì)值最大的元素作為主元素,然后交換相應(yīng)行和列,進(jìn)行高斯消元,其次在A(1)的2n行及2n列選取主元素進(jìn)行消元,依次進(jìn)行下去。(4)LU分解法:當(dāng)系數(shù)矩陣A滿足順序主子式不為0時(shí),可將A分解為為一個(gè)單位下三角矩陣L和一個(gè)上三角矩陣U的乘積,且分解唯一,然后方程式變?yōu)長(zhǎng)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("請(qǐng)輸入方程的階數(shù)(小于等于8):n"); scanf("%d",&n); for(i=1;i<=n;i+)/方便起見從A11開始存入數(shù)據(jù) printf("請(qǐng)輸入增廣矩陣第%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用來標(biāo)記最大值所在的行數(shù)
20、 for(k=i+1;k<=n;k+) if(fabs(Aki)>m)m=fabs(Aki);j=k;/易錯(cuò) /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;/易錯(cuò) /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("請(qǐng)輸入方程的階數(shù)(小于等于8):n"); scanf("%d",&n); for(i=1;i<=n;i+)/方便起見從A11開始存入數(shù)據(jù) printf("請(qǐng)輸入增廣矩陣第%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用來標(biāo)記最大值所在的行數(shù) for(k=i+1;k<=n;k+) if(fabs(Aki)>m
23、)m=fabs(Aki);j=k;/易錯(cuò) /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;/易錯(cuò) /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("請(qǐng)輸入方程的階數(shù)(小于等于8):n"); scanf(
25、"%d",&n); for(i=1;i<=n;i+)/方便起見從A11開始存入數(shù)據(jù) printf("請(qǐng)輸入增廣矩陣第%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用來標(biāo)記最大值所在的行數(shù),l用來標(biāo)記最大值所在的列數(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;/易錯(cuò),忘加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;/易錯(cuò) /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("請(qǐng)輸入方程組的階數(shù)(小于等于10)
28、:n"); scanf("%d",&n); for(i=1;i<=n;i+) printf("請(qǐng)輸入系數(shù)矩陣的第%d行:n",i);for(j=1;j<=n;j+)scanf("%lf",&Aij); /for printf("請(qǐng)輸入右端向量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;五、實(shí)驗(yàn)結(jié)果:程序運(yùn)行結(jié)果:(1)Gauss消元法:請(qǐng)輸入方程的階數(shù)(小
31、于等于8):3請(qǐng)輸入增廣矩陣第1行:0.001 2.000 3.000 1.000請(qǐng)輸入增廣矩陣第2行:-1.000 3.712 4.623 2.000請(qǐng)輸入增廣矩陣第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列主元素消元法:請(qǐng)輸入方程的階數(shù)(小于等于8):3請(qǐng)輸入增廣矩陣第1行:0.001 2.000 3.000 1.000請(qǐng)輸入增廣矩陣第2行:
32、-1.000 3.712 4.623 2.000請(qǐng)輸入增廣矩陣第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完全主元素消元法:請(qǐng)輸入方程的階數(shù)(小于等于8):3請(qǐng)輸入增廣矩陣第1行:0.001 2.000 3.000 1.000請(qǐng)輸入增廣矩陣第2行:-1.000 3.712 4.623 2.000請(qǐng)輸入增廣矩陣第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分解法:請(qǐng)輸入方程組的階數(shù)(小于等于10):3請(qǐng)輸入系數(shù)矩陣的第1行:0.001 2.000 3.000請(qǐng)輸入系數(shù)矩陣的第2行:-1.000 3.712 4.623請(qǐng)輸入系數(shù)矩陣的第3行:-2.000 1.072 5.643請(qǐng)輸入右端向量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é)果分析:通過對(duì)不同方法比較可知:(1)運(yùn)算的簡(jiǎn)單程度:高斯消元法>列主元素消元法>完全主元素消元法,同時(shí)LU分解法的運(yùn)算量與高斯消元法差不多。(2)運(yùn)算精確度:高斯消元法解方程的時(shí)候,用做除法的小主元素可能使舍入誤差增加,而完全主元素消元法和列主元素消元法可以避免采用絕對(duì)值小的主元素,使高斯消元法有較好的數(shù)值穩(wěn)定性,減小舍入誤差。同時(shí)通過對(duì)程序分析可知完全主元素消元法比列主元素更精確些。七、心得體會(huì): 將一種數(shù)學(xué)方法轉(zhuǎn)化為程序還應(yīng)考
35、慮它的通用性,應(yīng)將程序設(shè)計(jì)成通用性高,能夠解決一類問題而不是一種問題,這才是一個(gè)計(jì)算機(jī)專業(yè)人員應(yīng)該考慮的。實(shí)驗(yàn)地點(diǎn)指導(dǎo)教師 太原理工大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告學(xué)院名稱計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè)班級(jí)學(xué)號(hào)學(xué)生姓名實(shí)驗(yàn)日期成績(jī)課程名稱計(jì)算機(jī)數(shù)值方法實(shí)驗(yàn)題目實(shí)驗(yàn)三 線性方程組的迭代求解法1、 實(shí)驗(yàn)?zāi)康暮鸵螅海?)實(shí)驗(yàn)?zāi)康模菏褂醚趴杀鹊ɑ蚋咚?賽德爾迭代法對(duì)下列方程組進(jìn)行求解。 10X1-X2-2X3=7.2 -X1+10X2-2X3=8.3 -X1-X2+5X3=4.2(2)實(shí)驗(yàn)要求:1.應(yīng)用C,C+或JAVA編出通用程序,源程序要有詳細(xì)的注釋和說明;2.比較計(jì)算結(jié)果,對(duì)不同方法進(jìn)行比較分析;3.實(shí)驗(yàn)完成,
36、提交實(shí)驗(yàn)結(jié)果并寫出報(bào)告,分析計(jì)算結(jié)果是否符合問題的要求,找出計(jì)算成功的原因或計(jì)算失敗的教訓(xùn)。2、 實(shí)驗(yàn)內(nèi)容和原理:(1)雅克比迭代:基本思想:對(duì)線性方程組AX=b的系數(shù)矩陣A可逆且主對(duì)角元素均不為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)的全部分量來計(jì)算X(k+1)的所有分量,在計(jì)算Xi(
37、k+1)時(shí),Xi(k+1)(i=0,1,.i-1)沒有被利用。因此,對(duì)這些最新計(jì)算出來的第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("請(qǐng)輸入方程組的階數(shù)(小于等于10):n"); scanf(
38、"%d",&n); for(i=1;i<=n;i+) printf("請(qǐng)輸入增廣矩的第%d行:n",i);/逐行輸入增廣矩陣,并對(duì)x0賦初值 for(j=1;j<=n+1;j+) scanf("%lf",&Aij); x0i=0.0; /forprintf("請(qǐng)輸入誤差限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.)計(jì)算求解*/ 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) /*當(dāng)不滿足精度要求則執(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("請(qǐng)輸入方程組的階數(shù)(小于等于10):n"); scanf("%d",&n); for(i=1;i<=n;i+) printf("請(qǐng)輸入增廣矩的第%d行:n",i);/逐行輸入增廣矩陣,并對(duì)x0賦初值 for(j=1;j<=n+1;j+) scanf("%lf",&Aij); x0i=0.0; /forprintf("請(qǐng)輸入誤差限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.)計(jì)算求解*/ 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) /*當(dāng)不滿足精度要求則執(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、 實(shí)驗(yàn)結(jié)
44、果: 程序運(yùn)行結(jié)果:(1)雅克比迭代法:請(qǐng)輸入方程組的階數(shù)(小于等于10):3請(qǐng)輸入增廣矩的第1行:10 -1 -2 7.2請(qǐng)輸入增廣矩的第2行:-1 10 -2 8.3請(qǐng)輸入增廣矩的第3行:-1 -1 5 4.2請(qǐng)輸入誤差限e:0.0005線性方程組的解為:x1=1.0999x2=1.1999x3=1.2999Process returned 0 (0x0) execution time : 36.599 sPress any key to continue.(2)高斯賽德爾迭代法:請(qǐng)輸入方程組的階數(shù)(小于等于10):3請(qǐng)輸入增廣矩的第1行:10 -1 -2 7.2請(qǐng)輸入增廣矩的第2行:-1
45、 10 -2 8.3請(qǐng)輸入增廣矩的第3行:-1 -1 5 4.2請(qǐng)輸入誤差限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)當(dāng)系數(shù)矩陣A為嚴(yán)格對(duì)角優(yōu)勢(shì)矩陣時(shí)雅克比迭代法和高斯賽德爾迭代法均收斂。(2)通過對(duì)兩種方法進(jìn)行比較,高斯賽德爾是對(duì)雅克比的進(jìn)一步改進(jìn),雅克比每迭代一次需計(jì)算一次矩陣和向量的乘法,在計(jì)算機(jī)中需兩組存儲(chǔ)單元用來存放 X(k)和X(k+1)。高斯賽德爾對(duì)新計(jì)算出來的X
46、(k+1)加以利用,只需一組存儲(chǔ)單元來存放近似解,且收斂更快。(3)所以在兩種方法都收斂的情況下,高斯賽德爾比雅克比方法收斂更快,但二者都可得到較為準(zhǔn)確的近似解。七、心得體會(huì): 設(shè)計(jì)程序時(shí)在實(shí)現(xiàn)功能的同時(shí)還應(yīng)考慮設(shè)計(jì)一個(gè)友好的用戶界面,當(dāng)需要輸入信息時(shí)給以必要的提示。實(shí)驗(yàn)地點(diǎn)指導(dǎo)教師太原理工大學(xué)學(xué)生實(shí)驗(yàn)報(bào)告學(xué)院名稱計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院專業(yè)班級(jí)學(xué)號(hào)學(xué)生姓名實(shí)驗(yàn)日期 成績(jī)課程名稱計(jì)算機(jī)數(shù)值方法實(shí)驗(yàn)題目實(shí)驗(yàn)四 矩陣特征值與特征向量問題1、 實(shí)驗(yàn)?zāi)康暮鸵螅海?)實(shí)驗(yàn)?zāi)康模?使用冪法求A模為最大的特征值及其相應(yīng)的特征向量。A=2351034361(2)實(shí)驗(yàn)要求: 1.應(yīng)用C,C+或JAVA編出通用程序
47、,源程序要有詳細(xì)的注釋和說明; 2.比較計(jì)算結(jié)果,對(duì)不同方法進(jìn)行比較分析; 3.實(shí)驗(yàn)完成,提交實(shí)驗(yàn)結(jié)果并寫出報(bào)告,分析計(jì)算結(jié)果是否符合問題的要求,找出計(jì)算成功的原因或計(jì)算失敗的教訓(xùn)。2、 實(shí)驗(yàn)內(nèi)容和原理: 基本原理:冪法是一種由已知的非零向量x0和矩陣A的乘冪構(gòu)造向量序列Xk以計(jì)算矩陣A的按模最大特征值及其對(duì)應(yīng)特征向量的迭代算法。在計(jì)算過程中常采用把每步迭代的向量Xk進(jìn)行規(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("請(qǐng)輸入矩陣的階數(shù)(小于等于10):n"); scanf("%d",&n); for(i=1;i<=n;i+) printf("請(qǐng)輸入第%d行:n",i); for(j=1;j<=n;j+) scanf("%lf",&Aij);printf("請(qǐng)輸入誤差限:n");scanf("%lf",&e);printf("請(qǐng)輸入初始向量: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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 草原割草在整合教育資源中的作用考核試卷
- 安全文明施工方案誰編寫
- 航天器在軌燃料補(bǔ)給技術(shù)考核試卷
- 環(huán)境工程教學(xué)課件
- 再生橡膠在寵物用品行業(yè)的應(yīng)用考核試卷
- 2025年無縫管熱連軋機(jī)合作協(xié)議書
- 火工品生產(chǎn)過程中的安全生產(chǎn)措施考核試卷
- 藤材種植與可持續(xù)農(nóng)業(yè)考核試卷
- 盾構(gòu)機(jī)施工中的隧道工程地質(zhì)調(diào)查考核試卷
- 選擇與誰同行決定你的職場(chǎng)高度
- 0720小罐茶品牌介紹
- 汽車設(shè)計(jì)-汽車熱成型零部件設(shè)計(jì)規(guī)范模板
- 美國(guó)南北戰(zhàn)爭(zhēng) 詳細(xì)版課件
- 神經(jīng)介入患者圍術(shù)期管理
- 企業(yè)組織機(jī)構(gòu)架構(gòu)圖
- 房地產(chǎn)集團(tuán)公共區(qū)域標(biāo)準(zhǔn)化裝修教學(xué)課件
- 吉林省辦學(xué)基本標(biāo)準(zhǔn)手冊(cè)
- 閩教版(2020版)六年級(jí)下冊(cè)信息技術(shù)整冊(cè)教案
- 光電倍增管PPT
- 1-2會(huì)員代表選票
- 滬科七年級(jí)數(shù)學(xué)下冊(cè) 實(shí)數(shù)單元綜合測(cè)試卷解析
評(píng)論
0/150
提交評(píng)論