jacobi, gauss-seidel, and SOR

来源:互联网 发布:科目一挂机软件 编辑:程序博客网 时间:2024/05/29 04:07

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);


0 0