雅可比(Jacobi)迭代法的MATLAB代码
数值分析学习(四)
一、迭代原理
考虑线性方程组Ax = b时,A为可逆矩阵,当A的主对角线元素不为0时,A可写为:
A=D+L+U,D,L,U可写为:
D
=
[
a
11
0
…
0
0
a
22
…
0
…
…
…
…
0
0
…
a
n
n
]
L
=
[
0
0
…
0
a
21
0
…
0
…
…
…
…
a
n
1
a
n
2
…
0
]
U
=
[
0
a
12
…
a
1
n
0
0
…
a
2
n
…
…
…
…
0
0
…
0
]
D=\left[\begin{matrix} a_{11} & 0 & … &0 \\ 0 & a_{22} & …&0\\ …&…&…&…\\ 0&0&…&a_{nn} \end{matrix}\right] \space L=\left[\begin{matrix} 0 & 0 & … &0 \\ a_{21} & 0 & …&0\\ …&…&…&…\\ a_{n1}&a_{n2}&…&0 \end{matrix}\right] \space U=\left[\begin{matrix} 0 & a_{12} & … &a_{1n} \\ 0 & 0& …&a_{2n}\\ …&…&…&…\\ 0&0&…&0 \end{matrix}\right]
D=
a110…00a22…0…………00…ann
L=
0a21…an100…an2…………00…0
U=
00…0a120…0…………a1na2n…0
故将L,U移到左边,可得:
x i = 1 a i i [ b i − ∑ j = 1 j ≠ i n a i j x j ] , i = 1 , 2 … n 即 x = B x + f , 其中 B = I − D − 1 A = − D − 1 ( L + U ) 故可以迭代 X ( k + 1 ) = B x ( k ) + f x_i=\frac{1}{a_{ii}}\left[ b_i-\sum_{j=1 \space j \neq i}^{n}{a_{ij}x_j} \right] ,\space i=1,2…n \\ 即x=Bx+f,\space 其中B=I-D^{-1}A=-D^{-1}(L+U)\\ 故可以迭代X^{(k+1)}=Bx^{(k)}+f xi=aii1 bi−j=1 j=i∑naijxj , i=1,2…n即x=Bx+f, 其中B=I−D−1A=−D−1(L+U)故可以迭代X(k+1)=Bx(k)+f
二、迭代收敛性
如果 lim n → + ∞ x ( n ) \lim_{n \rightarrow +\infty}{x^{(n)}} limn→+∞x(n)存在,则迭代法收敛;否则,迭代法不收敛。
三、算法分析
1
、
1、
1、将矩阵解写为上述形式;
2
、
2、
2、给定迭代准确度(即误差)与迭代初值;
3
、
3、
3、逐次迭代.
四、MATLAB代码
function [x,j] = Jacobi(A,b)
%% A为n×n矩阵
%% b为n维列向量
%% x为输出解
%% j为迭代次数
n = length(b);
D = zeros(n,n);
D = sparse(diag(diag(A)));
Dinv = sparse(diag(1./diag(A)));
B = Dinv*(D-A);
f = Dinv*b;
TOL = 1.0e-3;
Max_iter = 1000;
error = 1;
j = 0;
x0 = [0;0;0];
while error>TOL && j<Max_iter
xk = B*x0+f;
error = norm(xk-x0,inf);
x0=xk;
j=j+1;
end
x=xk;
j;
end