Вы находитесь на странице: 1из 11

Consideremos un conjunto de "m" ecuaciones con "n" incgnitas dado por:

.....
.....
.....

Donde
son coeficientes conocidos,
denominan trminos no homogneos.

son incgnitas y

son trminos conocidos que se

El sistema de ecuaciones lineales anteriores pueden expresarse de la forma compacta como:

Donde A, x , y estn definidos respectivamente por:

Resolver un sistema de ecuaciones es encontrar el valor de las incgnitas "x".


Una forma de resolver este sistema de ecuaciones es utilizando la formula
multiplicndola por la matriz inversa de A por ambos lados de la igualdad; de la siguiente
manera:

(I es la matriz identidad)
De esta manera encontramos que si calculamos la inversa de A y la multiplicamos por el vector
"y", obtendremos el vector "x" con las soluciones al sistema de ecuaciones.
Los sistemas de ecuaciones pueden presentar tres casos:

Es el ms comn, ya que el nmero de ecuaciones es igual al nmero de incgnitas.


El nmero de ecuaciones es menor que el de incgnitas y tenemos lo que se conoce
como problema subdeterminado.
El nmero de ecuaciones es mayor que es de incgnitas y tenemos lo que se conoce
como problema sobredeterminado. Esto ocurre en el ajuste de rectas y curvas.

TRABAJANDO EN MATLAB
Considere el siguiente sistema de tres ecuaciones con tres incgnitas:
3X+2Y-Z=10
-X+3Y+2Z=5
X-Y-Z=-1
Este sistema de ecuaciones se puede rescribir con las siguientes matrices:
A= [3 2 -1; -1 3 2; 1 -1 -1]

X= [x; y; z] B=[10; 5; -1]

Al usar multiplicacin matricial se puede escribir entonces el sistema de


ecuaciones
AX = B.
Solucin con el uso de la matriz inversa
Probablemente la forma ms directa de resolver este sistema de ecuaciones
es usar la matriz inversa. Dado que se sabe que
A^-1*A = 1
Se pueden multiplicar ambos lados de la ecuacin matricial AX = B por A^1 para obtener
A^-1*AX = A^-1*B
Lo que produce
X = A^-1*B
Puesto que en MATLAB la matriz inversa se calcula con la funcin inv, se
puede usar
El siguiente conjunto de comandos para resolver este problema:
A= [3 2 -1; -1 3 2; 1 -1 -1];
B= [10; 5; -1];
X= inv(A)*B
Entonces
X=
-2.0000
5.0000

-6.0000
De manera alternativa, podra representar la matriz inversa como A^-1, de
modo que
X=A^-1*B
Lo que regresa
X=
-2.0000
5.0000
-6.0000
Una mejor forma de resolver un sistema de ecuaciones lineales es usar una
tcnica llamada
Eliminacin gaussiana. En realidad sta es la forma en que usted
probablemente aprendi a
Resolver sistemas de ecuaciones en el lgebra de bachillerato. Considere el
problema de tres
Ecuaciones en x, y and z:
3X+2Y-Z=10
-X+3Y+2Z=5
X-Y-Z=-1
Para resolver este problema a mano, se consideraran primero las dos
primeras ecuaciones
En el conjunto y se eliminara una de las variables, por ejemplo, x. Para
hacer esto necesitar
Multiplicar la segunda ecuacin por 3 y luego sumar la ecuacin resultante a
la primera:
A: 3x+2y-z=10
B:(x3)-x+3y+2z=5
B:-3x+9y+6z=15
A+B: 0+11y+5z = 25
Ahora se necesita repetir el proceso para la segunda y tercera ecuaciones:
C: -x+3y+2z= 5
D: x -y- z= -1
C+D: 0+2y+z=4
En este punto, se elimin una variable y el problema se redujo a dos
ecuaciones y dos incgnitas:
11y+5z=25
2y+z=4
Ahora se puede repetir el proceso de eliminacin al multiplicar la fila 3 por
-11/2:
E: 11y +5z=25
F: -11/2*2y-11/2z=-11/2*4

E+F: 0-1/2z=3
Finalmente, se puede resolver para z:
Z=-6
Una vez que se conoce el valor de z, se puede sustituir de vuelta en
cualquiera de las dos ecuaciones
Con slo z and y, a saber,
11y+5z=25
2y+z=4
Para encontrar que
y=5
ltimo paso es sustituir de nuevo en una de las cuatro ecuaciones
originales,
3X+2Y-Z=10
-X+3Y+2Z=5
X-Y-Z=-1
Para encontrar que
x=-2
La tcnica de eliminacin gaussiana es un enfoque organizado para eliminar
variables hasta
Que slo existe una incgnita y luego sustituir de nuevo hasta que se
determinan todas las
Incgnitas. En MATLAB se puede usar divisin izquierda para resolver el
problema por eliminacin
Gaussiana.
X=A\B
Regresa
X=
-2.0000
5.0000
-6.0000

Prctica 3. Sistemas de ecuaciones


lineales I (Mtodo de Gauss)
En la prctica anterior vimos como expresar un sistema lineal en forma matricial, como
comprobar la solucin de un sistema, y como 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 como 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(1,n)*x(n)

A(2,n-1)*x(n-1)

A(2,n)*x(n)

...
b(n-1),
b(n).

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

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 es
compatible indeterminado, se pueden dar las soluciones dependiendo de un
parmetro)
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
0
0

2
-3
0

3
-6
1

5
-9
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
% disp('Tras hacer ceros en la columna');
% disp(k)
% disp('queda el sistema equivalente:')
% disp([A b])
end

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.

Вам также может понравиться