数值分析实验报告-Sor法分析
数值分析6-用SOR方法求解线性方程组
程序 clear;clc; A=[4,3,0;3,4,-1;0,-1,4]; b=[24,30,-24]'; N=length(b); %解向量的维数 fprintf('库函数计算结果:'); x=inv(A)*b %库函数计算结果 x=[1;1;1];%迭代初始值 %-----(A=D-E-F)-----D=diag(diag(A)); E=-tril(A,-1);%下三角 F=-triu(A,1);%上三角 w=1.5; %松弛因子,一般 0<w<2 B=inv(D-w*E)*[(1-w)*D+w*F];g=w*inv(D-w*E)*b; eps=1e-8;%相邻解的距离小于该数时,结束迭代 %--------开始迭代------for k=1:100 %最大迭代次数为 100 fprintf('第%d 次迭代:',k); y=B*x+g; if abs(x-y)<eps break; end x=y end x
程序结果
当比较松弛因Biblioteka 取 1.0 时当比较松弛因子取 1.25 时
当比较松弛因子取 1.5 时
作业七:编写用 SOR 方法求解线性方程组 Ax=B 的标准程序,并求下 列方程组的解, 并比较松弛因子取 1.0、 1.25、 1.5 时所需迭代的次数。 可取初始向量 X(0) =(1,1,1)’;迭代终止条件||x(k+1)-x(k)||<=10e-8
4 30 ������1 24 3 4 − 1 x2 = 30 0 − 14 x3 −24
数值分析上机实习报告
指导教师:姓名:学号:专业:联系电话:上海交通大学目录序言 (3)实验课题(一) 雅可比迭代法和高斯-塞得尔迭代法的收敛性和收敛速度 (4)数值分析 (6)实验课题(二) 松弛因子对SOR法收敛速度的影响 (6)数值分析 (12)总结 (13)附录(程序清单) (14)1.雅可比迭代法和高斯-塞得尔迭代法的收敛性和收敛速度 (14)雅可比迭代法: (14)高斯-塞得尔迭代法: (16)2.松弛因子对SOR法收敛速度的影响 (18)松弛法(SOR) (18)序言随着科学技术的发展,提出了大量复杂的数值计算问题,在实际解决这些计算问题的长期过程中,形成了计算方法这门学科,专门研究各种数学问题的数值解法(近似解法),包括方法的构造和求解过程的误差分析,是一门内容丰富,有自身理论体系的实用性很强的学科。
解决工程问题,往往需要处理很多数学模型,这就要花费大量的人力和时间,但是还有不少数学模型无法用解析法得到解。
使用数值方法并利用计算机,就可以克服这些困难。
事实上,科学计算已经与理论分析、科学实验成为平行的研究和解决科技问题的科学手段,经常被科技工作者所采用。
作为科学计算的核心内容——数值分析(数值计算方法),已逐渐成为广大科技工作者必备的基本知识并越来越被人重视。
由于数值方法是解数值问题的系列计算公式,所以数值方法是否有效,不但与方法本身的好坏有关,而且与数值问题本身的好坏也有关,因此,研究数值方法时,不但需要研究数值方法的好坏,即数值稳定性问题,而且还需要研究数值问题本身的好坏,即数值问题的性态,以及它们的判别问题。
数值计算的绝大部分方法都具有近似性,而其理论又具有严密的科学性,方法的近似值正是建立在理论的严密性基础上,根据计算方法的这一特点。
因此不仅要求掌握和使用算法,还要重视必要的误差分析,以保证计算结果的可靠性。
数值计算还具有应用性强的特点,计算方法的绝大部分方法如求微分方程近似解,求积分近似值,求解超越方程,解线性方程组等都具有较强的实用性,而插值法,最小二乘法,样条函数等也都是工程技术领域中常用的,有实际应用价值的方法。
sor方法
sor方法
SOR方法是一种迭代数值解法,主要被用于求解线性系统Ax=b,其中A是系数矩阵,b是右端向量。
SOR方法的全称为"Successive Over-Relaxation Method",意为迭代超松弛法。
在使用SOR方法求解线性方程组时,首先需要将系数矩阵A分解为L、D和U 三个部分,其中L是A的严格下三角矩阵,D是A的对角线矩阵,U是A的严格上三角矩阵。
同时,SOR方法还需要一个松弛因子w。
SOR方法的迭代公式为:
x(k+1) = (1-w)x(k) + w(D-wL)^(-1)(b-Ux(k))
其中x(k)表示第k次迭代求得的解向量,x(k+1)表示x(k)的下一次迭代,^(−1)表示逆矩阵。
可以发现,SOR方法是基于Gauss-Seidel方法的改进,它在每一次迭代中添加了一个松弛因子w,从而使得解向量的迭代更快、更稳定。
在实际应用中,我们需要选择一个合适的松弛因子w,以使得SOR方法能够收敛并且收敛速度较快。
一般来说,选择一个小于1的w能够保证SOR方法的收敛性,而选择一个大于1的w能够加快SOR方法的收敛速度。
需要注意的是,SOR方法只能够求解特定条件下的线性方程组,如系数矩阵为对称正定矩阵、对角占优矩阵等。
当系数矩阵不满足这些条件时,SOR方法可能出现发散的情况。
总的来说,SOR方法是一种简单而有效的数值解法,被广泛应用于工程计算等领域。
在使用时,需要根据具体问题选择合适的松弛因子w,并且注意其收敛性和收敛速度。
数值分析实验报告 第一次
华中科技大学本科实验报告课程名称:数值分析姓名:姜福鑫学号:U201310044专业班级:应数1302指导老师:黄乘明实验题目:线性方程组的迭代解法日期:2015-4-9实验成绩:1.实验目的通过上机实验,理解利用计算机迭代求解线性方程组的整个过程,加深对所学计算方法的理论及算法特点的理解。
2.实验题目2.1利用算法2.1(Jacobi迭代法),编制MATLAB程序,求线性方程组。
(1)14x+42x+43x+44x=-414x+142x+43x+44x=1614x+42x+143x+44x=3614x+42x+43x+144x=561(2)10.9x+1.22x+2.13x+0.94x=-7.011.2x+11.22x+1.53x+2.54x=5.312.1x+1.52x+9.83x+1.34x=10.310.9x+2.52x+1.33x+12.34x=24.61的近似解,取初值x=T)0,0,0,0(2.2利用算法2.2(Gauss-Seidel迭代法),编制MATLAB程序,求线性方程组。
(1)6x-22x-3x-4x=-161-2x+122x-3x-4x=61-x-2x+63x-24x=81-x-2x-3x+124x=541(2)0.78x-0.022x-0.123x-0.144x=0.761-0.02x+0.862x-0.043x-0.064x=0.081-0.12x-0.042x+0.723x-0.084x=1.121-0.14x-0.062x-0.083x+0.744x=0.681的近似解,取初值x=T)0,0,0,0(2.3利用算法2.2(SOR法),编制MATLAB程序,求线性方程组。
(1)-4x+2x+3x+4x=11x-42x+3x+4x=11x+2x-43x+4x=11x+2x+3x-44x=11(2)x-0.253x-0.254x=0.51x-0.253x-0.254x=0.52-0.25x-0.252x+3x=0.51-0.25x-0.252x+4x=0.51的近似解,取初值x=T)0,0,0,0(3.程序文本function x=majacobi(A,b,x0,ep,N)n=length(b);if nargin<5,N=500;endif nargin<4,ep=1e-6;endif nargin<3,x0=zeros(n,1);endx=zeros(n,1);k=0;while k<Nfor i=1:nx(i)=(b(i)-A(i,[1:i-1,i+1:n])*x0([1:i-1,i+1:n]))/A(i,i);endif norm(x-x0,inf)<ep,break;endx0=x;k=k+1;endif k==N,Warning('已达到迭代次数上限');enddisp(['k=',num2str(k)])2.2function x=maseidel(A,b,x0,ep,N)n=length(b);if nargin<5,N=500;endif nargin<4,ep=1e-6;endif nargin<3,x0=zeros(n,1);endx=zeros(n,1);k=0;while k<Nfor i=1:nif i==1x(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);else if i==nx(n)=(b(n)-A(n,1:n-1)*x(1:n-1))/A(n,n);elsex(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);endendendif norm(x-x0,inf)<ep,break;endx0=x;k=k+1;endif k==N,Warning('已达到迭代次数上限');enddisp(['k=',num2str(k)])2.3function x=masor(A,b,omega,x0,ep,N)n=length(b);if nargin<6,N=500;endif nargin<5,ep=1e-6;endif nargin<4,x0=zeros(n,1);endif nargin<3,omega=1.5;endx=zeros(n,1);k=0;while k<Nfor i=1:nif i==1x1(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);else if i==nx1(n)=(b(n)-A(n,1:n-1)*x(1:n-1))/A(n,n);elsex1(i)=(b(i)-A(i,1:i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i);endendx(i)=(1-omega)*x0(i)+omega*x1(i);endif norm(x-x0,inf)<ep,break;endx0=x;k=k+1;endif k==N,Warning('已达到迭代次数上限');enddisp(['k=',num2str(k)])4.运行结果与分析2.11.k=94x=-2.00000.00002.00004.00002.22.k=17x=-0.99860.00711.00321.96562.21.k=11 x=-1.07820.95532.88974.7306 2.22.k=8 x=1.55030.32321.99341.45392.31.k=21 x=-1.0000-1.0000-1.0000-1.0000 2.32.k=21 x= 1.00001.00001.00001.0000分析:对比三种方法,Jacobi迭代法次数较多才能到达精度要求,Gause-Seidel迭代法次数较少,SOR法次数处于两者之间。
东北大学软件学院数值分析程序实践报告
数值分析程序实践 实验报告东北大学软件学院实验目的:用SOR 法求解方程组:=0.65、1、1.2、1.45计算.要求精度为10-6;并指出迭代次数。
实验代码和结果:#include<iostream>⎪⎪⎩⎪⎪⎨⎧=+-+-=-+-=+-+--=-+-1322151481615356212146106882644321432143214321x x x x x x x x x x x x x x x x#include<iomanip>#include<cmath> // fabs();using namespace std;void SolveEquation(const int &dim){double *Arr = new double[dim*dim]; //方程矩阵double *B = new double[dim]; //方程右端系数double *X = new double[dim]; //初始解double *dX = new double[dim];double e; //解的精度double w; //w==1时,为GS迭代double S, S1;const int N = 5000; //最大迭代次数,防止死机int n=0;bool hasSolved = false;cout << endl << "初始化方程组左端系数矩阵!" << endl;for (int i=0; i<dim; i++){for (int j=0; j<dim; j++){cout << "Arr[" << i << "][" << j << "]: ";cin >> Arr[i*dim+j];}}cout << "初始化方程组右端系数矩阵!" << endl;for (i=0; i<dim; i++){cout << "B[" << i << "]: ";cin >> B[i];}system("cls");cout << "方程组如下: " << endl << endl;for (i=0; i<dim; i++){for (int j=0; j<dim; j++){cout << setw(8) << Arr[i*dim+j] << " X" << j+1;if (j < dim-1) cout << " + ";else if (j == dim-1) cout << " = ";}cout << setw(8) << B[i] << endl;}cout << endl << "设置解的精度要求:(比如1e-6)" << endl; cin >> e;cout << endl;cout << "输入初始向量!" << endl;for (i=0; i<dim; i++){cout << "X[" << i+1 << "]: ";cin >> X[i];}cout << endl << "设置参数ω ( 0<ω<2 )!" << endl;cin >> w;for (int k=0; k<N; k++) //3-8{S = 0.0;for (i=0; i<dim; i++) //5-7{double sum = 0.0;for (int j=0; j<dim; j++){sum += Arr[i*dim+j]*X[j];}if (fabs(Arr[i*dim+i]) < 1e-10){cout << "被零除!" << endl << Arr[i*dim+i] << endl; exit(0);}dX[i] = w * (B[i] - sum) / Arr[i*dim+i];S1 = dX[i];if (fabs(S1) > fabs(S)){//fabs()取绝对值函数S = S1;}X[i] = X[i] + S1;}n++;if (fabs(S) <= e){cout<<"迭代次数为:"<<endl;cout<<n<<endl;hasSolved = true;//system("cls");cout << "线性方程组的解为:" << endl;for (int t=0; t<dim; t++){cout << "X" << t+1 << "=" << X[t] << "\t";}cout << endl;break;}}if (!hasSolved){cout << "初始向量或ω不合理, 请重新设置!" << endl; }delete[] Arr;delete[] B;delete[] X;delete[] dX;}void main(){int dim;cout << "输入线性方程组未知数个数: ";cin >> dim;SolveEquation(dim);}w=0.65W=1W=1.2W=1.45。
超松弛迭代法(SOR方法)
解:SOR迭代公式
x1( k
1)
(1 )x1(k )
4
(10 2x2(k )
4x3(k ) )
x
(k 2
1)
(1 )x2(k )
17
(3
2
x1(
k
1)
10x3(k ) )
x3( k
1)
(1 )x3(k )
9
(7 4x1(k 1)
10
x
(k 2
1)
)
初值 x (0) (0,0,0)T k = 0,1,2,…,
例该4方.4程用组S的OR精法确求解解线x (性*) 方 程(2组,1,1)T
如值只果需x(0取)迭ω取代(0=,04ω21,00x(=42)即1次T1xx,要11.高4便26达x斯11,可207到—xx要达22同4塞求到x样319德精0x精x3尔度130度迭要x,(3k7代求需1) 法要x)迭(和k) 代同1一1100初6次
数值计算方法
超松弛迭代法(SOR方法) 使用迭代法的困难在于难以估计其计算
量。有时迭代过程虽然收敛,但由于收敛速 度缓慢,使计算量变得很大而失去使用价值 。因此,迭代过程的加速具有重要意义。逐 次超松弛迭代(Successive Over relaxatic Method,简称SOR方法)法,可以看作是带参 数的高斯—塞德尔迭代法,实质上是高斯-塞 德尔迭代的一种加速方法。
或 Dx(k1) (1)Dx(k) (b Lx(k1) Ux(k) )
故 (D L)x(k1) (1)D Ux(k) b
显然对任何一个ω值,(D+ωL)非奇异,(因为假设 aii 0,i 1,2,, n )于是超松弛迭代公式为
x(k1) (D L)1 (1)D U x(k) (D L)1b
迭代法解线性方程组-数值分析实验报告
数学与计算科学学院《数值分析》课程设计题目:迭代法解线性方程组专业:信息与计算科学学号:*******-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 xk k =∞→,则*x 就是方程①或方程②的解。
此时迭代公式②是收敛的,否则称为发散的。
构造的迭代公式③是否收敛,取决于迭代矩阵B 的性1.雅可比迭代法基本原理设有方程组),,3,2,1(1n i b x aj 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 xk +==)()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 。
数值方法实验报告
2009-2010学年第一学期《数值方法》实验报告学院:石油工程学院专业班级:指导教师:李梦霞学生姓名:实验一1.题目高斯列主元素消去法:用Gauss列主元消去法解线性方程组Ax b=,其中,A=17.031 -0.615 -2.991 1.007 -1.006 0.000-1.000 34.211 -1.000 -2.100 0.300 -1.7000.000 0.500 13.000 -0.500 1.000 -1.5004.501 3.110 -3.907 -61.705 12.170 8.9990.101 -8.012 -0.017 -0.910 4.918 0.1001.0002.0003.0004.5005.000 21.803⎛⎫⎪⎪⎪⎪⎪⎪⎪⎪⎝⎭0.230-52.32254.000240.23629.304-117.818b⎛⎫⎪⎪⎪= ⎪⎪⎪⎪⎪⎝⎭2.理论分析及算法描述(1)理论分析:由高斯消去法,当a)(k kk=0时,消去过程则中断。
此外,即使a)(k kk≠0,但当绝对值较小时,也会因用它作除数而出现舍入误差急剧增长的系数,从而导致计算结果不准确。
列主元高斯消去法只需在高斯消去法消去过程的第k步消去计算前,插入搜索绝对值最大元和交换过程(交换增广矩阵的行)的处理。
(2)Guass 列主元消去法算法描述:Step1:k=1;Step2:按列选主元|a ikk|=|a ik|,r ik↔r k;Step3:if|a ikk |=0,停止计算;Step4:i k =K ,则不换行。
Else ,交换i k 行与K 行,a ikj ↔a k j (j=k,...N),bik↔b k ;Step5:计算乘数akkik a lik =(i=k+1,...n);Step6:消元计算a ij =aij-lik*a k jb i=b i-lik*bk(i,j=k+1,...n);Step7:k=k+1,If k<=n-1转Step2; Step8:回代求解axa kkk ikjkk∑+-=n1*b b (k=n,n-1,...1)。
【分析】数值分析迭代法
【关键字】分析数值分析实验报告(3)学院:信息学院班级:计算机0903班姓名:王明强学号:课题三线性方程组的迭代法一、问题提出1、设线性方程组=x= ( 1, -1, 0, 1, 2, 0, 3, 1, -1, 2 )2、设对称正定阵系数阵线方程组=x = ( 1, -1, 0, 2, 1, -1, 0, 2 )3、三对角形线性方程组=x= ( 2, 1, -3, 0, 1, -2, 3, 0, 1, -1 )试分别选用Jacobi 迭代法,Gauss-Seidol迭代法和SOR方法计算其解。
二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如由迭代次数体会该迭代法的收敛快慢;3、对方程组2,3使用SOR方法时,选取松弛因子=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者;4、给出各种算法的设计程序和计算结果。
三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;gauss消去法是一种规则化的加减消元法。
它的基本思想是:通过逐次消元计算把需要求求解的线性方程转化成上三角形方程组,也就是把线性方程组的系数矩阵转化为上三角矩阵,从而使一般线性方程组求解转化为等价(同解)的上三角方程组的求解。
消去法是直接方法的一种。
优点:对于简单的方程组可以很快得出结果,计算中如果没有舍入误差,在稳定的方程组中容易得到精确解,理论上可以求解任何可以求出解得方程组。
缺点:数值有的时候不稳定(可采用列主元gauss消去法),既要消去,又要回代,算法实现起来比较复杂,不适用于大规模方程组。
迭代法是从某一取定的初始向量x(0)出发,按照一个适当的迭代公式,逐次计算出向量x(1),x(2),......,使得向量序列{ x(k)}收敛于方程组的精确解,这样,对于适当大的k,可取x(k)作为方程组的近似解。
优点:算法简单,程序易于实现,特别适用求解庞大稀疏线性方程组。
东北大学数值分析实验报告
数值分析实验班级 姓名 学号实验环境: MATLAB实验一 解线性方程组的迭代法(1)一、实验题目 对以下方程组分别采用Jacobi 迭代法, Gaaus-Seidel 迭代法求解和SOR 迭代法求解。
(2)线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡--------------------------13682438141202913726422123417911101610352431205362177586832337616244911315120130123122400105635680000121324⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡-2119381346323125 (2)对称正定线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----------------------1924336021411035204111443343104221812334161206538114140231212200420424⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡87654321x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡---4515221123660(3)三对角线性方程组⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡------------------4100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡10987654321x x x x x x x x x x =⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡----5541412621357 二、实验要求(1)应用迭代法求线性方程组, 并与直接法作比较。
数值分析Python实现系列——二、逐次超松弛迭代法(SOR)
数值分析Python 实现系列——⼆、逐次超松弛迭代法(SOR )⼆、超松弛迭代法(SOR)1.原理:回顾:在⼀般情况下 : 收敛过慢甚⾄不收敛的B 与f ,经过对系数矩阵A 分裂成A =M −N 的形式, 使得迭代公式变为: x k +1=(I −M −1)Ax k +M −1f 雅克⽐迭代法选取 : 现将A 如下分解A =D −L −U ,D 为对⾓阵,L 为下三⾓阵,U 为上三⾓阵,取M ≡D ,取N ≡L +U ,在这⼀章中我们选取下三⾓矩阵M =1ω(D −ωL ),ω>0,其中ω为松弛因⼦,我们可以发现当ω为1时,M =D −L ,正是⾼思-赛德尔迭代法,下⾯推导迭代公式:x k +1=I −M −1A x k +M −1bx k +1=I −ω(D −ωL )−1A x k +ω(D −ωL )−1bx k +1=(D −ωL )−1((1−ω)D +ωU )x k +ω(D −ωL )−1b推导完毕,我们较为常⽤的是下式:(D −ωL )x k +1=((1−ω)D +ωU )x k +ωb以及:x (0)=(x (0)1,...,x (0)n )T ,x (k +1)i =x (k +)i +Δx i Δx i =ωb i −i −1∑j =1a ij x (k +1)j −n ∑j =1a ij x (k )j a ii i =1,2,...,n ,k =0,1,...,ω为松弛因⼦当ω>1时为超松弛迭代,当ω<1时为低松弛迭代迭代终⽌条件:max 1≤i ≤n |Δx i |=max1≤i ≤n |x (k +1)i −x (k )i |<ε,下⾯我们试试⽤Python 实现这⼀功能.2.实现:import numpy as npimport matplotlib.pyplot as pltMAX = 110 # 遍历最⼤次数A = np.array([[-4, 1, 1, 1], [1, -4, 1, 1], [1, 1, -4, 1], [1, 1, 1, -4]])b = np.array([[1], [1], [1], [1]]) # 注意这⾥取列向量omega_list = [1 + 0.005 * i for i in range(100)] # 取到不同的omega 值,观察趋势length = len(A)count = [] # 记录遍历的次数for omega in omega_list: # 遍历每⼀个omega 值times = 0x_0 = np.zeros((length, 1))x_hold = x_0 + np.ones((length, 1))while (np.linalg.norm(x_hold - x_0, ord=2) >= 10 ** (-5)) and (times <= MAX):# 遍历停⽌条件以k+1次与k 次迭代的向量差的⼆范数以及遍历最⼤次数为标准x_hold = x_0.copy() # 这⾥不要⽤赋值,要⽤copyx_new = x_0.copy()for i in range(length):# 根据迭代公式迭代x_new[i][0] = x_0[i][0] + omega * (b[i][0] - sum([A[i][j] * x_new[j][0] for j in range(i)]) - sum([A[i][j] * x_0[j][0] for j in range(i, length)])) / A[i][i]x_0 = x_new.copy()times += 1count.append(times)plt.plot(omega_list, count) # 观察omega 与迭代次数的关系plt.show()思路:1.遍历设限:第⼀种是到达精度,到达精度停⽌迭代,第⼆种是到达规定最⼤次数,这个可以⾃⼰设定.2.在根据迭代公式改变各个向量分量时,要注意遍历范围.结果:{。
数值计算 SOR方法
一.SOR迭代法流程图:开始设置一维数组首地址设置二维数组首地址设置精度e(precision)设置系数矩阵的阶数N设置增广矩阵的各值设置初始向量设置松弛因子w设置两解向量的差的范数x_0[i]设置最大迭代次数并取到MAX中设置k记录迭代次数初值是0Temp=temp+a[i][j]*x_k[j]Temp=temp+a[i][j]*x_0[j]X_k[i]=(x_k[i]-temp)/a[i][j]X_k[i]=(1-w)*x_0[i]+w*x_k[i]X_0[i]=x_k[i]-x_0[i]YMatrix_category(x_0,n)<precisionNY X_0[i]=x_k[i]I=i+1K=k+1NK<max实验名称: 松弛法实验解题小组成员(班级:09医软(1)班):姚飞 :09713047 参与程序的编写闫化晴 :09713046 参与搜集资料与编写程序余雷 :09713049 参与搜集资料与后期运行调试张珊 :09713051 参与程序的编写实验内容:二.SOR 迭代法理论:松弛法是 Gauss -Seidel 迭代 迭代法的一种加速方法.若记△X = X (K+1) - X (K) = LX (K+1) + UX (K) + f - X (K)则X (K+1) = X (K) + △X ,这样X (K+1) 可以看作是 X (K)加上修正项 △X 而得到.若在修正项△X 前面添加一个因子ω= 1,就是Gauss -Seidel 迭代.通过选择ω可使迭代法收敛的更快.松弛法简称SOR 方法,它的计算格式为:(1)()()()111122111(1)()(1)()()222211233222(1)()(1)()1111(1)(),(1)(),(1)(),k k k k n n k k k k k n n k k k k n n n n nn n nn x x b a x a x a x x b a x a x a x a x x b a x a x a ωωωωωω+++++--=-+---=-+----=-+---这里ω称为松弛因子.当ω< 1时称为低松弛迭代,当1 < ω <2时称为超松弛迭代.实验素材及结果:三、SOR 迭代法例1、用SOR 迭代法求解线性方程组:⎪⎪⎪⎪⎪⎭⎫ ⎝⎛=⎪⎪⎪⎪⎪⎭⎫ ⎝⎛⎪⎪⎪⎪⎪⎭⎫ ⎝⎛----------74.012.018.168.072.012.006.016.012.001.103.014.006.003.088.001.016.014.001.076.04321x x x x取初始点T x )0,0,0,0()0(=,松弛因子05.1=ω,精度要求610-=ε.解 :根据上面程序运行结果如下:例2、用SOR迭代法求解方程组:8X1 + X2- 2X3 = 9,3X1 - 10X2 +X3 = 19,5X1 - 2X2 +20X3 = 72,取初始点X(0) = (0,0,0)T,松弛因子ω= 1,精度要求ε= 10-5.解:根据上面程序运行结果如下:。
数值分析第二次大作业SOR最优松弛因子选取方法及SOR迭代法的改进
《数值分析》第二次大作业题目:SOR最优松弛因子选取方法及SOR迭代法的改进内容:1.SOR最优松弛因子选取方法2.SOR迭代法的改进(SSOR迭代法)3.SSOR迭代法的Matlab程序4.举例比较jacobi,Gauss-Seidel,SOR及SSOR 迭代法的收敛速度姓名:合肥工业大学学号:2011班级:信息与计算科学11-1班参考资料:1.《确定SOR最优松弛因子的一个实用算法》李春光等《计算力学学报》2.《数值分析与实验》,薛毅,北京工业大学出版社.3.《数值分析中的迭代法解线性方程组》,马云,科学出版社4.《非线性互补问题的改进超松弛迭代算法》,段班祥等,江西师范大学出版社5.《迭代法解线性方程组的收敛性比较》,郑亚敏,江西科学出版社.一、SOR最优松弛因子选取方法SOR迭代法迭代公式:x(k+1)i=(1-ω)xi+(k) bi-∑aijxjaii⎝j=1ω⎛ i-1(k+1)-j=i+1∑axijn(k)j⎫⎪ (i=1,2,..n.), ⎪⎭1.二分比较法将松弛因子1/2,ω的区间(1,2)进行二分,每个小区间的长度为ω去中间值3/2,按照SOR 迭代法迭代公式,求出跌代次数k,如果k不超过指定的发散常数,则可确定ω的值;否则将(1,2)四等分,每个区间长度为1/4,ω取各分点值,继续迭代,一般地,将1区间(1,2)二分M次,每次二分步长为,ω一次取取各分点值,2M按照SOR迭代法迭代公式,求出跌代次数k,如果k不超过指定的发散常数,则可确定的ω的值,这样总能找到一个不超过指定发散常数ω值。
2.逐步搜索法将1+ω的取值区间(1,2)进行M等分,ω分别取ω的值。
12M-1,1+,...,1+,通过迭代公式依次对同意精度要求求出迭代MMM次数k的值,并从中选出最优松弛因子3.黄金分割法依据黄金分割比的思想,通过计算机主动选取最优松弛因子的近似值,步骤如下a.对(1,2)区间进行第一次0.618的分割,区间边界a1=1,b1=2,在区间(a1,b1)分割出黄金点p1=a1+0.618(b1-a1),进行SOR迭代法的迭代,求出迭代次数k的值,如果没有超过规定的发散常数,迭代结束,否则做步骤b。
SOR方法的收敛性问题
∑a
n
kj x j ≤ (1 − ω ) akk ⋅ xk + ω
j = k +1
∑a
n
n
kj x j ≤ (1 − ω ) akk ⋅ xk + ω
j = k +1
∑
n
akj ⋅ x j
≤ (1 − ω ) akk ⋅ xk + ω
这样,
n ⎡ ⎤ akj ⋅ xk = ⎢(1 − ω ) akk + ω ∑ akj ⎥ xk j = k +1 j = k +1 ⎣ ⎦
⎤ ⎥≥0 ⎦
(1 − ω ) akk + ω
λ ≤
j = k +1
∑
n
akj <1
akk − ω ∑ akj
j =1
k −1
至此,结论得证! 对于 A 为对称正定的情形,我们有如下的结论。
定理 11.若 A 为对称正定矩阵, 0 < ω < 2 ,则 SOR 方法收敛。
证明方法与定理 8 类似。
证明:
((1 −
1
ω
)D + U )x = λ (
1
ω
D + L) x , ((ω − 1) D + ωU ) x = λ ( D + ω L) x
将其写为分量形式,即为
(ω − 1)aii xi + ω ∑ aij x j = λ ( aii xi + ω ∑ aij x j ) , i = 1, 2, ⋅⋅⋅, n
因此,
ω
2
)p+
ω
2
( p + 2α ) > (1 −
数值分析实验报告--实验6--解线性方程组的迭代法
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。
SOR迭代(算法分析和数值算例)
SOR 迭代基本思想Gauss-Seidel 迭代(1)1()(1)()()k k x D L U xD L +--=-+-的结果作为中间值,记为(1)k x+ 。
SOR 方法是将(1)k x+ 与上次计算的结果()k x 做加权平均作为最后结果。
迭代格式为:1(1)(1)()()111[](1),1,2i nk k k k ii ij jij j ij j i iix b a x a x x i na ωω-++==+=--+-=∑∑或者1(1)()(1)()11[],1,2i nk k k k iii ij jij j j j iiix x b a x a x i na ω-++===+--=∑∑算法: 1.0,,,A b x t e ω输入迭代初值松弛参数,为迭代次数初始值为0,为记录误差2. 当1,2in= 时,11:[]ni i i i j j j iix x b a x a ω==+-∑,结果仍然存储在ix 中。
迭代次数:1t t =+ 3.计算误差*e x x=-(真解已知)4.如果6510e -<⨯,则已达到精确度要求,否则继续第2步数值结果041010141,4,001430A b x -⎛⎫⎛⎫⎛⎫ ⎪ ⎪ ⎪=--== ⎪ ⎪ ⎪⎪ ⎪ ⎪--⎝⎭⎝⎭⎝⎭迭代初值,用Gauss 消去法求的其真解为*12112x ⎛⎫⎪ ⎪=⎪ ⎪- ⎪⎝⎭依次取1,1.03,1.1ω=,数值结果见下表总结从实验结果可以看出,当取松弛参数为1.03时只需五步就能达到所需精度。
附录(M文件)function [t,x]=successiive_over_Rellaxatiion(A,b,x0,w,rx)n=length(A);x=x0; %% x0为迭代初值e=norm(rx-x0,inf); %% rx为真解,e为误差t=0; %% t为迭代次数while e>5*10^(-6)for i=1:ntemp=0;for j=1:ntemp=temp+A(i,j)*x(j,1);endx(i,1)=x(i,1)+w*(b(i,1)-temp)/A(i,i);ende=norm(rx-x,inf);t=t+1;xend。
实验目的:了解SOR法迭代矩阵谱半径和迭代参数的关系
数值实验一实验目的:了解SOR法迭代矩阵谱半径和迭代参数的关系。
实验内容:10.50010.50.501A⎡⎤⎢⎥=⎢⎥⎢⎥⎣⎦,画出SOR迭代谱半径和ϖ之间的曲线,并据此分析ϖ的收敛范围及ϖ取何值时,迭代法收敛速递最快。
实验原理:逐次超松弛迭代法(SOR法)是Gauss-Seidel法的一种加速方法,SOR法的公式为:其中,方程组收敛的充要条件是:ρ(Lω)<1引进超松弛迭代法的思想在于希望能选择松弛因子使得迭代方程式收敛速度较快,即需选择因子使得对称正定阵迭代收敛必要条件为0<ϖ<2,而本实验中矩阵并非对称正定阵,故将此范围扩大至-1<ϖ<3,求解分析过程如下:以下为MATLAB程序:P=zeros(1,4001); %构造用来储存谱半径的行向量A=[1 0.5 0;0 1 0.5;0.5 0 1];%建立矩阵AD=diag(diag(A)); %求对角矩阵DU=-triu(A,1);%求上三角矩阵UL=-tril(A,-1);%求下三角矩阵Ln=0;for w=-1:0.001:3;n=n+1;B=(inv(D-w*L))*((1-w)*D+w*U);P(1,n)=max(abs(eig(B)));endw=-1:0.001:3;plot(w,P);xlabel('\omega');ylabel('\rho(L_\omega)'); %画出谱半径随松弛因子变化图title('谱半径与松弛因子的变化关系图');k=find(P==min(P)); %寻找最小谱半径wmin=w(k); %最小谱半径对应之因子ϖdisp(min(P)); %输出最小谱半径数值disp(wmin); %输出对应因子ϖ值实验图形:实验结论:由上图分析可知当0<ϖ<1.5时,谱半径ρ(Lω)<1,此时方程组迭代收敛经计算可知当ϖ=0.3381时,谱半径ρ(Lω)=0.9410,此时迭代速度最快。
SOR迭代法超松弛因子选取
《计算方法》实验报告(二)实验名称:SOR 迭代法松弛因子的选取班级: 数学1402班 姓名: 高艺萌 学号:14404210一、 实验目的通过本实验学习线性方程组的SOR 迭代解法以及SOR 迭代法的编程与应用。
对比分析不同条件下的超松弛因子w 的取值大小会对方程组的解造成影响,通过这个实验我们可以了解的w 不同取值会对方程组的解产生的影响。
培养编程与上机调试能力。
二、 实验题目用逐次超松弛(SOR )迭代法求解方程组b Ax =,其中⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡=555555122-12-122-112-122-112-122-112-122-12-12201918321 x x x x x x A (1)给定迭代误差,选取不同的超松弛因子1>ω进行计算,观察得到的近似解向量并分析计算结果,给出你的结论;(2)给定迭代误差,选取不同的超松弛因子1<ω进行计算,观察得到的近似解向量并分析计算结果,给出你的结论;三、 实验原理1.逐次超松弛迭代法可以看作Gauss-Seidel 迭代法的加速,b D Ux D Lx D x k k k 1)(1)1(1)1(--+-+++=2.SOR 迭代计算格式b D L wD I w x U wD I w L wD x k k 111)(111)1()(])1[()-1(------+-++-= 其中,w 叫松弛因子,当w>1时叫超松弛,0<w<1时叫低松弛,w=1时就是Gauss-Seidel 迭代法。
3.利用SOR 迭代算法进行求解。
4.算法原理:SOR 迭代法%masor.mfunction x=masor(A,b,omega,x0,ep,N)n=length(b);if nargin<6,N=500;endif nargin<5,ep=1e-6;endif nargin<4,x0=zeros(n,1);endif nargin<3,omega=1.5;endx=zeros(n,1);k=0;while k<Nfor i=1:nif i==1 x1(1)=(b(1)-A(1,2:n)*x0(2:n))/A(1,1);else if i==n x1(n)=(b(n)-A(n,1:n-1)*x(n:n-1)/A(n,n);elsex1(i)=(b(i)-A(i,1;i-1)*x(1:i-1)-A(i,i+1:n)*x0(i+1:n))/A(i,i); endendx(i)=(1-omega)*x0(i)+omega*x1(i); endif norm(x0-x,inf)<ep,break;endk=k+1;x0=x; endif k==N Warning; enddisp([’k=’,num2str(k)])运行程序四、实验内容根据实验题目,分别对问题一,问题二进行求解。
SOR松弛因子实验报告
SOR松弛因子
200820801065 查俊
一、问题叙述
用SOR迭代法解线性方程组,在迭代收敛的情况下,松弛因子如何选项迭代收敛最快?事实上,对于这一情况始终是没有解决的问题,要反复试验才能得到比较满意的结果。
二、问题分析
SOR Gauss-Seidel迭代
0.01扫描寻找A的
最佳松弛因子。
三、实验程序及注释
新建m文件bw.m
function BW=bw(A,w)
n=max(size(A));
L=zeros(n);
U=L;
for i=1:n
for j=1:n
if j<i
L(i,j)=A(i,j);
end
if j>i
U(i,j)=A(i,j);
end
end
end
D=A-L-U
BW=inv(D+w*L)*[(1-w)*D-w*U];
新建m文件best_w.m
A=[4 -2 -1;-2 4 -2;-1 -2 3]
w=0.5:0.01:2;
n=size(w)
rho=zeros(n)
for i=1:max(n)
BW=bw(A,w(i));
rho(i)=max(abs(eig(BW)))
end
[rho_best,m]=min(rho);
w_best=w(m)
rho_best
plot(w,rho)
四、实验数据结果及分析
程序运行后,w_best=1.4400(松弛因子),rho_best=0.5291(谱半径)
下图为松弛因子和谱半径的函数图像
五、实验结论
通过实验可以看出,迭代矩阵的谱半径对于松弛因子是一个单峰函数,有唯一的最小点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数值分析实验报告
一、 实验目的
1、会使用Sor 法求解一个线性方程组
2、熟悉matlab 语言并结合原理编程求方程组
3、改变ω的值观察实验结果
4、会分析实验结果 二、实验题目
编制Sor 迭代格式程序进行求解一个线性方程组的迭代计算情况,运行中要选用不同的松弛因子ω进行尝试
三、 实验原理
Jacobi 迭代和seidel 迭代对具体的线性方程组来说,逼近*x 的速度是固定不变的,遇到收敛很慢的情况时就显得很不实用。
Sor 法是一seidel 迭代为基础,并在迭代中引入参数ω以增加迭代选择的灵活性,具体为:
!
用seidel 迭代算出的,)()1()()1(k k J k k J
x x x x x -=∆++相减得到差向量与再用参数ω乘之再加上
)1()()()1()1()()()1(++++-=∆+=k J
k k k k k k x x x x x x x x ωωω,即的下一步迭代作为,由seidel 迭代的公式可以得到Sor 法的迭代格式为
n i x a x a b a x x k j n i j ij k j i j ij i ii k i k i ,2,1),()1()(1)1(11)()1( =--+-=∑∑+=+-=+ω
ω
式中ω称为松弛因子。
四、 实验内容
用matlab 编程得到Sor 法求线性方程组的算法为:
function [x,n]=SOR(A,b,x0,w,eps,M)
if nargin==4
eps= ;
M = 200;
elseif nargin<4
error
return
:
elseif nargin ==5
M = 200;
end
if(w<=0 || w>=2)
error;
return;
end
D=diag(diag(A)); %求A的对角矩阵L=-tril(A,-1); %求A的下三角阵(
U=-triu(A,1); %求A的上三角阵B=inv(D-L*w)*((1-w)*D+w*U);
f=w*inv((D-L*w))*b;
x=B*x0+f;
n=1; %迭代次数
while norm(x-x0)>=eps
x0=x;
x =B*x0+f;
n=n+1;
if(n>=M)
(
disp('Warning: 迭代次数太多,可能不收敛!'); return;
end
end
输入数据:
>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];
b=[1;2;10;-1];
x0=[0;0;0;0];
w=1;
eps=1e-4;
;
M=100;
>> [x,n]=SOR(A,b,x0,w,eps,M)
x =
n =
;
5
error;
>> A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5];
b=[1;2;10;-1];
x0=[0;0;0;0];
w=;
eps=1e-4;
M=100;
[x,n]=SOR(A,b,x0,w,eps,M)
/
x =
n =
@
21
>>A=[20 1 -3 -1;3 18 0 7;-1 2 40 -2;1 0 -1 5]; b=[1;2;10;-1];
x0=[0;0;0;0];
w=;
eps=1e-4;
M=100;
[x,n]=SOR(A,b,x0,w,eps,M)
Error using ==> error
Not enough input arguments.
,
Error in ==> SOR at 13
用实验3中的线性方程组作为例子比较得
当ω=时,x = 迭代次数为n=21
当ω=1时,x = 迭代次数为n=5
当ω=时,出现error
五、实验分析
由定理,Sor法收敛的必要条件是0<ω<2,因此,当ω=和1时,算法收敛,能够求出根,并且迭代次数根据ω的不同而不同,在求方程组的根时,只要选择恰当的ω,收敛是很快的。
而当ω>2 时,算法不收敛,因此程序出现错误,不能求出根。
当ω=1时,根据Sor法的构造方法知,此时的Sor法就是seidel法。