实验五 解线性方程组的迭代法
一、问题提出
对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。
二、要求
1、体会迭代法求解线性方程组,并能与消去法做以比较;
2、分别对不同精度要求,如345
10,10,10ε---=由迭代次数体会该迭代法的收敛快慢;
3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;
4、给出各种算法的设计程序和计算结果。
三、目的和意义
1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;
2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;
3、体会上机计算时,终止步骤(1)k k x
x ε+∞-<或k >(给予的迭代次数)
,对迭代法敛散性的意义;
4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。
四、实验学时:2学时
五、实验步骤:
1.进入C 或matlab 开发环境;
2.根据实验容和要求编写程序;
3.调试程序;
4.运行程序;
5.撰写报告,讨论分析实验结果.
解:
J迭代算法:
程序设计流程图:
源程序代码:
#include
#include
#include
void main()
{
float a[50][51],x1[50],x2[50],temp=0,fnum=0;
int i,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 const int m=11; void main() { int choice=1; while(choice==1) { double a[m][m],b[m],e,x[m],y[m],w,se,max; int n,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矩阵*/ float p; /*精确度*/ float w; /*松弛因子*/ int n; /*未知数个数*/ int c; /*最大迭代次数*/ int k=1; /*实际迭代次数*/ /**********SOR迭代法**********/ void SOR(float xk[]) { int i,j; float t=0.0; float tt=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("\nReach the given precision!\n"); else printf("\nover the maximal count!\n"); printf("\nCount number is %d\n",k); } else if(t>p) { k++; SOR(xk); } else { printf("\nReach the given precision!\n"); printf("\nCount number is %d\n",k); } } /**********程序*****开始**********/ void main() { int i,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 scanf("%f",&w); SOR(x); printf("方程的结果为:\n"); for(i=1;i printf("x[%d]=%f\n",i,x[i]); }