Sistemas de ecuaciones lineales

Práctica de Álgebra  Lineal, E.U.A.T., Curso 2005-2006

En esta práctica aprenderemos a discutir y resolver sistemas de ecuaciones lineales con el ordenador.

Algunas órdenes importantes

La orden RowReduce

Como se vio en la práctica anterior, RowReduce lleva a cabo el método de eliminación de Gauss sobre la matriz que se especifique como argumento, y da como respuesta el resultado. Una de las aplicaciones de esto es calcular el rango de una matriz, de forma que podemos aplicar el método de Rouché-Frobenius para discutir un sistema lineal; con la forma reducida podemos también dar la solución de cualquier sistema.

La orden Solve

La forma de la orden Solve es

Solve[{ecuacion1, ecuacion2,  ... },  {x1, x2 ... }]

Al ejecutar esta orden, el ordenador intenta resolver el sistema de ecuaciones dado en las variables x1, x2,... Ésta orden es general: sirve para cualquier tipo de ecuaciones, no sólo para sistemas lineales. La respuesta incluye todas las soluciones que el ordenador sea capaz de encontrar. El método que usa el ordenador es en general complicado, y el tiempo que tarda en dar la respuesta puede ser, en ciertos casos, mucho mayor que con los otros métodos de los que hablamos en esta práctica.

La orden LinearSolve

LinearSolve resuelve sistemas de ecuaciones lineales. Su forma general es

LinearSolve[M, v]

donde M es la matriz de coeficientes y v es el vector de términos independientes. La respuesta de LinearSolve es un posible vector solución del sistema, en caso de que el ordenador pueda encontrarla. (En general, v puede ser una matriz en lugar de un vector, y entonces la respuesta es una matriz de las dimensiones apropiadas, pero nosotros sólo resolveremos sistemas en los que la incógnita es un vector). Es importante darse cuenta de que la respuesta de LinearSolve es una posible respuesta, aun en el caso de que el sistema tenga muchas; por esto, sólo lo usaremos en el caso de sistemas compatibles determinados.

Discusión de sistemas de ecuaciones lineales

Podemos discutir un sistema usando el método de eliminación de Gauss para calcular los rangos de la matriz de coeficientes y de la matriz ampliada, que resulta de añadir el vector de términos independientes. Entonces el teorema de Rouché-Frobenius visto en teoría permite decidir si el sistema tiene solución o no, y cuántas en caso de que tenga. Este método sirve para un sistema concreto, pero no para sistemas dependientes de parámetros, ya que el ordenador no tiene en cuenta las diferencias posibles para distintos valores de los parámetros.

Ejemplo

Tenemos el siguiente sistema:

2x - 3y + 4z - t = 4
-x + 3y + 2z = -2
3x + 2y - 3z + 5t = 4
4x + 2y + 3z + 4t = -1

La matriz ampliada es la siguiente:

Amp  =  {{2, -3, 4, -1, 4}, {-1, 3, 2, 0, -2}, {3, 
          2, -3, 5, 4}, {4, 2, 3, 4, -1}}

Si la reducimos por filas vemos a la vez el rango de la matriz de coeficientes y el rango de la ampliada:

MatrixForm[RowReduce[Amp]]

Aquí el rango de la matriz ampliada es 4 (hay 4 filas no nulas), y el rango de la matriz de coeficientes (cuya forma reducida es la anterior, quitando la última columna) es 3. Por tanto, éste es un sistema incompatible.

NOTA: Es importante recordar que RowReduce no puede utilizarse directamente para discutir sistemas dependientes de parámetros. Un ejemplo sencillo es la ecuación siguiente, que depende del parámetro a:

a x = 7
(a-1) y = 3

Veamos lo que ocurre si reducimos la matriz ampliada con el método anterior:

Amp = {{a, 0, 7}, {0, a - 1, 3}}

MatrixForm[RowReduce[Amp]]

Aparentemente el rango de la matriz de coeficientes siempre es 2, el mismo que el de la ampliada; sin embargo, el resultado anterior no es válido cuando a vale 0 ó 1, ya que entonces hay divisiones por cero en la columna derecha del resultado. De hecho, el sistema es indeterminado cuando a toma alguno de esos valores. Más adelante veremos métodos para discutir un sistema dependiendo del valor de algunos parámetros.

Resolución de sistemas

