用SOR迭代法
- 格式:doc
- 大小:98.50 KB
- 文档页数:8
sor迭代法手算例题SOR迭代法是求解线性方程组的一种经典方式,其基本思想是通过不断迭代来逼近方程组的解。
这种方法在大规模问题上具有很好的效率,因此得到了广泛的应用。
本文将介绍SOR迭代法的基本原理,并以一个手算例题来展示其具体步骤和计算结果。
一、SOR迭代法的基本原理在介绍SOR迭代法的原理之前,我们先来看一下迭代法本身的思想。
假设有一个线性方程组:$$Ax=b$$其中,A是一个$n\times n$的系数矩阵,b是一个$n\times 1$的常数向量,x是一个$n\times 1$的未知向量。
迭代法的基本思想是将方程组表示为:$$x^{(k+1)}=Tx^{(k)}+C$$其中,$x^{(k)}$表示第k次迭代的近似解,$T$是一个$n\times n$的矩阵,$C$是一个$n\times 1$的常数向量。
迭代法的步骤是从一个初始点$x^{(0)}$开始,不断应用上述公式来寻找更好的解$x^{(k+1)}$。
当接近真解时,迭代的过程会不断收敛,即$x^{(k+1)}$会不断逼近真解$x$。
那么,如何确定矩阵$T$和向量$C$呢?最简单的方法是将方程组表示为:$$x^{(k+1)}=(I-\omega A)x^{(k)}+\omega b$$其中,I是$n\times n$的单位矩阵,$\omega$是一个常数,称作松弛因子。
当$\omega=1$时,这就是最基本的迭代法——雅克比迭代法。
但是,雅克比迭代法的收敛速度比较慢,因此需要调整$\omega$的值,从而得到更好的迭代效果。
SOR迭代法就是一种改良的迭代方法,其基本思想是通过加速松弛因子的变化来改善雅克比迭代法的效率。
具体来说,SOR迭代法的公式为:$$x_i^{(k+1)}=(1-\omega)x_i^{(k)}+\frac{\omega}{a_{ii}}\left(b_i-\sum_{j<i}a_{ij}x_j^{(k+1)}-\sum_{j>i}a_{ij}x_j^{(k)}\right)$$其中,$i=1,2,\cdots,n$。
对称超松弛迭代法-回复对称超松弛迭代法(Symmetric Successive Over-Relaxation, SSOR)是一种用于求解线性方程组的迭代解法。
它是对超松弛迭代法(Successive Over-Relaxation, SOR)的改进和扩展,适用于具有对称正定系数矩阵的方程组。
本文将详细介绍SSOR的原理、算法步骤和收敛性分析。
一、SSOR原理:1. 对称正定系数矩阵:对称正定系数矩阵是指一个n阶实对称矩阵A,满足以下两个条件:(1) 矩阵A的所有特征值大于零;(2) 对于任意非零列向量x,都有x^T * A * x > 0,其中x^T表示向量x的转置。
2. SSOR分解:对称正定系数矩阵A可以进行SSOR分解,即将A分解为A = D - L - U,其中D、L、U分别为A的对角线元素、下三角和上三角元素组成的矩阵。
3. 迭代格式:SSOR迭代格式为:x(k+1) = (D - ωL)^(-1) * [ωU * x(k) + (1-ω) * b],其中x(k)表示第k次迭代的解向量,ω为松弛因子,b为常数向量。
4. SSOR与SOR:SSOR是对SOR方法的改进和拓展,当松弛因子ω=1时,SSOR退化为SOR方法。
SSOR方法在SOR方法的基础上引入了前向迭代和后向迭代,使得收敛速度更快。
二、SSOR算法步骤:1. 初始化:给出初始近似解向量x(0),选择松弛因子ω的初值。
2. 迭代过程:(1) 前向迭代:根据迭代格式,计算x(k+1/2) = (D - ωL)^(-1) * [ωU * x(k) + (1-ω) * b]。
(2) 后向迭代:继续根据迭代格式,计算x(k+1) = (D - ωU)^(-1) * [ωL * x(k+1/2) + (1-ω) * b]。
(3) 重复步骤(1)和(2),直到满足收敛准则(如迭代次数达到指定值或解的误差小于给定阈值)为止。
3. 输出结果:输出近似解向量x(k+1)。
SOR迭代法的Matlab程序function [x]=SOR_iterative(A,b)% 用SOR迭代求解线性方程组,矩阵A是方阵x0=zeros(1,length(b)); % 赋初值tol=10^(-2); % 给定误差界N=1000; % 给定最大迭代次数[n,n]=size(A); % 确定矩阵A的阶w=1; % 给定松弛因子k=1;% 迭代过程while k<=Nx(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1);for i=2:nx(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n)')/A(i,i);endif max(abs(x-x0))<=tolfid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n');fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'x的值\n\n');fprintf(fid, '%12.8f \n', x);break;endk=k+1;x0=x;endif k==N+1fid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n');fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'超过最大迭代次数,求解失败!');fclose(fid);end常微分方程的数值解法实验目的:熟悉在Matlab平台上直接求解常微分方程初值问题试验方法1、利用改进欧拉法解方程:程序内容为:fun=@(x,y)x^(-2)-y/x;h=0.05;X=1:h:2;Y(1)=1;for i=2:21Y(i)=Y(i-1)+h/2*(fun(X(i-1),Y(i-1))+fun(X(i),Y(i-1))+h*fun(X(i-1),Y(i-1))); end;Y运行结果为:Y =Columns 1 through 91.0000 0.9989 0.9957 0.9909 0.9848 0.9778 0.9701 0.9618 0.9530Columns 10 through 180.9440 0.9348 0.9254 0.9160 0.9065 0.8971 0.8876 0.8783 0.8690Columns 19 through 210.8598 0.8508 0.8418真实解的求法为:x=1:0.05:2;y=1./x.*(log(x)+1)y =Columns 1 through 81.0000 0.9988 0.9957 0.9911 0.9853 0.9785 0.9710 0.9630Columns 9 through 160.9546 0.9459 0.9370 0.9279 0.9188 0.9096 0.9004 0.8912Columns 17 through 210.8821 0.8731 0.8641 0.8553 0.8466用四阶R-K算法解常微分方程的程序为:fun=@(x,y)x^(-2)-y/x;h=0.1;X=1:h:2;Y(1)=1;for n=2:11k1=fun(x(n-1),Y(n-1));k2=fun(x(n-1)+h/2,Y(n-1)+h/2*k1);k3=fun(x(n-1)+h/2,Y(n-1)+h/2*k2);k4=fun(x(n-1)+h,Y(n-1)+h*k3);Y(n)=Y(n-1)+h/6*(k1+2*k2+2*k3+k4)end;Y运行后了结果为:Y =Columns 1 through 91.0000 0.9957 0.9853 0.9710 0.9546 0.9370 0.9188 0.9004 0.8821Columns 10 through 110.8641 0.8466真实解的求法为:x=1:0.1:2;y=1./x.*(log(x)+1)y =Columns 1 through 91.0000 0.9957 0.9853 0.9710 0.9546 0.9370 0.9188 0.9004 0.8821Columns 10 through 110.8641 0.8466可见其精确度至少已达到0.0012、MATLAB中数值解法“ode45”为:[x1,y1] = ode45(@(x,y)x^(-2)-y/x,[1,2],y0);符号解法“dsolve”求解为:dsolve('Dy=x^(-2)-y/x','y(1) = 1','x')ans =(log(x)+1)/x画出两种算法的图形位:[x1,y1] = ode45(@(x,y)x^(-2)-y/x,[1,2],1);fplot('(log(x)+1)/x',[1,2]);hold on, plot(x1,y1,'ro');数值算法同解析算法几乎完全吻合。
sor迭代法Sor迭代法是一种求解线性方程组的算法,它是Jacobi迭代法和Gauss-Seidel迭代法的改进。
在本文中,我们将深入探讨Sor迭代法的原理、优缺点以及应用。
一、原理1.1 Sor迭代法的基本思想Sor迭代法是通过对Jacobi迭代法和Gauss-Seidel迭代法进行改进得到的。
其基本思想是在Jacobi迭代和Gauss-Seidel迭代中引入一个松弛因子,使得每次更新后的值更接近于真实解。
1.2 Sor迭代公式Sor迭代公式如下:$x^{(k+1)}_i=(1-\omega)x^{(k)}_i+\frac{\omega}{a_{ii}}\left(b_i-\sum_{j=1,j\neq i}^n a_{ij}x^{(k+1)}_j\right)$其中,$x^{(k+1)}_i$表示第$k+1$次迭代中第$i$个未知数的值;$x^{(k)}_i$表示第$k$次迭代中第$i$个未知数的值;$\omega$为松弛因子;$a_{ii}$为系数矩阵中第$i$行第$i$列元素;$\sum_{j=1,j\neq i}^n a_{ij}x^{(k+1)}_j$表示第$k+1$次迭代中除第$i$个未知数外的其他未知数的值的和;$b_i$为方程组中第$i$个方程的常数项。
1.3 松弛因子松弛因子$\omega$是Sor迭代法中一个重要的参数,它控制了每次迭代后更新值与真实解之间的距离。
一般情况下,松弛因子取值在0和2之间。
当$\omega=1$时,Sor迭代法退化成Gauss-Seidel迭代法;当$\omega=0$时,Sor迭代法退化成Jacobi迭代法。
二、优缺点2.1 优点(1)收敛速度快:相比于Jacobi迭代法和Gauss-Seidel迭代法,Sor迭代法具有更快的收敛速度。
(2)适用范围广:Sor迭代法适用于大多数线性方程组求解问题,并且不需要对系数矩阵做任何特殊处理。
2.2 缺点(1)松弛因子需要调整:松弛因子是影响Sor迭代法收敛速度和精度的关键参数,因此需要通过试验或经验来确定最优值。
预条件SOR型迭代法的收敛性的开题报告一、选题背景预条件SOR型迭代法是求解线性方程组的一种基本方法,具有简单、高效等优点。
在实际科学计算中,往往需要求解大型稀疏线性方程组,预条件SOR型迭代法可以有效地处理此类问题,因此具有广泛应用价值。
二、研究内容本文将对预条件SOR型迭代法的收敛性进行研究。
具体内容包括:1. 解析求解预条件SOR型迭代法的方程组;2. 探究预条件SOR型迭代法的收敛性条件;3. 分析收敛速度及优化方法。
三、预期成果通过本文的研究,预期可以得到以下成果:1. 确定预条件SOR型迭代法的收敛性条件;2. 分析预条件SOR型迭代法的收敛速度及优化方法;3. 具有一定的实用性和参考价值。
四、研究方法本文将采用数学理论推导的方法对预条件SOR型迭代法的收敛性进行研究。
具体方法包括:1. 推导预条件SOR型迭代法的解析表达式;2. 运用数学推导,确定预条件SOR型迭代法的收敛性条件;3. 通过实例分析,比较收敛速度及优化方法。
五、研究难点及可行性分析本文的研究难点在于预条件SOR型迭代法的收敛性分析较为复杂,需要运用数学推导方法,分析技巧要求较高。
同时,大型科学计算问题的解法具有很强的实际性和应用价值,因此本文的可行性也非常高。
六、研究意义本文的研究意义在于:1. 提供了一种解决大型稀疏线性方程组问题的有效方法;2. 确定了预条件SOR型迭代法的收敛性条件,有助于提高求解速度和精确度;3. 提高了大型科学计算问题求解的效率和精确度,有着广泛的应用价值。
七、研究进度安排1. 第一周:收集、整理相关文献资料,并进行阅读和理解;2. 第二周-第四周:学习预条件SOR型迭代法的理论知识和数学推导方法,并进行预处理和计算;3. 第五周-第七周:对预处理后的数据进行处理和分析,并确定收敛性条件;4. 第八周-第十周:完成收敛速度及优化方法的分析和比较,并进行实例分析;5. 第十一周-第十二周:完成论文的撰写和总结。
一、数值求解如下正方形域上的Poisson 方程边值问二、2222(,)2,0,1(0,)(1,)(1),01(,0)(,1)0,01u u f x y x y x y u y u y y y y u x u x x ⎧⎛⎫∂∂-+==<<⎪ ⎪∂∂⎪⎝⎭⎨==-≤≤⎪⎪==≤≤⎩二、用椭圆型第一边值问题的五点差分格式得到线性方程组为2,1,1,,1,10,1,,0,141,?,?,?,?0,1i j i j i j i j i j ijj N j i i N u u u u u h f i j Nu u u u i j N -+-+++----=≤≤====≤≤+,写成矩阵形式Au=f 。
其中 三、基本原理程序步骤:所有的步骤基本一致 1. 设置u ,n ,并给u ,n 赋初值; 2. While 语句循环,到的6步 3. Up 我第K 次迭代的值; 4. 分别进行计算,sum=0; 例如:Jacobi :sun= sum+A(i,j)*Ub; SOR 和Gauss_Seidel= sum+A(i,j)*u; 各自进行相应的下不运算。
5. 计算|Up-u|<ep 的绝对值,判断是否停机 6. 如果小于规定误差,迭代终止; 7. 输出结果u 和迭代次数k8. 在块的迭代中调用了追赶法的求解子程序zg ,在SOR 设计了A 得自动生成子程序creat_matix.1122N N v b v b u f v b ⎛⎫⎛⎫ ⎪ ⎪ ⎪⎪== ⎪ ⎪ ⎪ ⎪⎝⎭⎝⎭4114114ii A -⎛⎫ ⎪- ⎪= ⎪- ⎪-⎝⎭ 11,12,1,121,22,2,21,2,,2211,12,1,121,22,2,221,2,,(,,...,),(,,...,),......,(,,...,)(,,...,)?,(,,...,)?,......,(,,...,)?1,999,0.10.011T T N N TN N N N N T T N N T N N N N N v u u u v u u u v u u u b h f f f b h f f f b h f f f h N h N ====+=+=+===+取或则或,2,,1,2,...,i j f i j N==1122NN A I I A A I IA -⎛⎫ ⎪-⎪= ⎪- ⎪-⎝⎭四、编写求解线性方程组Au=f的算法程序,用下列方法编程计算,并比较计算速度。
1.用Jacobi迭代法求解线性方程组Au=f。
function [u,k]=Jacobi(n,ep,it_max)%JACOBI迭代法求Au=f;%n迭代次数;%ep为精度要求;% it_max为最大迭代次数;% u为方程组的解;% k为迭代次数;h=1/(n+1);f(2:n+1,2:n+1)=h*h*2;%给f赋初值u=zeros(n+2,n+2);v=zeros(n+2,n+2);k=1;%给u赋初值for j=2:n+1u(1,j)=(j-1)*h*(1-(j-1)*h);u(n+2,j)=(j-1)*h*(1-(j-1)*h);end%开始迭代while k<=it_maxv=u;for i=2:n+1for j=2:n+1u(i,j)=(v(i-1,j)+v(i+1,j)+v(i,j-1)+v(i,j+1)+f(i,j))/4;endendif max(abs(u-v))<epbreak;endk=k+1;end2.用块Jacobi迭代法求解线性方程组Au=f。
function x=zg(a,b,c,d)%求解三对角方程的追赶法n=length(b);u(1)=b(1);y(1)=d(1);for i=2:n l(i)=a(i)/u(i-1);u(i)=b(i)-l(i)*c(i-1);y(i)=d(i)-l(i)*y(i-1); % 追赶法求解之追过程求解Ly=dendx(n)=y(n)/u(n); % 追赶法求解之赶过程求解Uz=yfor m=n-1:-1:1if u(m)==0 ,D=0,break; endx(m)=(y(m)-c(m)*x(m+1))/u(m);endfunction [u,k]=Jacobi_block(n,ep,it_max)% 用块jacobi迭代法求解线性方程组A*u=f% u: 方程组的解;k: 迭代次数;n: 非边界点数;% a: 方程组系数矩阵的下对角线元素;b: 方程组系数矩阵的主对角线元素;% c: 方程组系数矩阵的上对角线元素;d: 追赶法所求方程的右端向量;% ep: 允许误差界; %it_max:迭代的最大次数;% function x=zg(a,b,c,d) 子函数追赶法求解;h=1/(n+1);f(2:n+1,2:n+1)=h*h*2;a=-1*ones(1,n); b=4*ones(1,n);c=-1*ones(1,n);k=1;u=zeros(n+2,n+2);%给u赋初值for j=2:n+1u(1,j)=(j-1)*h*(1-(j-1)*h);u(n+2,j)=(j-1)*h*(1-(j-1)*h);end%开始迭代while k<=it_maxUb=u;for j=2:n+1d(1:n)=f(2:n+1,j)+Ub(2:n+1,j-1)+Ub(2:n+1,j+1) ;x=zg(a,b,c,d); % 调用子函数追赶法求解u(2:n+1,j)=x';endif max(abs(Ub-u))<epbreak;endk=k+1;end3.用SOR迭代法求解线性方程组Au=f,用试算法确定最佳松弛因子。
function [u,k]=SOR(n,ep,w,it_max)%SOR迭代法%n迭代次数%ep为精度要求% it_max为最大迭代次数% u为方程组的解% k为迭代次数%w为松弛因子h=1/(n+1);f(2:n+1,2:n+1)=h*h*2;u=zeros(n+2,n+2);k=1;for j=2:n+1u(1,j)=(j-1)*h*(1-(j-1)*h);u(n+2,j)=(j-1)*h*(1-(j-1)*h);endwhile k<=it_maxuk=u;%用于存放的k次迭代的值for i=2:n+1for j=2:n+1u(i,j)=w*(-4*u(i,j)+u(i-1,j)+u(i+1,j)+u(i,j-1)+u(i,j+1)+f(i,j))/4;u(i,j)=u(i,j)+uk(i,j);endendif max(abs(uk-u))<epbreak;endk=k+1;end4.用块SOR迭代法求解线性方程组Au=f,用试算法确定最佳松弛因子。
function [AA,A]=creat_matrix(n)%自动的生成矩阵AA=zeros((n)^2,(n)^2);%定义A的对角的对成NXN的方阵AA=4*eye(n);for i=1:nfor j=1:nif abs(i-j)==1AA(i,j)=1;endendendAB=eye(n);%安矩阵的块给A赋值for k=1:nfor i=1:nfor j=1:nA((i+(k-1)*n),(j+(k-1)*n))=AA(i,j);endendendfor k=1:nfor i=1:nfor j=1:nA((i+k*n),(j+(k-1)*n))=AB(i,j);A((i+(k-1)*n),(j+k*n))=AB(i,j);endendendfunction [u,k]=SOR_block(n,w,ep,it_max)% 用块SOR迭代法求解线性方程组A*u=f% u: 方程组的解;k: 迭代次数;n: 非边界点数;% ep: 允许误差界;%it_max:迭代的最大次数;%A=creat-matrix(n),为创建A矩阵的子函数;[AA,A]=creat_matrix(n); %调用子函数;h=1/(n+1);k=1;f(2:n+1,2:n+1)=h*h*2;u=zeros(n+2,n+2);for j=2:n+1u(1,j)=(j-1)*h*(1-(j-1)*h);u(n+2,j)=(j-1)*h*(1-(j-1)*h);endwhile k<=it_maxuk=u;er=0;for i=1:nsum=zeros(n,1);for j=1:nsum=sum+A((((i-1)*n+1):i*n),(((j-1)*n+1):j*n))*u(2:n+1,j+1);endu(2:n+1,i+1)=uk(2:n+1,i+1)+w*inv(AA)*(f(2:n+1,i+1)-sum);er=er+norm(uk(:,i+1)-u(:,i+1),1);endif max(abs(er/n^2))<epbreak;endk=k+1;end5.用Gauss-Seidel迭代法求解线性方程组Au=f。
function [u,k]=Gauss_Seidel(n,ep,it_max)%G--s迭代法%n迭代次数%ep为精度要求% it_max为最大迭代次数% u为方程组的解% k为迭代次数h=1/(n+1);f(2:n+1,2:n+1)=h*h*2;u=zeros(n+2,n+2);k=1;for j=2:n+1u(1,j)=(j-1)*h*(1-(j-1)*h);u(n+2,j)=(j-1)*h*(1-(j-1)*h);endwhile k<=it_maxuk=u;%用于存放的k次迭代的值for i=2:n+1for j=2:n+1u(i,j)=(u(i-1,j)+u(i+1,j)+u(i,j-1)+u(i,j+1)+f(i,j))/4;%用于存放的k+1次迭代的值endendif max(abs(u-uk))<epbreak;endk=k+1;end6.用块Gauss-Seidel迭代法求解线性方程组Au=f。
function [u,k]=Gauss_Seidel_block(n,ep,it_max)% 用块Gauss-seidel迭代法求解线性方程组A*u=f% u: 方程组的解;k: 迭代次数;n: 非边界点数;% a: 方程组系数矩阵的下对角线元素;b: 方程组系数矩阵的主对角线元素;% c: 方程组系数矩阵的上对角线元素;d: 追赶法所求方程的右端向量;% ep: 允许误差界; %it_max:迭代的最大次数;% function x=zg(a,b,c,d) 子函数追赶法求解;h=1/(n+1);f(2:n+1,2:n+1)=h*h*2;a=-1*ones(1,n); b=4*ones(1,n);c=-1*ones(1,n);k=1;u=zeros(n+2,n+2);for j=2:n+1u(1,j)=(j-1)*h*(1-(j-1)*h);u(n+2,j)=(j-1)*h*(1-(j-1)*h);end% for j=2:n+1% f(2,j)=h*h+(j-1)*h*(1-(j-1)*h);% f(n+1,j)=h*h+(j-1)*h*(1-(j-1)*h);% endwhile k<=it_maxUb=u;for j=2:n+1d(1:n)=f(2:n+1,j)+u(2:n+1,j-1)+u(2:n+1,j+1) ;x=zg(a,b,c,d); % 用追赶法求解u(2:n+1,j)=x';endif max(abs(Ub-u))<epbreak;endk=k+1;end五、各种算法的实验结果对比在MA TLAB中输入n=9; ep=0.000000001; it_max=1000; w=1.8;1)[u,k]=Jacobi(n,ep,it_max) 回车u =0 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 00 0.0900 0.1600 0.2100 0.2400 0.2500 0.2400 0.2100 0.1600 0.0900 0 k = 332tic;[u,k]= (n,ep,it_max);toc;Elapsed time is 0.011470 seconds.2)[u,k]=Gauss_Seidel(n,ep,it_max) 回车k = 174>> tic;[u,k]= (n,ep,it_max);toc;Elapsed time is 0.006760 seconds.3)[u,k]= (n,ep,w,it_max) 回车k =91>> tic;[u,k]=SOR(n,w,ep,it_max);toc;Elapsed time is 0.000497 seconds.把松弛系数w调整为0.8,1.0,1.1, 1,7,1.8发现;迭代次数在w=1。