Anda di halaman 1dari 3

function [Sol,E,iter,csuf]=jacobi(M,b,x0,error,n_iter)

% Syntaxis: [Sol,E,iter,csuf]=jacobi(M,b,x0,error,n_iter)
% --------------------------------------------------------------------
--
% Esta funcion resuelve un sistema de ecuaciones lineales (SEL) de la
% forma Ax=b por el metodo de Jacobi segun
%
% x0 in V (arbitrario)
% x(k+1)=( I-inv(D)*A )*x(k) + inv(D)*b
%
% Entrada:
% M --> Matriz del sitema
% b --> Vector independiente (debe ser un vector columna)
% x0 --> Vector de aproximaciones iniciales
% error --> Tolerancia del calculo {default | 0.00001}
% n_iter --> Numero maximo de iteraciones {default | 1000}
%
% Salida:
% Sol --> Vector solucion del SEL
% E --> Error de la aproximacion
% csuf --> Cumplimiento de la condicion suficiente de convergencia
"alpha<1"
%
%
% Ejemplo:
%
% M=[9 -1 2; 1 8 2; 1 -1 11]; b=[9; 19; 10];
% [Sol,E,iter,csuf]=jacobi(M,b)
%
% Sol =
% 1.0000
% 2.0000
% 1.0000
%
% E = 8.2562e-06
%
% iter = 8
%
% csuf = 1
%
%
% Ver tambien: seidel
%
% --------------------------------------------------------------------
--
%
% Elaborado por:
%
% Msc. Alexeis Companioni Guerra
% Lic. Vianka Orovio Cobo
%
% Revision: 1.0
% Fecha: 30/09/2007

%% Validacion de las entradas


if nargin<2
error('Verifique los datos de entrada.');
else
if det(M) == 0
error('M debe ser no singular.');
end

if diff(size(M))~=0
error('La matriz de entrada debe ser cuadrada.');
end

if min(size(b))>1
error('b debe ser un vector.');
end

if max(size(M)) ~= max(size(b))
error('Verifique la dimension del vector independiente
respecto a la matriz del sistema.');
end
end

b = b(:);
n = length(b);

if nargin<3
x0 = zeros(n,1);
else
if min(size(x0))>1
error('x0 debe ser un vector.');
end

if max(size(M)) ~= max(size(x0))
error('Verifique la dimension del vector x0 respecto a la
matriz del sistema.');
end
end

if nargin<4
error = 0.00001;
else
if sum(size(error))~=2
error('La tolerancia debe ser un escalar.');
end
end

if nargin<5
n_iter = 1000;
else
if sum(size(n_iter))~=2
error('El numero de iteraciones debe ser un escalar.');
end

if round(n_iter)-n_iter~=0
error('El numero de iteraciones debe ser un entero.');
end
end

%% Determinacion del factor de convergencia "alpha"


D_inv = diag( diag(M).^(-1) );
Jac = eye(n)-D_inv*M; % Matriz de Jacobi

alpha = norm(Jac,inf); % Norma infinita


if alpha>=1
csuf = 0;
else
csuf = 1;
end

%% Ciclo iterativo
iter = 0; Sol = zeros(n,1); E = inf;

while (E>=error) && (iter<n_iter)


Sol = Jac*x0 + D_inv*b;
E = abs(alpha/(1-alpha))*norm(Sol-x0,inf);
x0 = Sol;
iter = iter + 1;
end

Anda mungkin juga menyukai