% 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