实验五解线性方程组的迭代法报告.docx
- 文档编号:23331223
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:14
- 大小:79.68KB
实验五解线性方程组的迭代法报告.docx
《实验五解线性方程组的迭代法报告.docx》由会员分享,可在线阅读,更多相关《实验五解线性方程组的迭代法报告.docx(14页珍藏版)》请在冰豆网上搜索。
实验五解线性方程组的迭代法报告
实验五解线性方程组的迭代法
一、问题提出
对实验四所列目的和意义的线性方程组,试分别选用Jacobi迭代法,Gauss-Seidel迭代法和SOR方法计算其解。
二、要求
1、体会迭代法求解线性方程组,并能与消去法做以比较;
2、分别对不同精度要求,如
由迭代次数体会该迭代法的收敛快慢;
3、对方程组2,3使用SOR方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4、给出各种算法的设计程序和计算结果。
三、目的和意义
1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;
2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;
3、体会上机计算时,终止步骤
或k>(给予的迭代次数),对迭代法敛散性的意义;
4、体会初始解
,松弛因子的选取,对计算结果的影响。
四、实验学时:
2学时
五、实验步骤:
1.进入C或matlab开发环境;
2.根据实验内容和要求编写程序;
3.调试程序;
4.运行程序;
5.撰写报告,讨论分析实验结果.
解:
J迭代算法:
程序设计流程图:
源程序代码:
#include
#include
#include
voidmain()
{
floata[50][51],x1[50],x2[50],temp=0,fnum=0;
inti,j,m,n,e,bk=0;
printf("使用Jacobi迭代法求解方程组:
\n");
printf("输入方程组的元:
\nn=");
scanf("%d",&n);
for(i=1;i x1[i]=0; printf("输入方程组的系数矩阵: \n"); for(i=1;i { j=1; while(j { scanf("%f",&a[i][j]); j++; } } printf("输入方程组的常数项: \n"); for(i=1;i { scanf("%f",&a[i][n+1]); } printf("\n"); printf("请输入迭代次数: \n"); scanf("%d",&m); printf("请输入迭代精度: \n"); scanf("%d",&e); while(m! =0) { for(i=1;i { for(j=1;j { if(j! =i) temp=a[i][j]*x1[j]+temp; } x2[i]=(a[i][n+1]-temp)/a[i][i]; temp=0; } for(i=1;i { fnum=float(fabs(x1[i]-x2[i])); if(fnum>temp)temp=fnum; } if(temp<=pow(10,-4))bk=1; for(i=1;i x1[i]=x2[i]; m--; } printf("原方程组的解为: \n"); for(i=1;i { if((x1[i]-x2[i])<=e||(x2[i]-x1[i])<=e) { printf("x%d=%7.4f",i,x1[i]); } } } 运行结果: GS迭代算法: #include #include #include constintm=11; voidmain() { intchoice=1; while(choice==1) { doublea[m][m],b[m],e,x[m],y[m],w,se,max; intn,i,j,N,k; cout<<"Gauss-Seidol迭代法"< cout<<"请输入方程的个数: "; cin>>n; for(i=1;i<=n;i++) { cout<<"请输入第"< "; for(j=1;j<=n;j++) cin>>a[i][j]; } cout<<"请输入各个方程等号右边的常数项: \n"; for(i=1;i<=n;i++) { cin>>b[i]; } cout<<"请输入最大迭代次数: "; cin>>N; cout<<"请输入最大偏差: "; cin>>e; for(i=1;i<=n;i++) { x[i]=0; y[i]=x[i]; } k=0; while(k! =N) { k++; for(i=1;i<=n;i++) { w=0; for(j=1;j<=n;j++) { if(j! =i) w=w+a[i][j]*y[j]; } y[i]=(b[i]-w)/double(a[i][i]); } max=fabs(x[1]-y[1]); for(i=1;i<=n;i++) { se=fabs(x[i]-y[i]); if(se>max) max=se; } if(max { cout< for(i=1;i<=n;i++) cout<<"x"< break; } for(i=1;i<=n;i++) { x[i]=y[i]; } } if(k==N) cout<<"迭代失败! ! "< choice=0; } } SOR方法: #include #include #include /**********定义全局变量**********/ float**a;/*存放A矩阵*/ float*b;/*存放b矩阵*/ float*x;/*存放x矩阵*/ floatp;/*精确度*/ floatw;/*松弛因子*/ intn;/*未知数个数*/ intc;/*最大迭代次数*/ intk=1;/*实际迭代次数*/ /**********SOR迭代法**********/ voidSOR(floatxk[]) { inti,j; floatt=0.0; floattt=0.0; float*xl; xl=(float*)malloc(sizeof(float)*(n+1)); for(i=1;i { t=0.0; tt=0.0; for(j=1;j t=t+a[i][j]*xl[j]; for(j=i;j tt=tt+a[i][j]*xk[j]; xl[i]=xk[i]+w*(b[i]-t-tt)/a[i][i]; } t=0.0; for(i=1;i { tt=fabs(xl[i]-xk[i]); tt=tt*tt; t+=tt; } t=sqrt(t); for(i=1;i xk[i]=xl[i]; if(k+1>c) { if(t<=p) printf("\nReachthegivenprecision! \n"); else printf("\noverthemaximalcount! \n"); printf("\nCountnumberis%d\n",k); } else if(t>p) { k++; SOR(xk); } else { printf("\nReachthegivenprecision! \n"); printf("\nCountnumberis%d\n",k); } } /**********程序*****开始**********/ voidmain() { inti,j; printf("SOR方法\n"); printf("请输入方程个数: \n"); scanf("%d",&n); a=(float**)malloc(sizeof(float)*(n+1)); for(i=0;i a[i]=(float*)malloc(sizeof(float)*(n+1)); printf("请输入三对角矩阵: \n"); for(i=1;i for(j=1;j scanf("%f",&a[i][j]); for(i=1;i for(j=1;j b=(float*)malloc(sizeof(float)*(n+1)); printf("请输入等号右边的值: \n"); for(i=1;i scanf("%f",&b[i]); x=(float*)malloc(sizeof(float)*(n+1)); printf("请输入初始的x: "); for(i=1;i scanf("%f",&x[i]); printf("请输入精确度: "); scanf("%f",&p); printf("请输入迭代次数: "); scanf("%d",&c); printf("请输入w(0 \n"); scanf("%f",&w); SOR(x); printf("方程的结果为: \n"); for(i=1;i printf("x[%d]=%f\n",i,x[i]); } 程序运行结果讨论和分析: ①迭代法具有需要计算机的存贮单元较少,程序设计简单,原始系数矩阵在计算过程中始终不变等优点. ②迭代法在收敛性及收敛速度等方面存在问题. [注: A必须满足一定的条件下才能运用以下三种迭代法之一.在Jacobi中不用产生的新数据信息,每次都要计算一次矩阵与向量的乘法,而在Gauss利用新产生的信息数据来计算矩阵与向量的乘法.在SOR中必须选择一个最佳的松弛因子,才能使收敛加速.] 经过计算可知Gauss-Seidel方法比Jacobi方法剩点计算量,也是Jacobi方法的改进.可是精确度底,计算量高,费时间,需要改进.SOR是进一步改进Gauss-Seidel而得到的比Jacobi,Gauss-Seidel方法收敛速度快,综合性强.改变松弛因子的取值范围来可以得到Jacobi,Gauss-Seidel方法. ③选择一个适当的松弛因子是关键. 结论: 线性方程组1和2对于Jacobi迭代法,Gauss-Seidol迭代法和SOR方法均不收敛,线性方程组3收敛。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 线性方程组 迭代法 报告