JACOBI
% it there any bug?? who knows...
function [ x ] = jacobi()
%A = [8,-3,2;4,11,-1;6,3,12];
%b = [20,33,36];
A = [0.8 -0.4 0; -0.4 0.8 -0.4; 0 -0.4 0.8];
b = [41; 25; 105];
error_tolerance = 0.05;
max_iter = 500;
error = 1;
[m, n] = size(A);
x_old = zeros(m, 1);
x_new = zeros(m, 1);
iter = 0;
while (error > error_tolerance && iter < max_iter)
for i = 1: m % rows
summation = 0;
for j = 1: n % columns
if (i ~= j)
summation = summation + A(i, j) * x_old(j);
end;
end;
x_new(i) = (b(i) - summation) / A(i, i);
end;
error = norm(x_old - x_new)/norm(x_new);
x_old = x_new;
iter = iter + 1;
end;
if iter == max_iter
fprintf('The solution diverge\n');
end;
x = x_new;
fprintf('The totol iteration times: %d\n', iter);
gauss-seidel and SOR
% it there any bug?? who knows...
function [ x ] = G_S() % can use A and b as the input
%A = [8,-3,2;4,11,-1;6,3,12];
%b = [20,33,36];
A = [0.8 -0.4 0; -0.4 0.8 -0.4; 0 -0.4 0.8];
b = [41; 25; 105];
error_tolerance = 0.000001; % this tolerance is too big...
max_iter = 500;
error = 1;
[m, n] = size(A);
x_old = zeros(m, 1);
x_new = zeros(m, 1);
iter = 0;
omega = 1; % when omega == 1, it is gauss-seidel method
% SOR --Successive over relaxation method.
while (error > error_tolerance && iter < max_iter)
for i = 1: m % rows
summation = 0;
for j = 1: n % columns
if (i ~= j)
summation = summation + A(i, j) * x_new(j);
x_new(i) = (b(i) - summation) / A(i, i);
x_new(i) = omega * x_new(i) + (1-omega) * x_old(i);
end;
end;
%x_new(i) = (b(i) - summation) / A(i, i);
end;
error = norm(x_old - x_new)/norm(x_old);
x_old = x_new;
iter = iter + 1;
end;
if iter == max_iter
fprintf('The solution diverge\n');
end;
x = x_new;
fprintf('The totol iteration times: %d\n', iter);