You are on page 1of 4

% programa para encontrar la solucion de un sistema de ecuaciones lineales

%utilizando el metodo de seidel


function R = GaussSeidel(A,B,Es)
[f,c] = size(A); % funcion en matlab para determinar el numero de filas y columnas de A
Ea = 100; %error aproximado global
for i = 1:c %inicializamos la variable i donde aumenta hasta deterse siempre en el num c
x(i) = 0; %vector x que almacenara los valores de las incognitas inicializadas con valores 0
%aproximaciones actuales
xant(i) = 0; %el vector generado xant se inicializa con el valor de 0
%contendra los valores de la aproximacion anterior de las incognitas
Eaprox(i) = 0; %contendra el vector los valores de los errores aproximados
end
S = [0;0]; %La matriz S
AB = [A,B]; %La matriz resultado de concatenar A y B
for i = 1:F %Para cada fila...
M = abs(A(i,1)); %Tomamos el primer elemento
for j = 2:C %Para cada elemento de la fila... {el primero ya lo hemos tomado}
if abs(A(i,j)) > M %Si el elemento actual es mayor que el maximo registrado...
M = abs(A(i,j)); %Este pasa a ser el maximo
end
end
S(i) = M; %El elemento de la fila i de S es el maximo registrado
if S(i) == 0 %Si algun elemento de S es 0...
fprintf('No existe solucion unica para el sistema. Finalizado SIN exito'); %No existe solucion
unica
return; %Paramos el proceso de creacion de la matriz S y salimos
end
end
for i = 1:(C-1)% Para cada columna...
for q = i:(F)%Ordenamos la columna t. q. a(1,i)/S(1)<(2,i)/S(2)<...<a(q,i)/S(q)
MaxF = q; %La fila con el maximo {asignamos el primero al inicio}
Max = abs(AB(q,i))/S(q); %El maximo {asignamos el primero al inicio}
for j = (q+1):F %Recorremos la columna en busca de otro posible maximo
if AB(j,i)/S(j) > Max %Si el elemento actual es mayor que el maximo registrado..
Max = abs(AB(j,i))/S(j); %Asignamos el valor de este maximo
MaxF = j; %Asignamos la nueva fila maxima a su variable
end
end
if (MaxF ~= q) %Si el maximo no se encuantra en la fila de inicio
AB = IntercambioF(AB,MaxF,q); %Intercambiamos la fila de AB para q coincida
S = IntercambioF(S,MaxF,q); % Tambien se debe cambiar en S, puesto q el orden
B = intercambio(B,MaxF,q);
end
end %Columna ya ordenada
if (AB(i,i) == 0) %El elemento de la diagonal NO puede ser 0, si es cero no existe solucion unica
fprintf('No existe solucion unica para el sistema. Finalizado SIN exito'); %No existe solucion
unica
return;% Salimos
end
end
iteraciones = 0;
while (Ea > Es)
itereciones = iteraciones+1;
for i=1:c
Xant(i) = X(i);
end
for i = 1:c
numerador = B(i);
for j=1:c
if(i ~= j)
numerador = numerador - A(i,j)*X(j);
end
end
X(i)= numerador / A(i,j);
Eaprox(i) = abs(((X(i)-Xant(i))/X(i))*100);
if (Eaprox(i)<Es)
Ea = Eaprox(i);
else
Ea = 100;
end
end
end;
iteraciones
R = X






%A continuacion se encuentra la funcion IntercambioF, cuya funcion es
%intercambiar filas de una matriz. En principio esta operacion se puede
%realizar de dos formas, la expuesta y sabiendo q A(n,:) devuelve la fila
%completa n de la matriz A. Yo he escogido la primera forma porque es un
%metodo mas grafico y menos abstracto.

function Z = IntercambioF(V,f1,f2) %Funcion interna para intercambiar filas
[FV,CV] = size(V); %Obtenemos el numero de filas y columnas {F y C respectibamente}
CV1 = 0; %Aqui se un valor
for n = 1:CV %Bucle para recorrer las columnas
CV1 = V(f1,n); %CV1 = fila 1
V(f1,n) = V(f2,n); %Asignamos a
V(f2,n) = CV1; %Asignamos a la fila n f2 la fila CV1
end
Z = V; %el resultado es la nueva matriz V

You might also like