用SOR迭代法

合集下载

sor迭代法手算例题

sor迭代法手算例题

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)。

(完整版)6.4超松弛迭代法

(完整版)6.4超松弛迭代法

0.75 x2( ( k 1)
6 0.25x3(k
)
7.5
x (k 1) 3
0.25x2(k1)
6
②取ω=1.25 ,即SOR迭代法:
xx21((kk11))
0.25x1(k) 0.9375x2(k) 7.5 0.9375x1(k1) 0.25x2(k) 0.3125x3(k)
-5.0183105
3.1333027
4.0402646
-5.0966863
4
3.0549316
3.9542236
-5.0114410
2.9570512
4.0074838
-4.9734897
5
3.0343323
3.9713898
-5.0071526
3.0037211
4.0029250
-5.0057135
6
3.0214577
3.9821186
-5.0044703
2.9963276
4.0009262
-4.9982822
7 3.0134110
3.9888241
-5.0027940
3.0000498
4.0002586
-5.0003486
迭代法若要精确到七位小数, Gauss-Seidel迭代法需要34次迭代; 而用SOR迭代法(ω=1.25),只需要14次迭代。
因子ω。
返回引用
opt
(1
2
1 [(BJ )]2 )
(4)
这时,有ρ(Bopt
)=
ω
opt
-
1。
SOR法分类与现状
通常,
(1)当ω>1 时,称为超松弛算法; (2)当ω<1 时,称为亚松弛算法。

第一次迭代解法之SOR

第一次迭代解法之SOR

种相容范数都有 ρ(A)≤||A||
(6.2)
2021/6/17
13
另一个更深刻的结果,对于任意的ε>0,必存在一种相
容的矩阵范数,使
|| A ||≤ ρ(A) +ε
(6.3)
式(6.2)和(6.3)表明,矩阵A的谱半径是它所有相 容范数的下确界。
定义6.4 设有n×n矩阵序列 A(k) (ai(jk) ), k 1, 2, 方阵A=(aij), 如果
多大算病态没有标准。如果主元很小或者元素数量级相差大,可能是病态
cond ( A) A A1 AA1 1
2021/6/17
18
§2 迭代解法与收敛性
一、迭代解法
设有线性方程组
Ax=b
(1)
A∈Rn×n, b∈Rn .
对A 进行分裂, A=A1+A2 , 其中 A1 可逆,
则 (A1+A2)x=b A1x = - A2x+b x = - A1-1 A2 x + A1-1 b
再由 Ax =b,得到 || b||= || Ax || ≤||A || ||x||
2021/6/17
16
于是,由 || △x ||≤||A-1 || ||△b||
及 ||b || ≤||A || ||x|| 1 A
x
b
得到解的相对误差为
x A
A1
b
x
b
令 Cond(A)=||A || ||A-1 || ,并称其为矩阵A的条件数。
14 20
则它的特征方程为:
I AT A 10 14
2 30 4 0
14
20
2021/6/17
10
此方程的根为矩阵ATA的特征值,解得

sor迭代法

sor迭代法

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迭代法

ω
0.6 0.8 1 1.1 1.15 1.25 1.3 1.5 1.8
迭代次数 16 10 8 7 8 11 15 15 15
近似解与 5 5 5 5 5 5 5 4 1 准确解重 复合位数
使 SOR 法收敛最快的松弛因子通常称为最 优 松
弛因子。目前,只有少数特殊类型的矩阵,才有确定 的最优松弛因子的理论公式,但实际使用时也有一定 困难。通常的办法,是选不同的 进行试算,以确定
SOR迭代法常以这种形式进行计算。
格式(3.4)的矩阵形式为
X (k1) (1 ) X k D1 b LX k UX (k) ,
3.5
其中
a11
D
a22
O
0
0
,
ann
0 a12 L
U
0O
O
0
a1n
an1,n
0
显然,A D L U.
0
0
L
a21
O
OO
aij x(jk )
3.1
若记
i1
n
r(k)
i
(bi
a x(k 1) ij j
aij
x
(k j
)
),
j 1
j i
i 1,2,L ,n
则 3.1 式可写为
x( k 1) i
x(k) i
1 aii
r(k)
i
3.2
由此可以看出, Gauss Seidel 迭代法的第 k 1
步 ,相当于在第 k 步的基础上每一个分量增加
上述定理说明,对于任何系数矩阵 A,若要 SOR
法收敛,必须选取松弛因子 0,2 , 然而,当松
弛因子满足条件 0 2 时,并不是对所有系数矩 阵 A 来说,SOR 法都是收敛的。但是,对一些特殊矩 阵来说,这一条件是充分的。

SOR迭代法

SOR迭代法

aij x(jk )
3.1
若记
i1
n
r(k)
i
(bi
a x(k 1) ij j
aij
x
(k j
)
),
j 1
j i
i 1,2,L ,n
则 3.1 式可写为
x( k 1) i
x(k) i
1 aii
r(k)
i
3.2
由此可以看出, Gauss Seidel 迭代法的第 k 1
步 ,相当于在第 k 步的基础上每一个分量增加
SOR迭代法常以这种形式进行计算。
格式(3.4)的矩阵形式为
X (k1) (1 ) X k D1 b LX k UX (k) ,
3.5
其中
a11
D
a22
O
0
0
,
ann
0 a12 L
U
0O
O
0
a1n
an1,n
0
显然,A D L U.
0
0
L
a21
O
OO
上述定理说明,对于任何系数矩阵 A,若要 SOR
法收敛,必须选取松弛因子 0,2 , 然而,当松
弛因子满足条件 0 2 时,并不是对所有系数矩 阵 A 来说,SOR 法都是收敛的。但是,对一些特殊矩 阵来说,这一条件是充分的。
定理7 如果矩阵 A 是对称正定的,则 SOR 法 对于0 2 是收敛的。
其 Gauss Seidel 迭 代 格 式 可写为 (aii 0) :
x(k1) i
x(k) i
1 aii
bi
a x(k1) i1 1
L
a x(k1) i,i1, i1

sor迭代法

sor迭代法

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迭代法收敛速度和精度的关键参数,因此需要通过试验或经验来确定最优值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、数值求解如下正方形域上的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。

相关文档
最新文档