Para resolver un sistema conviene decidir primero si tiene o no solución, como se ha explicado antes; después podemos usar las órdenes mencionadas al principio para hallar la solución, o usar RowReduce para hallarlas mediante el método de eliminación de Gauss, como se explica en teoría. Veamos algunos casos con ejemplos.

Un sistema compatible determinado

Consideramos la siguiente ecuación:

2x-3y+4z-t = 4
-x+3y +2z = -2
3x + 2y - 3z + 5t = 4
x + 2y + 3z - t = -1

Comprobamos qué tipo de sistema es como antes:

Amp = {{2, -3, 4, -1, 4}, {-1, 3, 2, 0, -2}, {3, 
            2, -3, 5, 4}, {1, 2, 3, -1, -1}};

RowReduce[Amp]

MatrixForm[%]

Vemos que el sistema es compatible determinado. La solución aparece en la columna derecha (x = 71/164, y=-135/164...). Nótese que éste es el mismo método que se sigue para resolverlo a mano.

Otra forma de resolverlo es usar la orden Solve:

Solve[{2  x - 3  y + 4  z - t == 
          4,  -x + 3  y + 2  z == -2, 
        3  x + 2  y - 3  z + 5  t == 4, 
        x + 2  y + 3  z - t == -1}, {x, y, z, t}]

Otra posible forma de resolverlo es usar LinearSolve. Para eso definimos la matriz de coeficientes y el vector de términos independientes:

X = {{2, -3, 4, -1}, {-1, 3, 2, 0}, {3, 2, -3, 
            5}, {1, 2, 3, -1}};
v = {4, -2, 4, -1};

Y a continuación usamos LinearSolve:

LinearSolve[X, v]

Por supuesto, el resultado es el mismo con todos los métodos que hemos mencionado.

Un sistema compatible indeterminado

Resolvamos el sistema siguiente:

x - 3y + z - t = -2
-x + 3y + 2z = -2

Una forma de hacerlo es usar RowReduce:

Amp = {{1, -3, 1, -1, -2}, {-1, 3, 2, 
            0, -2}};

MatrixForm[RowReduce[Amp]]

Con el método estudiado en teoría sabemos que el sistema es indeterminado; podemos despejar las variables x, z para obtener una familia de soluciones que dependen de los valores que demos a las variables y,t:

x = 3y +2/3 t -2/3
z = 1/3 t - 4/3

También podemos usar Solve, como antes:

Solve[{x - 3  y + z - t == -2, -x + 3  y + 
            2  z == -2}, {x, y, z, t}]

El ordenador da una advertencia porque no se pueden encontrar soluciones para todas las variables, sino que el valor de unas depende del valor que se elija para otras.

Ejercicio

Intenta usar LinearSolve para resolver este sistema. ¿Se obtienen todas las soluciones?

Resolución de sistemas que dependen de parámetros

Mathematica también permite discutir y resolver sistemas en función de uno o más parámetros. Por ejemplo, vamos a discutir y resolver el sistema:
	 ({{a x + y + z = a}, {x + a y + z = (a^2)}, {x + y + a z = (a^3)}}) 
en función del parámetro 𝒶.

Para este tipo de ejercicios emplearemos el comando Reduce al cual hay que darle como dato dos listas: una con las ecuaciones que constituyen el sistema y otra con las incógnitas (las variables que aparezcan en las ecuaciones pero no sean incluidas en la lista de incógnitas se entenderán como parámetros). En nuestro caso particular:

Reduce[{a x + y + z == a, x + a y + z == a^2, 
        x + y + a z == a^3}, {x, y, z}]

La respuesta que ofrece este comando incluye varios operadores relacionales lógicos como el de igualdad "==", desigualdad "!=" y los operadores y "&&" y o "||".  Observamos en el ejemplo anterior que se distinguen dos  casos mediante el símbolo ||. El primer  caso indica que la solución cuando a=1 es z=1-x-y.  Esto hay que interpretarlo como que para dicho valor de a el sistema será compatible indeterminado y las soluciones serán x=α, y=β, z=1-α-β. En el caso a!=-2,1, el sistema tiene única solución x=((-a - (a^2))/(2 + a)),y=(a/(2 + a)),z=((a + 2 (a^2) + (a^3))/(2 + a)). Será por tanto, un sistema compatible determinado para estos valores de a.  Por eliminación queda un caso, cuando a=-2, del que no dice nada, por lo que cabe interpretar que en este caso el sistema es incompatible.

