迭代法 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,n]=jacobi2(A,b,x0,eps,M)
% Jacobi迭代
%A=[9 1 11 8 11 1 9]
%b=[111]
%x0=[000]
%[x,n]=jacobi(A,b,x0)
if nargin==3
eps=1.0e-6
M=10000
elseif nargin==4
M=10000
end
D=diag(diag(A))L=-tril(A,-1)
U=-triu(A,1)B=inv(D)*(L+U)
f=inv(D)*bx=x0n=0
tol=1
while tol>eps
x=B*x0+f
n=n+1
tol=norm(x-x0)%极大范数 等同于tol=max(abs(x-x0))但不能这样用
x0=x
if(n>=M)
disp('Warning:迭代次数太多,可能不收敛')
break
end
end
高斯赛德尔迭代
function[x,n]=gauseidel2(A,b,x0,eps,M )
% Detailed explanation goes here
% 解的精度:eps% 迭代步数控制:M
% 解 x% 求解所需的实际步数迭代:n
%[x,n]=gauseidel(A,b,x0)
if nargin==3
eps=1.0e-6
M=10000
elseif nargin==4
M=10000
end
D=diag(diag(A))
L=-tril(A,-1)
U=-triu(A,1)
G=(D-L)\U
f=(D-L)\历枝此b
x=x0
n=0
tol=1
while tol>=eps
x=G*x0+f
n=n+1
tol=norm(x-x0)%算矩阵sup范数
x0=x
if(n>=M)
disp('Warning:迭代次数太多肢迅可能不收搭御敛')
break
end
end
在matlab中执行循环迭代的方法:
a是一个由nk个数组成的数组、
对应的y也应该是由nk个数组成的数组
a=某数组
b=某常数
d=某常数
for k=1:1:nk
c=1
n=0
errf=1
求X1000:
while errf>1e-8n<100%计算结果精度要求1e-8,如果迭代超过100次还不收敛,退出循环。
y(k)=a(k)*b*c
c1=y*d
errf=(c1-c)/c1
X1000=c1。
扩展资料利用迭代算法解决问题,需要做好以下三个方面的工作:
一、确定迭代变量。在可以用迭代算法解决的问题中,至少存在一个直接或间接差告地不断由旧值递推出新值的变量,这个变量就是迭代变量。
二、建立迭代关系式。所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。
三、对迭代过程进行碧老控制。
参考资料虚慧明:百度百科——迭代循环
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)