for j=1:(n+1)
aux=C(k,j); %para poder intercambiar las filas, utilizamos una
%variable auxiliar
C(k,j)=C(filam,j);
C(filam,j)=aux;
end
end
end
fprintf('\nLa matriz correspondiente a esta etapa antes del proceso:\n')
disp(C)
fprintf('\nLos Multiplicadores correpondientes a esta etapa son:\n')
for i=(k+1):n
m(i,k)=C(i,k)/C(k,k); %formula multiplicadores
fprintf('\nm(%g,%g)=',i,k)
disp(m(i,k));
for j=k:(n+1)
C(i,j)= C(i,j) - m(i,k)*C(k,j);%formula nueva fila
end
end
fprintf('\nLa matriz correspondiente a esta etapa despues del proceso:\n')
disp(C)
end
for i=n:-1:1
suma=0;
for p=(i+1):n
suma = suma + C(i,p)*X(p);
end
X(i)=(C(i,n+1)-suma)/C(i,i);
%formula de la susticion regresiva y solucion de las variables
end
else %funcion asignada del if, en caso de que este sea falso
%-Modulo: GPivParEsc
%-Autor: Aitor Calderon Martinez {aitorc@navegalia.com}
%-Proposito: Calculo de ecuaciones lineales por el metodo de Gauss con
%
%-Funciones:
%
%
tiempo transcurrido durante la ejecucion del programa
{timepo_inicial %
tiempo_final.}
function R = GPivParEsc(A,B)
t = cputime; %Obtenemos el los segundos actuales
format rat; %Pedimos al programa que use fracciones en vez de numeros {con
esto el error sera menor}
ANALISIS NUMERICO COMPUTACIONAL
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 ha cambiado
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
for j = (i+1):F %Modificamos las filas para hacer 0's
m = (AB(j,i)/AB(i,i)); %m sera el multiplicando, es necesario declararlo
%antes de intercambiar las filas porque el valor de los elementos
%de las mismas variara cuando hagamos 0's, y por consiguiente el
%valor de m
for q = 1:(C+1) %Para cada elemento de la fila...
AB(j,q) = AB(j,q) - m*AB(i,q); %Realizamos el cambio
ANALISIS NUMERICO COMPUTACIONAL
end
end
end
for i = 1:F
if (AB(i,i) == 0) %Ningun 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
X = [0;0]; %matriz con los resultados
X(F) = AB(F,F+1)/AB(F,F); %Asignamos el ultimo elemento
for i = (F-1):-1:1 %Y vamos calculando los demas
Sum = 0; %inicializacion de la variable Sum {para calcular el sumatorio}
for j = (i+1):F %bucle para el sumatorio, para cada fila...
Sum = Sum + AB(i,j)*X(j); %Calculamos el resultado actual y lo aadimos
al conocido
end
X(i) = (AB(i,F+1)-Sum)/AB(i,i); %Obtenemos X(i)
end
fprintf('Resolucion del sistema concluida en: %d segundos. El resultado: \n',
(cputime - t));
R = X; %El resultado es 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 bastracto.