Veamos otro ejemplo. Vamos a discutir y resolver cuando sea posible el siguiente sistema:
	 ({{ x + y = 3}, {2  x + a y = 0}})

Reduce[{x + y == 3, 2  x + a y == 0}, {x, y}]

Del resultado anterior deducimos que cuando a!=2, el sistema es compatible determinado y su única solución es x=((3 a)/(-2 + a)),y=-(6/(-2 + a)). Para el caso a=2  no aparece ninguna solución, por lo que deducimos que entonces el sistema es incompatible para este valor de a.

Descomposición LU

Clear[L, U, L1, L2, U1, U2]

Este ejercicio consiste en programar la descomposición L.U  de una matriz. Tomamos una matriz A dada, por ejemplo la siguiente:

A = Table[i^j - 100, {i, 6}, {j, 6}]

Queremos encontrar matrices L (de 'Lower') triangular inferior, y U (de 'Upper') triangular superior, tales que A=L.U, y de forma que L tenga la diagonal de unos. La utilidad de este método consiste en que, una vez que hemos escrito la matriz de coeficientes de esta forma, es muy rápido resolver el sistema para muchos términos independientes distintos (cuando vamos a resolver el sistema una sola vez, este método no es especialmente bueno).

Comenzamos por definir las matrices, que llamamos por ahora L1 y U1 (obsérvese que si las llamamos simplemente L y U obtenemos error; ¿por qué?).

L1 = 
        Table[If[i > j, L[i, j], 0], {i, 6}, {j, 6}] + 
          IdentityMatrix[6];

MatrixForm[L1]

U1 = 
        Table[If[i ≤ j, U[i, j], 0], {i, 6}, {j, 6}];

MatrixForm[U1]

Ahora tenemos que definir las variables del sistema, que son las entradas de las matrices U=(U[i,j] )y L=(L[i,j]). Para ello las introducimos en una matriz y posteriormente las recolocamos en un único vector con el comando Flatten.

Var = 
        Table[If[i > j, L[i, j], U[i, j]], {i, 6}, {j, 6}];

variables = Flatten[Var]

Finalmente resolvemos el sistema que se forma, y calculamos las matrices L1 y U1, a las que ya llamamos L y U.

soluciones = Solve[L1 . U1 == A, 
            variables][[1]];

U = U1 /. soluciones;

MatrixForm[U]

L = L1 /. soluciones;

MatrixForm[L]

Antes de terminar comprobamos que está todo bien:

MatrixForm[L . U]
MatrixForm[A]

Ejercicios

1 - Discute y resuelve los siguientes sistemas de ecuaciones:

a)
3x + 2y + z = 1
5x + 3y + 3z = 2
x + y - z = 1

b)
2x + y + z + w = 0
-4x - 2y + z - 6w = 7
7x + 3.5y + 2z + 8w = 9

c)
3x + 2y + 5z - w = 49
2x - y - z + w = 2
x + y - 3z - 2w = -11
w = 0

2 - Discute los siguientes sistemas en función de los parámetros (a, b y λ) que aparecen (estos ejercicios son de la relación de teoría):

a)
x + y + λz = λ
λx + λy + z = 1
x + λy + z = λ

b)
x + λy + z = 1
x + y + z = λ + 1
λx + y + (λ-1)z = λ

c)
ax + by + z = 1
x + aby + z = b
x + by + bz = 1

d)
-ax + y + az = 0
x + 3y - az = 4
-x + 2ay = a + 2
2x - y - 2z = 0

Ejercicios adicionales

2 - Usando la orden Random[], crea una matriz de coeficientes de tamaño 100x100 con números al azar y un vector de términos independientes con 100 números también al azar. Resuelve el sistema lineal con esa matriz y ese vector primero usando LinearSolve, y luego usando Solve. ¿Qué método es más rápido? ¿Por qué crees que pasa esto? (Nota: puedes buscar la orden Random[] en la ayuda del Mathematica, y puedes usar la orden Timing[] para ver el tiempo que lleva cada cálculo).

3 - Escoge un término independiente cualquiera y termina de resolver el sistema del apartado sobre la descomposición LU.

4 - Escribe un programa corto que resuelva un sistema lineal cuando la matriz de coeficientes es triangular superior o inferior, usando el método recursivo que se estudia en teoría.