Vous êtes sur la page 1sur 7

Prctica .

Sistemas de ecuaciones lineales I (Mtodo de Gauss)


En la prctica anterior vimos cmo expresar un sistema lineal en forma matricial, cmo comprobar la solucin de un sistema, y cmo usar la 'divisin izquierda' para hallar una solucin. Tambin vimos ejemplos de sistemas mal condicionados, y sistemas donde la 'divisin izquierda' no da una solucin porque el sistema es incompatible. En esta prctica veremos cmo resolver sistemas triangulares y el mtodo de Gauss para resolver sistemas lineales.

Contents

Resolucin de un sistema triangular superior. Resolucin de un sistema triangular inferior. Mtodo de Gauss (Ejemplo). Mtodo de Gauss (Programacin del mtodo).

Resolucin de un sistema triangular superior.


Consideremos un sistema de tres ecuaciones y tres incgnitas como el siguiente
A11*x1 + A12*x2 + A13*x3 = b1, A22*x2 + A23*x3 = b2, A33*x3 = b3. Para hallar su solucin podemos despejar x3 en la ltima ecuacin, x3=b3/A33. Con este valor de x3, podemos despejar x2 en la segunda ecuacin x2=(b2-A23*x3)/A22. Y con los valores hallados de x3 y x2 podemos despejar x1 en la primera ecuacin x1=(b1-A12*x2-A13*x3)/A11.

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) = =

...

A(n-1,n-1)*x(n-1) + A(n-1,n)*x(n) = b(n-1), A(n,n)*x(n) = b(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.

El siguiente cdigo Matlab permite resolver un sistema triangular superior.


% Matriz del sistema A=[1 3 2 2 1; 0 1 2 4 1; 0 0 2 1 -1; 0 0 0 3 -2; 0 0 0 0 2]; % Trmino independiente b=[-2;-1;-2;-9;6]; % Hallamos el nmero de ecuaciones del sistema. n=length(A); % Definimos un vector-columna para almacenar la solucin. x=zeros(n,1); % El bucle va desde la ltima ecuacin hasta la primera for i=n:-1:1 x(i)= (b(i)- A(i,i+1:n)*x(i+1:n))/A(i,i); end

disp('La solucin del sistema es '); disp(x); La solucin del sistema es 1 -2 1 -1 3

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 )

Resolucin de un sistema triangular inferior.


Consideremos ahora un sistema cuya matriz de coeficientes tiene ceros por encima de la diagonal:
A(1,1) *x(1) =b(1), A(2,1) *x(1) + A(2,2) *x(2) =b(2), ... A(n-1,1)*x(1) + A(n-1,2)*x(2) + ... + A(n-1,n-1)*x(n-1) =b(n-1), A(n,1) *x(1) + A(n,2)*x(2) + ... + A(n,n-1)*x(n-1) + A(n,n)*x(n)=b(n).

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] )

Mtodo de Gauss (Ejemplo).


El mtodo de Gauss permite resolver sistemas lineales de ecuaciones. La idea del mtodo consiste en efectuar operaciones de filas a la matriz del sistema de forma que el sistema resultante (que es equivalente al original) tenga la matriz del sistema triangular superior. Veremos en primer lugar un ejemplo en el que, haciendo operaciones elementales por filas haremos ceros debajo de la diagonal principal. Consideramos el siguiente sistema de tres ecuaciones y tres incgnitas x + 2*y + 3*z = 5, 2*x + y = 1, x + y + 2*z = 4. Para hacer operaciones elementales en estas ecuaciones podramos efectuarlas sobre las filas de la matriz ampliada [A b], pero en este ejemplo, realizaremos las mismas operaciones sobre la matriz A y sobre el vector b de su formulacin matricial. Definimos la matriz del sistema y el vector trmino independiente.
A=[1 2 3; 2 1 0; 1 1 2]; b=[5;1;4];

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

% que resulta es triangular superior. disp([A b]) 1 2 3 5 0 -3 -6 -9 0 0 1 2

Mtodo de Gauss (Programacin del mtodo).


Siguiendo la notacin dada en clase al explicar el mtodo de Gauss, la variable k indicar la columna en la que vamos a hacer ceros. La variable i indica la fila en la que estamos haciendo ceros. Para simplificar la notacin y ahorrar memoria, no usaremos superndices, llamaremos A0 a la matriz original del sistema y b0 al trmino independiente original. La matriz A y el vector b contendrn los sucesivos sistemas equivalentes, si estamos haciendo ceros en la columna k, A indicar la matriz con superndice k. Dado k, suponemos que ya se han hecho ceros en las columnas 1, ..., k-1 y hacemos ceros en la columna k en las filas i>=k+1 mediante la operacin por filas 'restar a la fila i la fila k multiplicada por li' donde li es el valor li=A(i,k)/A(k,k) . El programa ProgGauss.m implementa el mtodo. Dicho programa incluye las instrucciones tic y toc que sirven para mostrar el tiempo que emplea Matlab en ejecutar un conjunto de instrucciones. Basta con poner la instruccin tic antes del conjunto de instrucciones y toc al final. Al ejecutarse la instruccin toc se muestra el tiempo que emplea Matlab en ejecutar el conjunto de instrucciones. Definimos el sistema que queremos resolver.
A0=[1,2,3,2 ; 3,-3,-6,1 ; 2,1,7,0 ; 2,3,2,2]; b0=[12;-10;22;9]; % Inicializamos la matriz A y el vector b en los que efectuaremos las % operaciones por filas. A=A0; b=b0; n=length(A);

Haremos ceros en la columna k, donde k va desde la primera columna a la ltima.


for k=1:n % i va desde la fila k+1 hasta la ltima. for i=k+1:n li= A(i,k)/A(k,k); % Restamos a la fila i un mltiplo de la fila k. A(i,:)= A(i,:)-li * A(k,:); % Efectuamos la misma operacin en el vector b. b(i)=b(i)-li * b(k); end

% % % % 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.

Vous aimerez peut-être aussi