迭代法解线性方程组
- 格式:pdf
- 大小:220.25 KB
- 文档页数:5
第二章解线性代数方程组的迭代法2. 1 引言在许多实际问题中,常常需要求解这样的线性代数方程组,它的系数矩阵数很高,但非零元素很少,人们称其为大型稀疏线性代数方程组,对于这类方程组,如果它乂不具有带状性,那么,再用直接法求解就不太有效,因为用直接法进行消元或矩阵的三角分解时,没有考虑到系数矩阵的稀疏性,破坏了系数矩阵的形状,导致了计算量的增加和存储单元的浪费,于是,人们常用迭代法求解大型稀疏线性代数方程组。
迭代法只需要存储系数矩阵的非零元素,这样,占用内存在单元较少,能解高阶线性代数方程组。
山于迭代法是通过逐次迭代来逼近方程组的解,因此,收敛性和收敛速度是构造迭代法时要注意的问题。
那么,是否可以构造一种适用于一般情况的迭代法呢?回答是否定的,这是因为不同的系数矩阵具有不同的性态,一般地,每一种迭代法都具有一定的适用范围,在本章的学习中将会看到,有时,某种方法对一类方程组迭代收敛,而对另一类方程组进行迭代时就会发散。
因此,我们应该学会针对具有不同性质的线性代数方程组,构造合适的迭代方法。
本章主要介绍一些基本的迭代法,并在一定的范围内讨论其中儿种方法的收敛法。
2. 2 基本迭代法考虑线性方程组如坷+如勺+…+气兀”二勺a2t x i+a22x2 + - + a2…x n =b2■•••••••••••(2. 1)采用矩阵和向量记号,我们可以把(2.1)式写成Ax = h(2.2)其中,为非奇异矩阵,设下面我们介绍雅可比(Jacobi)迭代,高斯-塞德尔(Gauss-Seidel)迭代与S0R迭代以及SS0R迭代的基本思想和算法。
为了方便地给出矩阵表示式,我们引进下列矩阵分裂:4SD-U,(2.3)其中-a2\-a n\(1)雅可比迭代的基本思想从式(2.1)的第i个方程中解出X t=(/ = 1,2,•••,«)我们把迭代前面的值代入上式右边,山计算得到等式左边的值作为一次迭代的新值,然后再把这个新值代入右边,再从左边得到一个新值,如此反复,就得到了雅可比迭代公式。
实验三 迭代法解线性方程组实验目的学会用Jacobi 迭代法、Gauss-Seidel 迭代法和超松驰迭代法求线性方程组解。
学会对迭代法做收敛性分析,研究求方程组解的最优迭代方法。
学会用共轭梯度法求线性方程组的解,研究共轭梯度法的计算效率。
实验要求按照题目要求完成实验内容。
写出相应的Matlab 程序。
给出实验结果。
对实验结果进行分析讨论。
写出相应的实验报告。
实验步骤1、研究Jacobi 迭代法求解线性方程组的方法和相应的收敛性。
(1)用Jacobi 迭代法(Jacobi.m )求解线性方程组⎪⎪⎩⎪⎪⎨⎧-=+--=-+-=--71912263532311321321321x x x x x x x x x (4.31) 取初始点()()Tx 0,0,00=,精度要求为105-=ε。
请给出满足精度要求的迭代次数和相应的计算结果。
function [x,k]=jc(a,b,x0,ep,max)n=length(a);k=0;if nargin<5max=500;endif nargin<4ep=1e-5;endif nargin<3x0=zeros(n,1);y=zeros(n,1);endx=x0;x0=x+2*ep;while norm(x0-x,inf)>ep&&k<maxk=k+1;x0=x;for i=1:ny(i)=b(i);for j=1:nif j~=iy(i)=y(i)-a(i,j)*x0(j);endendif abs(a(i,i))<1e-10||k==maxwarning('a(i,i) ̫С');return ;endy(i)=y(i)/a(i,i);endx=y;endend>> a=[11 -3 -2;-1 5 -3;-2 -12 19];>> b=[3 6 -7]';>> [x,k]=jc(a,b)x =0.9999859531466561.9999778590069020.999978180649185k = 33研究相应迭代矩阵的谱半径和Jacobi 迭代的渐近收敛速度。
数值分析--第6章解线性方程组的迭代法第6章 解线性方程组的迭代法直接方法比较适用于中小型方程组。
对高阶方程组,即使系数矩阵是稀疏的,但在运算中很难保持稀疏性,因而有存储量大,程序复杂等不足。
迭代法则能保持矩阵的稀疏性,具有计算简单,编制程序容易的优点,并在许多情况下收敛较快。
故能有效地解一些高阶方程组。
1 迭代法概述迭代法的基本思想是构造一串收敛到解的序列,即建立一种从已有近似解计算新的近似解的规则。
由不同的计算规则得到不同的迭代法。
迭代法的一般格式(1)()(1)()(,,,),0,1,k k k k m kF k +--==x x x x式中(1)k +x 与()(1)(),,,k k k m --x x x 有关,称为多步迭代法。
若(1)k +x 只与()k x 有关,即(1)()(),0,1,k k kF k +==x x称为单步迭代法。
再设kF 是线性的,即(1)(),0,1,k kk kk +=+=x B x f式中n nk ⨯∈B R ,称为单步线性迭代法。
kB 称为迭代矩阵。
若k B 和kf 与k 无关,即(1)(),0,1,k k k +=+=x Bx f称为单步定常线性迭代法。
本章主要讨论具有这种形式的各种迭代方法。
1.1 向量序列和矩阵序列的极限由于nR 中的向量可与nR 的点建立——对应关系,由点列的收敛概念及向量范数的等价性,可得到向量序列的收敛概念。
定义6.1 设(){}k x 为n R 中的向量序列,nx R ∈,如果()lim 0k k x x →∞-=其中为向量范数,则称序列(){}k x 收敛于x ,记为()lim k k x x →∞=。
定理6.1 nR 中的向量序列(){}k x 收敛于nR 中的向量x 当且仅当()lim (1,2,,)k i i k x x i n →∞==其中()()()()1212(,,,),(,,,)k k k k T Tnnx x x x x x x x ==。
简单迭代法求解线性方程组1.原理:将原线性方程组Ax=b中系数矩阵的主对角线移到一边并将其系数化为一,然后在给定迭代初值的情况下通过迭代的方法求解线性方程组的值。
2.C语言实现方式:(1)计算迭代矩阵:将系数矩阵的所有值分别处以各自所在行的主对角线值,然后将主对角线赋值为0。
(2)输入迭代初值,进行迭代将迭代初值存入y[n]矩阵,然后利用迭代式nn=nn+x[i][j]*y[j];y[i]=nn+b[i];经过有限次迭代得到误差要求以内的值3.源程序如下:#include<iostream>#include<math.h>#include<iomanip>using namespace std;#define kk 50 //定义最大方程元数int n,i,c,j,hh,gg,mm;double A[kk][kk],x[kk][kk],b[kk],y[kk],a[kk],z[kk],m,nn,d,e=1,w,fff ;void main(){cout<<"输入的方程元数"<<endl; //数据的输入cin>>n;cout<<"请输入方程系数矩阵:"<<endl;for(i=0;i<n;i++)for(j=0;j<n;j++)cin>>A[i][j];cout<<"请输入右边向量:"<<endl;for(i=0;i<n;i++)cin>>b[i];cout<<"输入你想要的迭代精度(建议1e-5以上)!"<<endl; cin>>fff;cout<<"输入最大迭代次数(建议300次以上)!"<<endl; cin>>mm;//计算出迭代矩阵for(i=0;i<n;i++){b[i]=b[i]/A[i][i];for(j=0;j<n;j++){if(i==j){x[i][i]=0;}else{x[i][j]=-A[i][j]/A[i][i];}}}//输出迭代矩阵cout<<"计算出迭代矩阵为:"<<endl;for(i=0;i<n;i++){for(j=0;j<n;j++)cout<<x[i][j]<<" ";cout<<b[i]<<" ";cout<<endl;}//赋迭代初值cout<<"输入迭代初值"<<endl;for(i=0;i<n;i++)cin>>y[i];int f=1;//简单迭代法cout<<" ";for(i=1;i<n+1;i++)cout<<'\t'<<"X["<<i<<"]"<<" "<<'\t';cout<<"精度";cout<<endl;cout<<"迭代初值为: ";cout<<setiosflags(ios::fixed);for(i=0;i<n;i++)cout<<y[i]<<" ";cout<<endl;while(e>fff){for(i=0;i<n;i++){z[i]=y[i];nn=0;for(j=0;j<n;j++){nn=nn+x[i][j]*y[j];y[i]=nn+b[i];}e=fabs(z[0]-y[0]);if(fabs(z[i]-y[i])>e)e=fabs(z[i]-y[i]);if(i==0){cout<<setiosflags(ios::fixed);cout<<"第"<<setw(3)<<setprecision(3)<<f++<<"次迭代"<<" "; }cout<<setiosflags(ios::fixed);cout<<setw(8)<<setprecision(8)<<y[i]<<" ";}cout<<e;cout<<endl;if(f>mm){cout<<"迭代次数大于"<<mm<<"次"<<endl;cout<<"认为方程发散,迭代不收敛"<<endl;exit(1);}}cout<<endl;cout<<endl;cout<<"方程迭代了"<<f-1<<"次,达到你所要求的精度"<<fff<<endl;cout<<"最后结果为:"<<endl;cout<<endl;for(i=0;i<n;i++){cout<<"X"<<"["<<i+1<<"]"<<"="<<y[i];cout<<endl;}exit(1);}4.实验数据和结果:按照提示依次输入方程元数,系数矩阵,右边向量和迭代初值。
计算方法3_线性方程组迭代解法线性方程组的迭代解法是解决线性方程组的一种常见方法,常用于大规模的线性方程组求解。
该方法通过不断迭代更新解的近似值,直到满足一定的收敛准则为止。
线性方程组的迭代解法有很多种,其中最经典的是雅可比迭代法、高斯-赛德尔迭代法和超松弛迭代法。
本文将分别介绍这三种迭代解法及其计算方法。
雅可比迭代法是一种比较简单的线性方程组迭代解法,它的基本思想是先将线性方程组转化为对角占优的形式,然后通过迭代求解逐渐接近精确解。
雅可比迭代法的迭代公式为:其中,x^(k+1)是第k+1次迭代的近似解,n是未知数的个数,a_ij 是系数矩阵A的元素,f_i是方程组的右端向量的元素。
雅可比迭代法的计算步骤如下:1.将线性方程组转化为对角占优的形式,即保证矩阵A的对角元素绝对值大于其它元素的绝对值。
2.初始化向量x^(0),设定迭代终止准则。
3.根据雅可比迭代公式,计算x^(k+1)。
4.判断迭代终止准则是否满足,如果满足,则停止迭代,返回近似解x^(k+1);否则,继续进行下一次迭代。
高斯-赛德尔迭代法是雅可比迭代法的改进方法,它的基本思想是在每次迭代计算x^(k+1)时,利用已经计算出的近似解作为x的一部分。
高斯-赛德尔迭代法的迭代公式为:其中,x^(k+1)_i是第k+1次迭代的近似解中第i个未知数的值,x^(k)_i是第k次迭代的近似解中第i个未知数的值。
高斯-赛德尔迭代法的计算步骤如下:1.将线性方程组转化为对角占优的形式。
2.初始化向量x^(0),设定迭代终止准则。
3.根据高斯-赛德尔迭代公式,计算x^(k+1)。
4.判断迭代终止准则是否满足,如果满足,则停止迭代,返回近似解x^(k+1);否则,继续进行下一次迭代。
超松弛迭代法是对高斯-赛德尔迭代法的一种改进方法,它引入了松弛因子ω,通过调整参数ω的值,可以加快迭代的收敛速度。
超松弛迭代法的迭代公式为:其中,0<ω<2,x^(k+1)_i是第k+1次迭代的近似解中第i个未知数的值,x^(k)_i是第k次迭代的近似解中第i个未知数的值。
线性方程组的迭代式求解方法迭代法解方程的基本原理1.概述把 Ax=b 改写成 x=Bx+f ,如果这一迭代格式收敛,对这个式子不断迭代计算就可以得到方程组的解。
道理很简单:对 x^{(k+1)}=bx^{(k)}+f 两边取极限,显然如果收敛,则最终得到的解满足 \lim_{k\rightarrow\infty } x^{(k)}=x^*=Bx^*+f ,从而必然满足原方程 Ax^*=b 。
迭代方法的本质在于这一次的输出可以当作下一次的输入,从而能够实现循环往复的求解,方法收敛时,计算次数越多越接近真实值。
2.收敛条件充要条件:迭代格式 x=Bx+f 收敛的充要条件是 \rho (B)<1充分条件: \Vert B\Vert <1即 \Vert B\Vert <1 \Rightarrow \rho(B)<1\Leftrightarrow 迭代收敛一、Jacobi迭代法怎样改写Ax=b ,从而进行迭代求解呢?一种最简单的迭代方法就是把第i行的 x_i 分离出来(假定 a_{ii} \ne 0 ):\sum_{j=1}^{n}a_{ij}x_j=b_i\Rightarrow x_i=\frac{b_i-\sum_{j=1,j\ne i}^{n}a_{ij}x_j}{a_{ii}}\quad \\这就是Jacobi(雅可比)迭代法。
迭代格式给定x^{(0)}=\left[x_1^{(0)},x_2^{(0)},\cdots,x_n^{(0)}\rig ht]^T ,则Jacobi法的迭代格式(也称分量形式)为x_i^{(k+1)}=\frac{1}{a_{ii}}\left ( {b_i-\sum_{j=1,j\ne i}^{n}a_{ij}x_j^{(k)}}\right),\quadi=1,2,\cdots,n\\矩阵形式设 A=D-L-U。
Jacobi法的矩阵形式(也称向量形式)为x^{(k+1)}=B_Jx^{(k)}+D^{-1}b\\其中迭代矩阵 B_J=D^{-1}(L+U)收敛条件\begin{eqnarray} \left. \begin{array}{lll} \VertB_J\Vert <1 \\ A 严格对角占优\\ A, 2D-A对称正定\end{array} \right \} \end{eqnarray} \Rightarrow \rho (B_J)<1\Leftrightarrow 迭代收敛特别地,若 A 对称正定且为三对角,则 \rho^2(B_J)=\rho (B_G)<1 。
仿真平台与工具应用实践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 雅克比法、赛得尔法、超松驰法 1.雅克比(Jacobi )迭代法 设有n 阶方程组⎪⎪⎩⎪⎪⎨⎧=+++=+++=+++nn nn n n n n n n b x a x a x a b x a x a x a b x a x a x a 22112222212111212111 (4.1)若系数矩阵非奇异,且0≠ii a (i = 1, 2,…, n ),将方程组(4.1)改写成()()()⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧----=----=----=--11,221112323122221213132121111111n n n n n n nn n n n n n x ax a x a b a x x a x a x a b a x x a x a x a b a x 然后写成迭代格式()()()⎪⎪⎪⎪⎩⎪⎪⎪⎪⎨⎧----=----=----=--+++)(11,)(22)(11)1()(2)(323)(121122)1(2)(1)(313)(212111)1(1111k n n n k n k n n nn k n k n n k k k k n n k k k x a x a x a b a x x a x a x a b a x x a x a x a b a x (4.2)(4。
2)式也可以简单地写为),,2,1(1)(1)1(n i x a b a x k j n i j j ij i iik i =⎪⎪⎪⎭⎫ ⎝⎛-=∑≠=+(4.3)对(4。
2)或(4。
3)给定一组初值Tn x x x X ),,()0()0(2)0(1)0( =后,经反复迭代可得到一向量序列T k n k k x x X),()()(1)( =,如果X (k )收敛于T n x x x X ),,(**2*1* =,则),,2,1(*n i x i =就是方程组(4。
数值分析第六章线性方程组迭代解法线性方程组是数值分析中的重要内容之一,其求解方法有很多种。
其中一种常用的方法是迭代解法,即通过不断迭代逼近方程组的解。
本文将介绍线性方程组迭代解法的基本思想和常用方法。
线性方程组可以用矩阵形式表示为Ax=b,其中A是系数矩阵,b是常数向量,x是未知向量。
线性方程组的解可以是唯一解,也可以是无穷多个解。
迭代解法的基本思想是通过不断迭代,并利用迭代序列的极限,逼近线性方程组的解。
迭代解法适用于大型的线性方程组,而直接求解法则适用于小型的线性方程组。
常用的迭代解法有雅可比迭代法、高斯-赛德尔迭代法和逐次超松弛迭代法。
雅可比迭代法是最简单的线性方程组迭代解法之一、它的基本思想是将线性方程组的每个方程都单独表示为未知数x的显式函数,然后通过不断迭代求解。
雅可比迭代法的迭代公式为:x(k+1)=D^(-1)(b-(L+U)x(k))其中,D是A的对角元素构成的对角矩阵,L是A的下三角矩阵,U 是A的上三角矩阵,x(k)是第k次迭代的解。
高斯-赛德尔迭代法是雅可比迭代法的改进版。
它的基本思想是将每个方程的解带入到下一个方程中,而不是等到所有方程都迭代完毕后再计算下一组解。
高斯-赛德尔迭代法的迭代公式为:x(k+1)=(D-L)^(-1)(b-Ux(k))其中,D是A的对角矩阵,L是A的下三角矩阵(除去对角线),U是A的上三角矩阵(除去对角线),x(k)是第k次迭代的解。
逐次超松弛迭代法是对高斯-赛德尔迭代法的改进。
它引入了松弛因子w,通过调节松弛因子可以加快收敛速度。
逐次超松弛迭代法的迭代公式为:x(k+1)=(D-wL)^(-1)[(1-w)D+wU]x(k)+w(D-wL)^(-1)b其中,D是A的对角矩阵,L是A的下三角矩阵(除去对角线),U是A的上三角矩阵(除去对角线),w是松弛因子,x(k)是第k次迭代的解。
线性方程组迭代解法需要设置迭代停止准则,通常可以设置迭代次数上限或者设置一个精度要求。
解线性方程组的迭代法设线性方程组为Ax b =其中,A 为n 阶非奇异矩阵,n x R ∈,n b R ∈,0b ≠。
当A 为低阶稠密矩阵,直接法是比较好的方法。
当A 为高阶稀疏矩阵,例如偏微分方程数值解所产生的方阵,这时采用迭代法比较合适了。
不过,这里所谓低阶与高阶并没有明显的分界,在高性能计算机面前,一万阶也不算高。
所谓稀疏矩阵,笼统地说,就是零元素占绝大多数的矩阵,反之就是稠密矩阵了。
1.迭代法的一般理论将Ax b =等价地改写为方程组x Gx f =+其实,就是将原方程组等价变形为不动点方程的格式,以便于进行不动点迭代。
任取初始向量(0)x ,作 (1)(0)x Gx f =+, (2)(1)x Gx f =+, ……(1)()k k x Gx f +=+,0,1,2,k =⋅⋅⋅G 称为迭代矩阵。
如果向量序列{}()k x 是收敛的,假设()*lim k k x x →∞=,或者()*lim 0k k x x →∞−=,则**x Gx f =+也就是说*x 是x Gx f =+的解,即Ax b =的解,而它与初始向量(0)x 的选取无关。
如何保证该向量序列收敛呢? 设误差()()*k k x x ε=−,则(1)(1)*()*()*()()()k k k k k x x Gx f Gx f G x x G εε++=−=+−+=−=,0,1,2,k =⋅⋅⋅因此,()(1)2(2)3(3)(0)k k k k k G G G G εεεεε−−−====⋅⋅⋅=,0,1,2,k =⋅⋅⋅为了保证对任意初始向量(0)x ,{}()k ε收敛,必须且只须{}k G 收敛。
那么,如何保证{}k G 收敛,{}k G 若收敛,会收敛到哪里?这就需要如下一个引理。
引理1.设n n B C ×∈,则{}k B 收敛当且仅当()1B ρ<。
如果()1B ρ<,则lim 0k k B →∞=。
迭代法解线性方程组作业
沈欢00986096
北京大学工学院,北京100871
2011年10月12日
摘要
由所给矩阵生成系数矩阵A和右端项b,分析系数矩阵A,并用Jacobi迭代法、GS迭代法、SOR(逐步松弛迭代法)解方程组Ax=b
1生成系数矩阵A、右端项b,并分析矩阵A
由文件”gr900900c rg.mm”得到了以.mm格式描述的系数矩阵A。
A矩阵是900∗900的大型稀
疏对称矩阵。
于是,在matlaB中,使用”A=zeros(900,900)”语句生成900∗900的零矩阵。
再
按照.mm文件中的描述,分别对第i行、第j列的元素赋对应的值,就生成了系数矩阵A,并
将A存为.mat文件以便之后应用。
由于右端项是全为1的列向量,所以由语句”b=ones(900,1)”生成。
得到了矩阵A后,求其行列式,使用函数”det(A)”,求得结果为”Inf”,证明行列式太大,matlaB无法显示。
由此证明,矩阵A可逆,线性方程组
Ax=b
有唯一解。
接着,判断A矩阵是否是对称矩阵(其实,这步是没有必要的,因为A矩阵本身是对称矩阵,是.mm格式中的矩阵按对称阵生成的)。
如果A是对称矩阵,那么
A−A T=0。
于是,令B=A−A T,并对B求∞范数。
结果显示: B ∞=0,所以,B是零矩阵,也就是:A是对称矩阵。
然后,求A的三个条件数:
Cond(A)= A ∗ A−1
所求结果是,对应于1范数的条件数为:377.2334;对应于2范数的条件数为:194.5739;对应
于3范数的条件数为:377.2334;
1
从以上结果我们看出,A是可逆矩阵,但是A的条件数很大,所以,Ax=b有唯一解并且矩阵A相对不稳定。
所以,我们可以用迭代方法来求解该线性方程组,但是由于A的条件数太大迭代次数一般而言会比较多。
2Jacobi迭代法
Jacobi迭代方法的程序流程图如图所示:
图1:Jacobi迭代方法程序流程图
在上述流程中,取x0=[1,1,...,1]T将精度设为accuracy=10−3,需要误差满足:
error= x k+1−x k
x k+1
<accuracy
时迭代结束。
在上述Jacobi迭代中,只有求取x k+1一步需要用到Jacobi迭代的知识,Jacobi迭代的方法简单。
可以并行计算,其分量形式为:
x k+1 1=(b1−
j=1
a1j x k j)/a11;
x k+1 2=(b2−
j=2
a2j x k j)/a22;
2
.........
x k+1 n =(b n−
j=n
a nj x k j)/a nn.
于是,按上述分量形式可以直接编制程序求取x k+1.
最终,程序中设置的迭代次数标志flag显示,经过36次迭代,计算出了满足精度要求的解x,并附于本文最后。
3GS迭代法
GS迭代法思路基本和Jacobi迭代法相同。
只是在求x k+1
i 时,同时使用x k+1
1
、x k+1
2
...x k+1
i−1
和x k
i+1
、x k
i+1
...x k n的
信息。
所以,GS迭代法的程序流程图与Jacobi迭代法的相同,如下:
图2:GS迭代方法程序流程图
对于GS迭代求解x k+1的方法与Jacobi迭代有所不同,其分量形式为:
x k+1 i =(b i−
i−1
j=1
a ij x k+1
j
−
n
j=i+1
a ij x k j)/a ii
i=1,2......n
3
根据分量形式可以编制求x k+1的程序。
其他步骤和设置,均与Jacobi迭代法相同。
最终,程序中设置的迭代次数标志flag显示,经过39次迭代,GS迭代法计算出了满足和Jacobi迭代相同精度要求的解x。
4SOR迭代
SOR迭代是GS迭代的扩展,其x k+1
i 是GS迭代方法得到的x k+1
i
和x k
i
的加权平均。
即:
x k+1 i =w∗((b i−
i−1
j=1
a ij x k+1
j
−
n
j=i+1
a ij x k j)/a ii)+(1−w)∗x k i
其中,w是松弛因子,当0<w<2时,SOR方法收敛。
所以,选择合适的w就是一个关键的问题。
SOR
图3:SOR迭代方法程序流程图
在所有其余步骤和设置与GS方法相同的情况下,本文笔者随意设置了的w值为0.88,最终需要的迭代次数为40,得到与GS方法具有相同精度的解。
笔者又尝试将w设置为更小的0.60,需要迭代34次.笔者又将w设置为较大的1.50,需要迭代30次。
以上数据说明,SOR方法对w的敏感性很高,选择较为适当的w对计算才有帮助,否则反而可能回增加迭代次数。
4
结论和说明
本文用三种迭代解法求取线性方程组Ax =b 的解。
解向量如下(由于三种解精度相同,所以就只附上用Jacobi 解法的解):0100200300400500600700800900
02
4
6
8
10
12
图4:解的图示:图中点的意义为(k,x(k)=y)
5。