SOR迭代法 求MATLAB程序

SOR迭代法 求MATLAB程序,第1张

迭代法 matlab实现代码如下

function [x,n] = jacobi(A,b,x0,eps,varargin)

if nargin ==3

eps = 1.0e-6

M = 200

elseif nargin<3

disp('输入参数数目不足3个')

return

elseif nargin ==5

M = varargin{1}

end

D = diag(diag(A))          %%求A的对角矩阵

L = -tril(A,-1)                 %%求A的下三角矩阵

U = -triu(A,1)                %%求A的上三角矩阵

B = D\(L+U)

f = D\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

运行效果如下:

扩展资料:

迭代法的收敛性判别

收敛性判别条件

SOR迭代法收敛的充分必要条件是ρ(λω)<1,ρ(λω)与松弛因子ω有关。ρ(λω)与ω的关系以及SOR方法收敛的条件有如下定理。

定理1:(Kahan)对任意的A

,设其对角元皆非零,则对所有实数ω,有:ρ(λω)≥ ω-1。

推论:如果解Ax=b的SOR方法收敛,则有ω-1<1,即0<ω<2。

定理2:(Ostrowski-Reich)设A

,A对称正定,且0<ω<2,则解Ax=b的SOR方法收敛。

参考资料来源:百度百科-逐次超松驰迭代法

function [x k]=EqtsSOR(A,b,x0,omiga,eps)

%超松弛(SOR,Successive Over-Relaxation)迭代法求解线性方程组Ax=b

%[x k]=EqtsSOR(A,b,x0,eps)

%x:解向量,列向量

%k:迭代次数

%A:系数矩阵

%b:列向量

%x0:迭代初始值,列向量

%omiga:松弛因子,可缺省,缺省值为1,即为GS迭代法

%eps:误差限,可缺省,缺省值为0.5e-6

%

%应用举例:

%A=[4 3 03 4 -10 -1 4]b=[2430-24]x0=[111]omiga=1.25

%[x k]=EqtsSOR(A,b,x0,omiga,0.5e-6)

%x=EqtsSOR(A,b,x0)

if nargin==4

eps=0.5e-6

end

if nargin==3

omiga=1

eps=0.5e-6

end

%检查输入参数

n=length(b)

if size(A,1) ~= n || n ~= length(x0)

disp('输入参数有误!')

x=' '

k=' '

return

end

%迭代求解

k=0

x=zeros(n,1)

while 1

k=k+1

for i=1:n

z=0

for j=1:i-1

z=z+A(i,j)*x(j)

end

for j=i+1:n

z=z+A(i,j)*x0(j)

end

x(i)=(1-omiga)*x0(i)+omiga*(b(i)-z)/A(i,i)

end

if norm(x-x0)<=eps || k==30

break

end

x0=x

end

if k==30

disp('迭代次数太多!')

x=' '

end

return

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<=N

x(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1)

for i=2:n

x(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)

end

if max(abs(x-x0))<=tol

fid = 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

end

k=k+1

x0=x

end

if k==N+1

fid = fopen('SOR_iter_result.txt', 'wt')

fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n')

fprintf(fid,'迭代次数: %d次\n\n',k)

fprintf(fid,'超过最大迭代次数,求解失败!')

fclose(fid)

end


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11683397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-17
下一篇 2023-05-17

发表评论

登录后才能评论

评论列表(0条)

保存