使用方法
clear n=10; for i = 1:n for j = 1:n A(i,j)=vpa(1/(i+j-1)); end end b=ones(n,1); I=1000;w=0.5;
[x,t,it] = Iteration(A,b,I,eps) norm(x) [x,t,it] = GaussSeidel(A,b,I,eps) norm(x) [x,t,it,w] = SOR(A,b,I,eps,w) norm(x)
|
Jacobi迭代法
function [x,t,it] = Iteration(A,b,I,eps)
if nargin < 4 eps = 1e-6; end
tic [n,~] = size(A); B = zeros(size(A)); x = zeros(n,1); f = zeros(n,1);
for r = 1:n for l = 1:n if l == r B(r,r) = 0; else B(r,l) = -A(r,l)/A(r,r); end end f(r) = b(r)/A(r,r); end
x_exact = A\b; it = 1; for k = 1:I-1 x = B*x+f; if norm(x-x_exact)>eps it = it+1; end end t = toc; end
|
Gauss-Seidel迭代法
function [x,t,it] = GaussSeidel(A,b,I,eps)
if nargin < 4 eps = 1e-6; end
tic [n,~] = size(A); x = zeros(n,1);
D = diag(diag(A)); L = -tril(A,-1); U = -triu(A,1); G = (D-L)\U; f = (D-L)\b;
x_exact = A\b; it = 1; for k = 1:I-1 x = G*x+f; if norm(x_exact-x)>eps it = it+1; end end
t = toc; end
|
SOR迭代法
function [x,t,it,w] = SOR(A,b,I,eps,w)
tic [n,~] = size(A); x = zeros(n,1);
D = diag(diag(A)); L = -tril(A,-1); U = -triu(A,1);
w_opt = 2/(1+sqrt(1-(max(abs(eig(D\(L+U))))))^2);
if nargin < 4 eps = 1e-6; w = w_opt; end if nargin < 5 w = w_opt; end
Lw = (D-w*L)\((1-w)*D+w*U); f = w*((D-w*L)\b);
x_exact = A\b; it = 1; for k = 1:I-1 x = Lw*x+f; if norm(x-x_exact)>eps it = it+1; end end
t = toc; end
|
注意:
实际应用中通常使用两次迭代解的差值作为收敛判断标准。
收敛速度:SOR(最佳w) > Gauss-Seidel > Jacobi