实验五 解线性方程组的迭代法报告
- 格式:doc
- 大小:183.04 KB
- 文档页数:10
迭代法解线性方程组数值分析实验报告一、实验目的本次实验旨在深入研究和掌握迭代法求解线性方程组的基本原理和方法,并通过数值实验分析其性能和特点。
具体目标包括:1、理解迭代法的基本思想和迭代公式的推导过程。
2、掌握雅克比(Jacobi)迭代法、高斯赛德尔(GaussSeidel)迭代法和超松弛(SOR)迭代法的算法实现。
3、通过实验比较不同迭代法在求解不同类型线性方程组时的收敛速度和精度。
4、分析迭代法的收敛性条件和影响收敛速度的因素。
二、实验原理1、线性方程组的一般形式对于线性方程组$Ax = b$,其中$A$ 是$n×n$ 的系数矩阵,$x$ 是$n$ 维未知向量,$b$ 是$n$ 维常向量。
2、迭代法的基本思想迭代法是从一个初始向量$x^{(0)}$出发,按照某种迭代公式逐步生成近似解序列$\{x^{(k)}\}$,当迭代次数$k$ 足够大时,$x^{(k)}$逼近方程组的精确解。
3、雅克比迭代法将系数矩阵$A$ 分解为$A = D L U$,其中$D$ 是对角矩阵,$L$ 和$U$ 分别是下三角矩阵和上三角矩阵。
雅克比迭代公式为:$x^{(k+1)}= D^{-1}(b +(L + U)x^{(k)})$。
4、高斯赛德尔迭代法在雅克比迭代法的基础上,每次计算新的分量时立即使用刚得到的最新值,迭代公式为:$x_i^{(k+1)}=(b_i \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}\sum_{j=i+1}^{n}a_{ij}x_j^{(k)})/a_{ii}$。
5、超松弛迭代法在高斯赛德尔迭代法的基础上引入松弛因子$\omega$,迭代公式为:$x_i^{(k+1)}= x_i^{(k)}+\omega((b_i \sum_{j=1}^{i-1}a_{ij}x_j^{(k+1)}\sum_{j=i}^{n}a_{ij}x_j^{(k)})/ a_{ii} x_i^{(k)})$。
解线性方程组的迭代法数值计算上机实习报告一.综述:考虑用迭代法求解线性方程组,取真解为,初始向量取为零,以范数为度量工具,取误差指标为.其中。
分别完成下面各小题:第六题:编制程序实现Jacobi迭代方法和Gauss-Seidel 方法。
对应不同的停机标准(例如残量,相邻误差,后验误差停机标准),比较迭代次数以及算法停止时的真实误差。
其中残量准则:、相邻误差准则:后验误差停机准则:解:为了结果的可靠性,这里我分别对矩阵阶数为400、2500、10000进行试验,得到对应不同的方法、取不同的停机标准,迭代次数和真实误差的数据如下:分析上面数据可知,对应不同的停机标准,GS方法的迭代次数都近似为J方法的一半,这与理论分析一致。
而且从迭代次数可以看出,在这个例子中,作为停机标准,最强的依次为后验误差,再到残量,再到相邻误差。
第七题:编写程序实现SOR 迭代方法。
以真实误差作为停机标准,数值观测SOR 迭代方法中松弛因子对迭代次数的影响,找到最佳迭代因子的取值。
解:本题中考虑n=50,即对2500阶的矩阵A。
由于我们已经知道要使SOR方法收敛,松弛因子需要位于。
下面来求SOR方法中对应的最佳松弛因子。
应用筛选法的思想,第一次我们取松弛因子,间距为0.05,得到的对应的图像如下,从图中可以看出迭代次数随着的增大,先减小后变大,这与理论相符。
同时可以看出最佳松弛因子.第二次将区间细分为10份,即取,可得下面第二幅图像,从图像中可以看出最佳松弛因子第八题:对于J 方法,GS方法和(带有最佳松弛因子的)SOR 方法,分别绘制误差下降曲线以及残量的下降曲线(采用对数坐标系),绘制(按真实误差)迭代次数与矩阵阶数倒数的关系;解:对于J方法,考虑n=50时,采用相邻误差为迭代的终止条件,误差下降曲线及残量的下降曲线如下:对于GS方法,考虑n=50的时候,采用相邻误差作为迭代的终止条件,所得到的残量和误差的下降曲线如下图:从中可以看出,当相邻误差满足误差指标时,真实误差却并不小于误差指标,而为2.6281e-04。
《解线性方程组的VRP-GMRES(m)迭代法》篇一一、引言在科学计算和工程领域,线性方程组的求解是一个重要的研究课题。
传统的解法如高斯消元法、LU分解法等,在处理大规模或复杂问题时往往显得效率低下。
近年来,迭代法因其高效性和适应性,在求解线性方程组中得到了广泛应用。
其中,VRP-GMRES(m)迭代法因其收敛速度快、适用范围广等优点而备受关注。
本文旨在介绍VRP-GMRES(m)迭代法的原理、步骤及其在解线性方程组中的应用。
二、VRP-GMRES(m)迭代法原理VRP-GMRES(m)迭代法是一种基于Krylov子空间的迭代算法,用于求解线性方程组Ax=b。
该方法通过构造一系列的Krylov子空间,逐步逼近解向量x。
与传统的GMRES算法相比,VRP-GMRES(m)在每一步迭代中引入了重启策略和预处理技术,从而提高了算法的稳定性和收敛速度。
三、VRP-GMRES(m)迭代法步骤1. 初始化:选择一个初始向量x0和初始残差r0=b-Ax0。
2. 构建Krylov子空间:通过迭代过程,构建一系列的Krylov 子空间Vn,其中n为迭代次数。
3. 最小二乘问题求解:在每个Krylov子空间中,求解最小二乘问题以获得搜索方向。
4. 重启策略:当达到预设的重启次数m时,重新开始新一轮的迭代过程。
5. 预处理技术:在迭代过程中引入预处理技术,如Jacobi预处理、SOR预处理等,以提高算法的稳定性和收敛速度。
6. 终止条件:当残差满足预设的终止条件时,停止迭代,输出解向量x。
四、VRP-GMRES(m)迭代法在解线性方程组中的应用VRP-GMRES(m)迭代法广泛应用于各种工程和科学计算领域,如流体动力学、电磁场计算、结构力学等。
通过引入重启策略和预处理技术,该方法可以有效地处理大规模、复杂和病态的线性方程组。
与传统的迭代法和直接法相比,VRP-GMRES(m)具有更高的计算效率和更好的稳定性。
此外,该方法还可以根据具体问题的特点进行定制化改进,以满足不同领域的需求。
《计算方法》实验报告学院:信息学院专业:计算机科学与技术指导教师:郭卫斌班级学号:10101438 计102姓名:闻翰计算机科学与工程系实验五 线性方程组的迭代法实验一. 实验目的(1)深入理解线性方程组的迭代法的设计思想,学会利用系数矩阵的性质以保证迭代过程的收敛性,以及解决某些实际的线性方程组求解问题。
(2)熟悉Matlab 编程环境,利用Matlab 解决具体的方程求根问题。
二. 实验要求建立Jacobi 迭代公式、Gauss-Seidel 迭代公式和超松弛迭代公式,用Matlab 软件实现线性方程组求解的Jacobi 迭代法、Gauss-Seidel 迭代法和超松弛迭代法,并用实例在计算机上计算。
三. 实验内容1. 实验题目(1)分别利用Jacobi 迭代和Gauss-Seidel 迭代求解下列线性方程组,取()T 0,0,0,0,0,0=x ,要求精度510-=ε:⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---------------626050411141010014001100410010141001014654321x x x x x x(2)分别取1=ω、1.05、1.1、1.25和1.8,用超松弛法求解上面的方程组,要求精度为510-=ε。
2. 设计思想 1.Jacobi 迭代:Jacobi 迭代的设计思想是将所给线性方程组逐步对角化,将一般形式的线性方程组的求解归结为对角方程组求解过程的重复。
2.Gauss-Seidel 迭代:Gauss-Seidel 迭代的设计思想是将一般形式的线性方程组的求解过程归结为下三角方程组求解过程的重复。
3.超松弛迭代:基于Gauss-Seidel 迭代,对i=1,2,…反复执行计算迭代公式,即为超松弛迭代。
3. 对应程序 1.Jacobi 迭代:function [x,k]=Jacobimethod(A,b,x0,N,emg)%A 是线性方程组的左端矩阵,b 是右端向量,x0是迭代初始值% N表示迭代次数上限,emg表示控制精度,k表示迭代次数,x是解n=length(A);x1=zeros(n,1);x2=zeros(n,1);x1=x0;k=0;r=max(abs(b-A*x1));while r>emgfor i=1:nsum=0;for j=1:nif i~=jsum=sum+A(i,j)*x1(j);endendx2(i)=(b(i)-sum)/A(i,i);endr=max(abs(x2-x1));x1=x2;k=k+1;if k>Ndisp('迭代失败,返回');return;endendx=x1;2.Gauss-Seidel迭代:function [x,k]=Gaussmethod(A,b,x0,N,emg)%A是线性方程组的左端矩阵,b是右端向量,x0是迭代初始值% N表示迭代次数上限,emg表示控制精度,k表示迭代次数,x是解n=length(A);x1=zeros(n,1);x2=zeros(n,1);x1=x0;r=max(abs(b-A*x1));k=0;while r>emgfor i=1:nsum=0;for j=1:nif j>isum=sum+A(i,j)*x1(j);elseif j<isum=sum+A(i,j)*x2(j);endendx2(i)=(b(i)-sum)/A(i,i);endr=max(abs(x2-x1));x1=x2;k=k+1;if k>Ndisp('迭代失败,返回');return;endendx=x1;3.超松弛(SOR)迭代:function [x,k]=SORmethod(A,b,x0,N,emg,w)%A是线性方程组的左端矩阵,b是右端向量,x0是迭代初始值% N表示迭代次数上限,emg表示控制精度,k表示迭代次数,x是解%w表示松弛因子n=length(A);x1=zeros(n,1);x2=zeros(n,1);x1=x0;r=max(abs(b-A*x1));k=0;while r>emgfor i=1:nsum=0;for j=1:nif j>=isum=sum+A(i,j)*x1(j);elseif j<isum=sum+A(i,j)*x2(j);endendx2(i)=x1(i)+w*(b(i)-sum)/A(i,i);endr=max(abs(x2-x1));x1=x2;k=k+1;if k>Ndisp('迭代失败,返回');return;endendx=x1;4. 实验结果1.Jacobi迭代:2.Gauss-Seidel迭代:3.超松弛(SOR)迭代:w=1:w=1.05:w=1.1:w=1.25:w=1.8:四.实验体会在同等精度下,Gauss-Seidel迭代法比Jacobi迭代法收敛速度快。
实验五 解线性方程组的迭代法一、问题提出对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。
二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如34510,10,10ε---=由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。
三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(1)k k xx ε+∞-<或k>(给予的迭代次数),对迭代法敛散性的意义;4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。
四、实验学时:2学时五、实验步骤:1.进入C 或matlab 开发环境;2.根据实验内容和要求编写程序;3.调试程序;4.运行程序;5.撰写报告,讨论分析实验结果.解:J迭代算法:程序设计流程图:源程序代码:#include<stdlib.h>#include<stdio.h>#include<math.h>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<n+1;i++)x1[i]=0;printf("输入方程组的系数矩阵:\n");for(i=1;i<n+1;i++){j=1;while(j<n+1){scanf("%f",&a[i][j]);j++;}}printf("输入方程组的常数项:\n");for(i=1;i<n+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<n+1;i++){for(j=1;j<n+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<n+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<n+1;i++)x1[i]=x2[i];m--;}printf("原方程组的解为:\n");for(i=1;i<n+1;i++){if((x1[i]-x2[i])<=e||(x2[i]-x1[i])<=e){printf("x%d=%7.4f ",i,x1[i]);}}}运行结果:GS迭代算法:#include<iostream.h>#include<math.h>#include<stdio.h>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迭代法"<<endl;cout<<"请输入方程的个数:";cin>>n;for(i=1;i<=n;i++){cout<<"请输入第"<<i<<"个方程的各项系数:"; 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<e){cout<<endl;for(i=1;i<=n;i++)cout<<"x"<<i<<"="<<y[i]<<endl; break;}for(i=1;i<=n;i++){x[i]=y[i];}}if(k==N)cout<<"迭代失败!!"<<endl;choice=0;}}SOR方法:# include <stdio.h># include <math.h>#include<stdlib.h>/**********定义全局变量**********/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<n+1;i++){t=0.0;tt=0.0;for(j=1;j<i;j++)t=t+a[i][j]*xl[j];for(j=i;j<n+1;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<n+1;i++){tt=fabs(xl[i]-xk[i]);tt=tt*tt;t+=tt;}t=sqrt(t);for(i=1;i<n+1;i++)xk[i]=xl[i];if(k+1>c){if(t<=p)printf("\nReach the given precision!\n"); elseprintf("\nover the maximal count!\n");printf("\nCount number is %d\n",k);}elseif(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<n+1;i++)a[i]=(float*)malloc(sizeof(float)*(n+1));printf("请输入三对角矩阵:\n");for(i=1;i<n+1;i++)for(j=1;j<n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<n+1;i++)for(j=1;j<n;j++)b=(float *)malloc(sizeof(float)*(n+1)); printf("请输入等号右边的值:\n");for(i=1;i<n+1;i++)scanf("%f",&b[i]);x=(float *)malloc(sizeof(float)*(n+1)); printf("请输入初始的x:");for(i=1;i<n+1;i++)scanf("%f",&x[i]);printf("请输入精确度:");scanf("%f",&p);printf("请输入迭代次数:");scanf("%d",&c);printf("请输入w(0<w<2):\n");scanf("%f",&w);SOR(x);printf("方程的结果为:\n");for(i=1;i<n+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收敛。
仿真平台与工具应用实践Jacobi迭代法求解线性方程组实验报告院系:专业班级:姓名:学号:指导老师:一、实验目的熟悉Jacobi迭代法原理;学习使用Jacobi迭代法求解线性方程组;编程实现该方法;二、实验内容应用Jacobi迭代法解如下线性方程组:, 要求计算精度为三、实验过程(1)、算法理论迭代格式的引出是依据迭代法的基本思想: 构造一个向量系列, 使其收敛至某个极限, 则就是要求的方程组的准确解。
Jacobi迭代将方程组:在假设, 改写成如果引用系数矩阵, 及向量, , ,方程组(1)和(2)分别可写为: 及, 这样就得到了迭代格式用迭代解方程组时, 就可任意取初值带入迭代可知式, 然后求。
但是, 比较大的时候, 写方程组和是很麻烦的, 如果直接由, 能直接得到, 就是矩阵与向量的运算了, 那么如何得到, 呢?实际上, 如果引进非奇异对角矩阵将分解成:要求的解, 实质上就有而是非奇异的, 所以存在, 从而有我们在这里不妨令就得到迭代格式:(2)算法框图(3)、算法程序m 文件:function x=jacobi(A,b,P,delta,n)N=length(b); %返回矩阵b的最大长度for k=1:nfor j=1:Nx(j)=(b(j)-A(j,[1:j-1,j+1:N])*P([1:j-1,j+1:N]))/A(j,j);enderr=abs(norm(x'-P)); %求(x'-P)模的绝对值P=x';if(err<delta) %判断是否符合精度要求break;endendE=eye(N,N); %产生N行N列矩阵D=diag(diag(A));f=A*inv(D); %f是A乘D的逆矩阵B=E-f;Px=x';k,errBMATLAB代码:>> clear allA=[4, -1, 1;4, -8, 1;-2, 1, 5];b=[7, -21, 15]';P=[0,0,0]';x=jacobi(A,b,P,1e-7,20)(4)、算法实现用迭代法求解方程组:正常计算结果是2, 3, 4 , 下面是程序输出结果:P =2.00004.00003.0000k =17err =9.3859e-008B =0 -0.1250 -0.2000-1.0000 0 -0.20000.5000 0.1250 0x =2.00004.00003.0000四、实验体会五、MATLAB是非常实用的软件, 能够避免大量计算, 简化我们的工作, 带来便捷。
1 / 8数值分析实验六:解线性方程组的迭代法2016113 张威震1 病态线性方程组的求解1.1 问题描述理论的分析表明,求解病态的线性方程组是困难的。
实际情况是否如此,会出现怎样的现象呢?实验内容:考虑方程组Hx=b 的求解,其中系数矩阵H 为Hilbert 矩阵,,,1(),,,1,2,,1i j n n i j H h h i j n i j ⨯===+-这是一个著名的病态问题。
通过首先给定解(例如取为各个分量均为1)再计算出右端b 的办法给出确定的问题。
实验要求:(1)选择问题的维数为6,分别用Gauss 消去法、列主元Gauss 消去法、J 迭代法、GS 迭代法和SOR 迭代法求解方程组,其各自的结果如何?将计算结果与问题的解比较,结论如何?(2)逐步增大问题的维数(至少到100),仍然用上述的方法来解它们,计算的结果如何?计算的结果说明了什么?(3)讨论病态问题求解的算法1.2 算法设计首先编写各种求解方法的函数,Gauss 消去法和列主元高斯消去法使用实验5中编写的函数myGauss.m 即可,Jacobi 迭代法函数文件为myJacobi.m ,GS 迭代法函数文件为myGS.m ,SOR 方法的函数文件为mySOR.m 。
1.3 实验结果1.3.1 不同迭代法球求解方程组的结果比较选择H 为6*6方阵,方程组的精确解为x* = (1, 1, 1, 1, 1, 1)T ,然后用矩阵乘法计算得到b ,再使用Gauss 顺序消去法、Gauss 列主元消去法、Jacobi 迭代法、G-S 迭代法和SOR 方法分别计算得到数值解x1、x2、x3、x4,并计算出各数值解与精确解之间的无穷范数。
Matlab 脚本文件为Experiment6_1.m 。
迭代法的初始解x 0 = (0, 0, 0, 0, 0, 0)T ,收敛准则为||x(k+1)-x(k)||∞<eps=1e-6,SOR方法的松弛因子选择为w=1.3,计算结果如表1。
实验五 解线性方程组的迭代法一、问题提出对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。
二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如34510,10,10ε---=由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。
三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(1)k k xx ε+∞-<或k >(给予的迭代次数),对迭代法敛散性的意义;4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。
四、实验学时:2学时五、实验步骤:1.进入C 或matlab 开发环境;2.根据实验内容和要求编写程序;3.调试程序;4.运行程序;5.撰写报告,讨论分析实验结果.解:J迭代算法:程序设计流程图:源程序代码:#include<stdlib.h>#include<stdio.h>#include<math.h>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<n+1;i++)x1[i]=0;printf("输入方程组的系数矩阵:\n");for(i=1;i<n+1;i++){j=1;while(j<n+1){scanf("%f",&a[i][j]);j++;}}printf("输入方程组的常数项:\n");for(i=1;i<n+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<n+1;i++){for(j=1;j<n+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<n+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<n+1;i++)x1[i]=x2[i];m--;}printf("原方程组的解为:\n");for(i=1;i<n+1;i++){if((x1[i]-x2[i])<=e||(x2[i]-x1[i])<=e){printf("x%d=%7.4f ",i,x1[i]);}}}运行结果:GS迭代算法:#include<iostream.h>#include<math.h>#include<stdio.h>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迭代法"<<endl;cout<<"请输入方程的个数:";cin>>n;for(i=1;i<=n;i++){cout<<"请输入第"<<i<<"个方程的各项系数:"; 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<e){cout<<endl;for(i=1;i<=n;i++)cout<<"x"<<i<<"="<<y[i]<<endl; break;}for(i=1;i<=n;i++){x[i]=y[i];}}if(k==N)cout<<"迭代失败!!"<<endl;choice=0;}}SOR方法:# include <stdio.h># include <math.h>#include<stdlib.h>/**********定义全局变量**********/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<n+1;i++){t=0.0;tt=0.0;for(j=1;j<i;j++)t=t+a[i][j]*xl[j];for(j=i;j<n+1;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<n+1;i++){tt=fabs(xl[i]-xk[i]);tt=tt*tt;t+=tt;}t=sqrt(t);for(i=1;i<n+1;i++)xk[i]=xl[i];if(k+1>c){if(t<=p)printf("\nReach the given precision!\n"); elseprintf("\nover the maximal count!\n");printf("\nCount number is %d\n",k);}elseif(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<n+1;i++)a[i]=(float*)malloc(sizeof(float)*(n+1));printf("请输入三对角矩阵:\n");for(i=1;i<n+1;i++)for(j=1;j<n+1;j++)scanf("%f",&a[i][j]);for(i=1;i<n+1;i++)for(j=1;j<n;j++)b=(float *)malloc(sizeof(float)*(n+1)); printf("请输入等号右边的值:\n");for(i=1;i<n+1;i++)scanf("%f",&b[i]);x=(float *)malloc(sizeof(float)*(n+1)); printf("请输入初始的x:");for(i=1;i<n+1;i++)scanf("%f",&x[i]);printf("请输入精确度:");scanf("%f",&p);printf("请输入迭代次数:");scanf("%d",&c);printf("请输入w(0<w<2):\n");scanf("%f",&w);SOR(x);printf("方程的结果为:\n");for(i=1;i<n+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收敛。