新数值分析报告.doc

上传人:文库蛋蛋多 文档编号:3243366 上传时间:2023-03-12 格式:DOC 页数:26 大小:1.02MB
返回 下载 相关 举报
新数值分析报告.doc_第1页
第1页 / 共26页
新数值分析报告.doc_第2页
第2页 / 共26页
新数值分析报告.doc_第3页
第3页 / 共26页
新数值分析报告.doc_第4页
第4页 / 共26页
新数值分析报告.doc_第5页
第5页 / 共26页
点击查看更多>>
资源描述

《新数值分析报告.doc》由会员分享,可在线阅读,更多相关《新数值分析报告.doc(26页珍藏版)》请在三一办公上搜索。

1、微软中国此页不打印键入文档副标题微软用户选取日期课题一: 线性方程组的迭代法一、实验内容1、设线性方程组=x= ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 ) 2、设对称正定阵系数阵线方程组= x = ( 1, -1, 0, 2, 1, -1, 0, 2 ) 3、三对角形线性方程组 = x= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。二、实验要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如由迭代次数体会该迭代法的收敛快慢;3、对

2、方程组2,3使用SOR方法时,选取松弛因子=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(予给的迭代次数),对迭代法敛散性的意义;4、体会初始解 x,松弛因子的选取,对计算结果的影响。四、流程图设计1、主程序流程图 图1-1 主程序流程图2、Jacobi迭代算法流程:图1-2 Jacobi 迭代法流程图3、Gauss-Seidel迭代算法

3、流程同Jacobi算法,迭代关系式为 图1-3 Gauss-Seidol迭代法流程图4、SOR迭代算法: 图1-4 SOR迭代法流程图五、程序代码#includeusing namespace std; #define N 40const int n=10;int jacobi(float *p,float b,float X,float x,int n);int GS(float *p,float b,float X,float x,int n);int SOR(float *p,float b,float X,float x,int n);void print(float *a,int r

4、);void main()float A1010=4,2,-3,-1,2,1,0,0,0,0, 8,6,-5,-3,6,5,0,1,0,0,4,2,-2,-1,3,2,-1,1,9,4,0,-2,1,5,-1,3,-1,1,9,4,-4,2,6,-1,6,7,-3,3,2,3,8,6,-8,5,7,17,2,6,-3,5,0,2,-1,3,-4,2,5,3,0,1,16,10,-11,-9,17,34,2,-1,2,2,4,6,2,-7,13,9,2,0,12,4,0,0,-1,8,-3,-24,-8,6,3,-1; float a10=7,5,-13,2,6,-12,14,-4,5,-5;

5、float X110=0,0,0,0,0,0,0,0,0,0; float x110; float B88=4,2,-4,0,2,4,0,0, 2,2,-1,-2,1,3,2,0, -4,-1,14,1,-8,-3,5,6, 0,-2,1,6,-1,-4,-3,3, 2,1,-8,-1,22,4,-10,-3, 4,3,-3,-4,4,11,1,-4, 0,2,5,-3,-10,1,14,2,0,0,6,3,-3,-4,2,19; float b8=0,-6,6,23,11,-22,-15,45; float X28=0,0,0,0,0,0,0,0; float x28; float C101

6、0=4,-1,0,0,0,0,0,0,0,0, -1,4,-1,0,0,0,0,0,0,0, 0,-1,4,-1,0,0,0,0,0,0, 0,0,-1,4,-1,0,0,0,0,0, 0,0,0,-1,4,-1,0,0,0,0, 0,0,0,0,-1,4,-1,0,0,0, 0,0,0,0,0,-1,4,-1,0,0, 0,0,0,0,0,0,-1,4,-1,0, 0,0,0,0,0,0,0,-1,4,-1, 0,0,0,0,0,0,0,0,-1,4; float c10=7,5,-13,2,6,-12,14,-4,5,-5; float x310; float X310=0,0,0,0,0

7、,0,0,0,0,0; float *p3; p0=&A00; p1=&B00; p2=&C00; coutJacobi迭代法解第一个方程:endl; jacobi(p0,a,X1,x1,10); coutJacobi迭代法解第二个方程:endl; jacobi(p1,b,X2,x2,8); coutJacobi迭代法解第三个方程:endl; jacobi(p2,c,X3,x3,10); coutGauss-Seidel迭代法解第一个方程:endl; GS(p0,a,X1,x1,10); coutGauss-Seidel迭代法解第二个方程:endl; GS(p1,b,X2,x2,8); cou

