Académique Documents
Professionnel Documents
Culture Documents
Contents
Resolucin de un sistema triangular superior. Resolucin de un sistema triangular inferior. Mtodo de Gauss (Ejemplo). Mtodo de Gauss (Programacin del mtodo).
Emplearemos este mtodo para resolver un sistema lineal de n ecuaciones y n incgnitas donde la matriz de coeficientes tiene ceros debajo de la diagonal. Consideramos un sistema como el siguiente:
A(1,1)*x(1) + A(1,2)*x(2) + ... + b(1), A(2,2)*x(2) + ... + b(2), A(1,n-1)*x(n-1) A(2,n-1)*x(n-1) + + A(1,n)*x(n) A(2,n)*x(n) = =
...
Podemos despejar x(n) de la ltima ecuacin con lo que x(n)=b(n)/A(n,n). Conociendo x(n) podemos despejar x(n-1) de la penltima ecuacin. Siguiendo este proceso, supongamos que ya hemos hallado x(n), x(n-1), ... x(i+1) y queremos despejar x(i) de la ecuacin i-sima
A(i,i)*x(i) + A(i,i+1)*x(i+1) + ... + A(i,n)*x(n) = b(i), entonces tenemos x(i)=(b(i) - S )/A(i,i), donde S = A(i,i+1)*x(i+1) + ... + A(i,n)*x(n) .
Nos proponemos expresar el valor de S como un producto escalar de un vector fila por un vector columna.
S = A(i,i+1)*x(i+1) + ... + A(i,n)*x(n) .
En Matlab, el vector fila A(i,i+1:n) contiene los elementos que estn en la fila i, y en las columnas desde la i+1 hasta la n, es decir A(i,i+1), A(i,i+2), A (i,i+3), ... A(i,n-1), A(i,n). El vector columna x(i+1:n) contiene los elementos de x que van desde el i+1 hasta el n, es decir x(i+1), x(i+2), ..., x(n-1), x(n). Por tanto el valor de S se puede calcular como S=A(i,i+1:n)*x(i+1:n), con lo que usamos las operaciones vectores de Matlab. Podemos escribir el pseudocdigo que permite resolver el sistema.
Entrada A, b. n = nmero de filas de A. Inicializamos x. Para i=n, n-1, n-2, ..., 1 x(i)= (b(i)- A(i,i+1:n)*x(i+1:n))/A(i,i) Siguiente i.
Ej 1. Empleando el cdigo que hemos visto escriba un script que permita resolver el sistema
x1 + 2*x2 + 3*x3 + x4 x2 + 4*x3 + x4 x3 + 2*x4 3*x4 + + x5 x5 x5 x5 2*x5 = = = = = 7, 6, -5, -2, 2.
Compruebe el resultado con la 'divisin izquierda' (Sol. x1=1, x2=0, x3=2, x4=-1, x5=1). Ej 2. Modifique el programa para que imprima (usando disp o fprintf) un mensaje como 'El elemento 3 de la diagonal es cero' si algn elemento de la diagonal vale cero, pero que no interrumpa el mtodo. Aplique el programa a la resolucin del sistema A*x=b donde A=[1,2,3,1,1;0,2,4,-1,-1;0,0,0,2,-1;0,0,0,3,1;0,0,0,0,-2], b=[2;3;-5;-5;-2]. (Sol. x5=1, x4=2.) (El sistema planteado tiene infinitas soluciones, es compatible indeterminado. Resolviendo a mano se podran dar las soluciones dependiendo de un parmetro : x5=1, x4=-2, x3=x1-1, x2=-2*x1+3 )
En este sistema se puede despejar x(1) de la primera ecuacin. Una vez hallado el valor de x(1), se puede hallar x(2) despejando en la segunda ecuacin. Supongamos que ya hemos hallado x(1), x(2), ..., x(i-1). Considerando la ecuacin i-sima ( A(i,1)*x(1) + A(i,2)*x(2) + ... + A(i,i-1)*x(i-1) ) + A(i,i)*x(i) =b(i) podemos despejar x(i).
Ej 3. a) Despeje (en papel) x(i) en la ltima ecuacin. b) Exprese (en papel) el valor de x(i) usando un producto escalar de un vector fila por un vector columna. c) Programe la resolucin de un sistema triangular inferior. d) Compruebe el programa resolviendo el sistema A*x=b donde A=[1,0,0,0,0; 0,2,0,0,0; 1,1,1,0,0; 0,-1,0,3,0; -2,0,1,0,-2], b=[1;4;6;10;-9]. (Sol. x = [1;2;3;4;5] )
Hacemos ceros en la primera columna debajo del elemento A(1,1) . A la segunda fila le restamos dos veces la primera
A(2,:)=A(2,:)-2*A(1,:) ; b(2)=b(2)-2*b(1) ; % A la tercera fila le restamos la primera A(3,:)=A(3,:)-A(1,:) ; b(3)=b(3)-b(1) ; % Vemos que hemos hecho ceros en la primera columna disp([A b]) 1 2 3 5 0 -3 -6 -9 0 -1 -1 -1
Para hacer cero en A(3,2) debemos restar a la tercera fila un mltiplo de la segunda.
A(3,:)=A(3,:)-(-1/-3)*A(2,:) ; b(3)=b(3)-(-1/-3)*b(2) ; % Vemos que hemos hecho ceros debajo de la diagonal, con lo que el sistema
% % % % end
disp('Tras hacer ceros en la columna'); disp(k) disp('queda el sistema equivalente:') disp([A b])
Una vez transformado el sistema original en uno equivalente pero triangular superior, un mtodo como el que se vi al principio de esta prctica permite hallar la solucin del sistema. Podemos comprobar que la solucin del sistema triangular A0*x=b0 es solucin del sistema original A*x=b.
x=A0\b0; A*x-b ans = 1.0e-015 * 0 0 0 -0.8882
. Ej 4. El sistema A0*x=b0 dado por A0=[1,0,3,2,-1 ; 3,0,-2,1,1 ; 2,7,1,0,3 ; 1,2,3,-1,2; 1,2,3,-1,0] b0=[5;4;3;2;1] se sabe que es compatible determinado (puede hallar el determinante de A0 y comprobar que A0\b0 calcula la solucin del sistema), pero el mtodo de Gauss implementado no obtiene la solucin. A qu se debe? (Indicacin : observe las operaciones que se realizan con los elementos A(k,k). ) Ej 5. Escriba un programa que aplique el mtodo de Gauss al sistema A0*x=b0 donde A0=[1,0,3,2,-1 ; 3,1,-2,1,1 ; 2,7,1,0,3 ; 1,2,3,-1,2; 1,2,3,-1,0]; b0=[17;16;44;22;20] de forma que transforme el sistema a uno triangular superior equivalente, y luego aplique el mtodo visto para resolver sistemas triangulares superiores. (Sol. x0=[5;4;3;2;1]). Las operaciones que se aplican en esta implementacin del mtodo de Gauss actuan sobre toda la fila a pesar de que los primeros elementos de cada fila sern cero, con lo cual se estn efectuando operaciones innecesarias. As al hacer ceros en la columna k, en las filas i=k+1,...,n los elementos A(i,k) son cero. Se proponen dos formas de evitar operaciones innecesarias modificando la lnea A(i,:)= A(i,:)li * A(k,:); i) Emplear un bucle for con variable j que vaya operando en las columnas de la k+1 hasta la n. (recuerde los apuntes de clase) ii) Hacer la operacin por filas indicando que deben considerarse las columnas de la k+1 hasta la n, es decir, debe asignarse slamente A(i,k+1:n).
Ej 6. Compruebe (con papel) que, en el mtodo de Gauss implementado, los elementos A(i,k) para i=k+1,...,n son cero. . Ej 7. Implemente el mtodo de Gauss sustituyendo la lnea A(i,:)= A(i,:)-li * A(k,:) por un bucle for como se indica en i) y asignando A(i,k)=0. Puede comprobar el mtodo con el mismo ejemplo A0=[1,2,3,2 ; 3,-3,-6,1 ; 2,1,7,0 ; 2,3,2,2]; b0=[12;-10;22;9]; . Ej 8. Implemente el mtodo de Gauss sustituyendo la lnea A(i,:)= A(i,:)-li * A(k,:) por una lnea que comienze por A(i,k+1:n)= ... y asignando A(i,k)=0. Puede comprobar el mtodo con el mismo ejemplo A0=[1,2,3,2 ; 3,-3,-6,1 ; 2,1,7,0 ; 2,3,2,2]; b0=[12;-10;22;9]; . Ej 9. Cul de las dos implementaciones sugeridas en i) y ii) cree que es ms eficiente? Calcule con las instrucciones tic y toc el tiempo que tardan los dos nuevos programas en resolver un sistema.