迭代法 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)