8、tGauss-Seidel迭代法解第三个方程:endl; GS(p2,c,X3,x3,10); coutSOR迭代法解第一个方程:endl; SOR(p0,a,X1,x1,10); coutSOR迭代法解第二个方程:endl; SOR(p1,b,X2,x2,8); coutSOR迭代法解第三个方程:endl; SOR(p2,c,X3,x3,10); int jacobi(float *p,float b,float X,float x,int n) int k,i,j; float m,R,r,e; coute; for(k=0;kN;k+) R=0; for(i=0;in;i+) m=0;

9、for(j=0;jn;j+) m=m+(*(p+i*n+j)*Xj; xi=Xi+(bi-m)/(*(p+i*n+i); r=xi-Xi; if(rR) R=r; if(R0) print(x,n); cout迭代次数为:k+1endl; return k; for(j=0;j10;j+) Xj=xj; print(x,n);cout迭代次数为:kendl; cout方程解发散,无法用Jacobi方法解此方程!endl; return 0;int GS(float *p,float b,float X,float x,int n) int i,j,k;float t,R,r,e; coute;

10、 for(k=0;kN;k+) for(i=0;in;i+) t=0; for(j=0;jn;j+) if(ji) t+=(*(p+i*n+j)*Xj; xi=(bi-t)/(*(p+i*n+i); for(i=0;i10;i+) r=xi-Xi; if(rR) R=r; if(R0) print(x,n); cout迭代次数为:k+1endl; return k; for(j=0;j8;j+) Xj=xj; print(x,n);cout迭代次数为:kendl; cout方程解发散,无法用Gauss-Seidel方法解此方程!endl; return 0;int SOR(float *p,f

11、loat b,float X,float x,int n)int i,j,k;float t,R,r,e,w; cout请输入松弛因子w(0ww;coute; for(i=0;in;i+) xi=Xi; for(k=0;kN;k+) R=0; for(i=0;in;i+) t=0; for(j=0;jn;j+) t+=(*(p+i*n+j)*xj; r=w*(bi-t)/(*(p+i*n+i); xi+=r; if(rR) R=r; if(R0) print(x,n); cout迭代次数为:k+1endl; return k; print(x,n);cout迭代次数为:kendl;cout方程

12、解发散,无法用XOR方法解此方程!endl; return 0;void print(float *a,int n) int j; float *t=a; coutx=( ; for(j=0;jn-1;j+) cout*(t+j),; cout*(t+j)endl;六、程序运行截图七、小结及体会 经过这次试验,我通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较,并运用所学的迭代法算法,解决各类线性方程组,编出算法程序。切实体会到了上机计算时,终止步骤(予给的迭代次数),对迭代法敛散性的意义,了解了初始解 x,松弛因子的选取,对计算结果的影响。在试验中,不同的系数矩阵对上述三种迭代方

13、法有很大影响,会导致结果发散无法得到正常结果。三种算法的收敛,SOR方法最大,其次Gauss-Seidel方法,Jacobi方法最小,松弛因子的不同也和收敛速度密切相关。课题二:数值积分一、实验内容 选用复合梯形公式,复合Simpson公式,Romberg算法,计算(1) I = (2) I = (3) I = (4) I = 二、实验要求1、 编制数值积分算法的程序;2、 分别用两种算法计算同一个积分,并比较其结果;3、 分别取不同步长,试比较计算结果(如n = 10, 20等);4、 给定精度要求,试用变步长算法,确定最佳步长。三、目的和意义1、 深刻认识数值积分法的意义;2、 明确数值积

14、分精度与步长的关系;3、 根据定积分的计算方法,可以考虑二重积分的计算问题。四、流程图设计1、主程序流程图图2-1 主程序流程图2.复合梯形公式的计算方法图2-2 复合梯形公式程序流程图在此算法中,主要思想是将区间端点的两个值相加,然后将区间间的函数值乘以2进行相加,然后总体和乘以h/2.3.复合Simpson公式计算方法图2-3 .复合Simpson算法流程图在此方法中,主要思想和上述梯形复合公式的算法相似,只是有些项加的数不同,就不具体说明了。4.Romberg算法计算公式图2-4 Romberg算法在此算法中,利用一个二维数组分别存储xk和xk+1,只要记录下所谓T数表的上一行,就能得出

15、下一行即xk+1的值,进而可根据t0j和t1j计算出t1j+1,根据递推可以得出t1k-2。五、程序代码#include #include math.husing namespace std;#define N 100float Simpson(float a,float b);float Romberg(float a,float b);float trapezium(float a,float b);void trans(float (*p)(float),float a,float b,int n);void transRomberg(float (*p)(float),float a,

16、float b,int m);float f1(float x);float f2(float x);float f3(float x);float f4(float x);float fN;float (*fp)(float);int main() char m; float a,b; float I; cout输入1选择函数1!endl输入2选择函数2!endl输入3选择函数3!endl输入4选择函数4!endl其他退出!m; switch(m) case 1:fp=f1;a=0;b=0.785;cout计算函数1的积分:endl;break; case 2:fp=f2;a=0;b=1;c

17、out计算函数2的积分:endl;break; case 3:fp=f3;a=0;b=1;cout计算函数3的积分:endl;break; case 4:fp=f4;a=0;b=1;cout计算函数4的积分:endl;break; default:exit(1); I=Simpson(a,b); coutI=Iendl; I=Simpson(a,b); coutI=Iendl; I=Romberg(a,b); coutI=Iendl; return 0;float Simpson(float a,float b) int j,n; float x,h; float F0,F1,F2,SN; c

18、out复化Simpson求积公式,请输入区间划分n.endln; trans(fp,a,b,2*n); h=(b-a)/(2*n); F0=f0+f2*n; F1=0; F2=0; for(j=1;j(2*n);j+) x=a+j*h;if(j%2=0) F2+=fj;elseF1+=fj; SN=(F0+4*F1+2*F2)*h/3; return SN;float trapezium(float a,float b) int j,n; float x,h; float F0,F1,SN; cout复化梯形求积公式,请输入区间划分n.endln; trans(fp,a,b,n); h=(b-

19、a)/n; F0=f0+fn; F1=0; for(j=1;jn;j+) x=a+j*h;F1+=fj; SN=(F0+2*F1)*h/2; return SN;void trans(float (*p)(float),float a,float b,int n) int i;float h;h=(b-a)/n; for(i=0;i=n;i+) fi=p(a+i*h);void transRomberg(float (*p)(float),float a,float b,int m) int i,n,k;float t,h;n=1;h=b-a;f0=p(a)+p(b); for(k=1;k=m

20、;k+) h/=2; t=0; for(i=1;i=n;i+)t+=p(a+(2*i-1)*h); fk=t; n*=2;float Romberg(float a,float b) int K,n,i,k; float h,r,e; float T1010; coutRomberg求积公式,请输入区间等分,n=2kendlk; coute; transRomberg(fp,a,b,k); h=(b-a)/2; T00=f0*h; for(K=1;K=k;K+) TK0=TK-10/2+h*fK;h/=2; n=1;for(i=1;i=K;i+)n*=4;TK-ii=(n*TK-i+1i-1-

21、TK-ii-1)/(n-1);r=T1K-1-T0K-1;if(r0)r=-r;if(re)return T1K-1; cout区间划分不够!无法达到精度要求!endl; return 0;float f1(float x) float m,s; m=sin(x); s=sqrt(4-m*m); return s; float f2(float x) float t; if(x=0)return 1; else t=sin(x);return t/x; float f3(float x) float t; t=exp(x); return (t/(4+x*x);float f4(float x) float t; t=log(1+x); return t/(1+x*x);五、实验结果截图实验结果如下:六 、小结及体会通过本次试验,我深刻认识了数值积分法的意义,明确了数值积分精度与步长的关系,并且根据定积分的计算方法,考虑了二重积分的计算问题。在本次试验中,相同的方法,取不同的步长队积分结果不同,步长越小即n越大,结果越精确.即使步长相同,不同方法结果也不一样,复化梯形公式精度最低,Simpson次之,Romberg公式精度最高.

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教育教学 > 成人教育


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号