实验五 线性方程组的迭代法实验
- 格式:doc
- 大小:179.50 KB
- 文档页数:8
迭代法解线性方程组数值分析实验报告一、实验目的本次实验旨在深入研究和掌握迭代法求解线性方程组的基本原理和方法,并通过数值实验分析其性能和特点。
具体目标包括: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。
(完整word版)迭代法解线性方程组-数值分析实验报告编辑整理:尊敬的读者朋友们:这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望((完整word版)迭代法解线性方程组-数值分析实验报告)的内容能够给您的工作和学习带来便利。
同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快业绩进步,以下为(完整word版)迭代法解线性方程组-数值分析实验报告的全部内容。
数学与计算科学学院《数值分析》课程设计题目:迭代法解线性方程组专业:信息与计算科学学号: 1309302—24姓名:谭孜指导教师:郭兵成绩:二零一六年六月二十日一、前言:(目的和意义)1.实验目的①掌握用迭代法求解线性方程组的基本思想和步骤.②了解雅可比迭代法,高斯—赛德尔法和松弛法在求解方程组过程中的优缺点。
2。
实验意义迭代法是用某种极限过程去逐步逼近线性方程组精确解的方法,它是解高阶稀疏方程组的重要方法。
迭代法的基本思想是用逐次逼近的方法求解线性方程组。
比较雅可比迭代法,高斯—赛德尔迭代方法和松弛法,举例子说明每种方法的试用范围和优缺点并进行比较.二、数学原理:设有方程组b Ax = …① 将其转化为等价的,便于迭代的形式f Bx x += …② (这种转化总能实现,如令b f A I B =-=,), 并由此构造迭代公式f Bx x k k +=+)()1( …③ 式中B 称为迭代矩阵,f 称为迭代向量。
对任意的初始向量)0(x ,由式③可求得向量序列∞0)(}{k x ,若*)(lim x x k k =∞→,则*x 就是方程①或方程②的解。
此时迭代公式②是收敛的,否则称为发散的。
构造的迭代公式③是否收敛,取决于迭代矩阵B 的性 1。
雅可比迭代法基本原理设有方程组),,3,2,1(1n i b x a j j nj ij ==∑= …①矩阵形式为b Ax =,设系数矩阵A 为非奇异矩阵,且),,3,2,1(,0n i a ii =≠从式①中第i 个方程中解出x,得其等价形式)(111j nj j ij ii i x a b a x ∑≠=-= …②取初始向量),,,()0()0(2)0(1)0(n x x x x =,对式②应用迭代法,可建立相应的迭代公式: )(111)()1(∑≠=++-=nj j i k j ij ii k ib x a a x…③ 也可记为矩阵形式:J x J k F B x k +==)()1( …④ 若将系数矩阵A 分解为A=D —L-U ,⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡----⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=--=--00000000000000111211212211212222111211n n n nn n nn nn n n n n a a a a a a a a a a a a a a a a a a U L D A式中⎪⎪⎪⎪⎪⎭⎫⎝⎛=nn a a a D2211,⎪⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=-0000121323121nn n n a a a a a a L ,⎪⎪⎪⎪⎪⎪⎭⎫⎝⎛=-0000122311312n n n n a a a a a a U 。
《计算方法》实验报告学院:信息学院专业:计算机科学与技术指导教师:郭卫斌班级学号: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收敛。
数值分析课程实验报告实验名称 线性方程组的迭代解法Ax b =的系数矩阵对角线元素容许误差。
雅可比(Jacobi )迭代法解方程组的算法描述如下:任取初始向量(0)(0)1(xx =1+,并且 1,2,...,n ,计算 11(ni j ii j ib a a =≠-∑()k x ,结束;否则执行④,则不收敛,终止程序;否则转② 迭代法的算法描述)迭代法中,如果当新的分量求出后,马上用它来代替旧的分量,则可能会更快地接近方程组的准确解。
基于这种设想构造的迭代公式,n ,k = (2)算法可相应地从雅可比(Jacobi )迭代法改造得到(Gauss-Seidel)迭代得到的值进一()()()1((1k i ii k k i i x b a x x ωω==+-1,2,,n ,2,k =(3)为松弛因子(显然当1ω=塞德尔迭代公式) ()k ix 通常优于旧值(1)k ix -,在将两者加工成松弛值时,自然要求松弛因子1ω>,以尽量发挥新值的优势,这类迭代就称为逐次超松弛迭代法。
SOR 迭代的关键在于选取合适的松弛因子,松弛因子的取值对收敛速度影响很大,但如何选取最佳松弛因子的问题,至今仍未有效解决,在实际计算时,通常依据系数矩阵的特点,并结合以往的经验选取合适的松弛因子。
练习与思考题分析解答(0)(1,1,1,1)x =[ -0.999976, -0.999976, -0.999976, -0.999976]x =[ -0.99999, -0.999991, -0.999992, -0.999993]x =塞德尔迭代算法的收敛速度要比雅可比迭代算法的收敛速度快SOR 迭代实质上是高斯原理和基本方法相同。
如果选择合适的松弛因子,它能够加快收敛速度。
SOR 迭代算法更加普通,当选取一个合适的松弛因子后收敛速度明显加快。
迭代算法将前一步的结果[ -0.99999, -0.999991, -0.999992, -0.999993]x =[ -0.999992, -0.999993, -0.999994, -0.999995]x =[ -0.999993, -0.999994, -0.999995, -0.999995]x =[ -0.999992, -0.999993, -0.999994, -0.999995]x =[ -0.999999, -1.0, -1.0, -1.0]x =[ -0.999999, -1.0, -1.0, -1.0]x =因为为了保证迭代过程收敛,松弛因子1.3左右。
《计算方法》实验报告
学院:信息学院
专业:计算机科学与技术
指导教师:郭卫斌
班级学号: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 ,要求精度5
10-=ε:
⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤
⎢
⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---------------62605041
1
141010014001100410010141001014654321x 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>emg
for i=1:n
sum=0;
for j=1:n
if i~=j
sum=sum+A(i,j)*x1(j);
end
end
x2(i)=(b(i)-sum)/A(i,i);
end
r=max(abs(x2-x1));
x1=x2;
k=k+1;
if k>N
disp('迭代失败,返回');
return;
end
end
x=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>emg
for i=1:n
sum=0;
for j=1:n
if j>i
sum=sum+A(i,j)*x1(j);
elseif j<i
sum=sum+A(i,j)*x2(j);
end
end
x2(i)=(b(i)-sum)/A(i,i);
end
r=max(abs(x2-x1));
x1=x2;
k=k+1;
if k>N
disp('迭代失败,返回');
return;
end
end
x=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>emg
for i=1:n
sum=0;
for j=1:n
if j>=i
sum=sum+A(i,j)*x1(j);
elseif j<i
sum=sum+A(i,j)*x2(j);
end
end
x2(i)=x1(i)+w*(b(i)-sum)/A(i,i);
end
r=max(abs(x2-x1));
x1=x2;
k=k+1;
if k>N
disp('迭代失败,返回');
return;
end
end
x=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迭代法收敛速度快。
一般来说,Gauss-Seidel迭代法比Jacobi迭代法收敛要快,但有时反而比Jacobi迭代法要慢,而且Jacobi迭代法更易于优化。
因此,两种方法各有优缺点,使用时要根据所需适当选取。
当松弛因子为1时,超松弛迭代方法等同于Gauss-Seidel迭代法,这和理论推导完全相同。
另外,超松弛迭代法的收敛速度完全取决于松弛因子的选取,一个适当的因子能大大提高收敛速度。