ALGEBRA LINEAL

Muchos cálculos implican la resolución de sistemas de ecuaciones lineales. En muchos casos, te resultará conveniente escribir las ecuaciones explícitamente y luego resolverlas con Solve.

En algunos casos, sin embargo, puede que prefiera convertir el sistema de ecuaciones lineales en una ecuación matricial y luego aplicar operaciones de manipulación de matrices para resolverlo. Este enfoque suele ser útil cuando el sistema de ecuaciones surge como parte de un algoritmo general y no se sabe de antemano cuántas variables estarán involucradas.

Un sistema de ecuaciones lineales se puede expresar en forma matricial como m.x == b, donde x es el vector de variables.

Tenga en cuenta que si su sistema de ecuaciones es disperso, de modo que la mayoría de las entradas en la matriz m son cero, lo mejor es representar la matriz como un objeto SparseArray. Como se explica en “Matrices Dispersas: Álgebra Lineal”, puede convertir ecuaciones simbólicas a objetos SparseArray mediante CoefficientArrays. Todas las funciones descritas aquí funcionan tanto con objetos SparseArray como con matrices ordinarias.

Resolviendo sistemas lineales

LinearSolve [m, b]
Un vector x que resuelve la ecuación matricial: m.x == b.

NullSpace [m]
Una lista de vectores linealmente independientes cuyas combinaciones lineales abarcan todas las soluciones de la ecuación matricial m.x == 0

MatrixRank [m]
Da el número de filas o columnas linealmente independientes de m.

RowReduce [m]
Da una forma simplificada de m obtenida al realizar combinaciones lineales de filas.

Ejemplos:

Clear["Global`*"]

Definimos una matriz de 2 por 2:

m={{1,5},{2,1}};

MatrixForm[m]

Al aplicar la ecuación matricial m.x == b nos da dos ecuaciones lineales:

m.{x,y}=={a,b}

Podemos resolver las ecuaciones directamente usando el comando Solve:

Solve[%,{x,y}]

El comando Solve aplica al sistema de ecuaciones.

También puedes obtener el vector de soluciones mediante LinearSolve. El resultado es equivalente al que se obtiene con Solve:

LinearSolve[m,{a,b}]

El comando LinearSolve aplica a la matriz m para resolver la ecuación matricial.

Otra forma de resolver las ecuaciones es invertir la matriz m y luego multiplicar {a,b} por la inversa. Esto no es tan eficiente como usar LinearSolve:

Inverse[m].{a,b}

RowReduce realiza una versión de eliminación gaussiana y también se puede utilizar para resolver las ecuaciones:

RowReduce[{{1,5,a},{2,1,b}}]

Si se tiene una matriz cuadrada m con determinante distinto de cero, siempre se puede encontrar una solución única para la ecuación matricial m.x == b para cualquier b. Sin embargo, si la matriz m tiene determinante cero, entonces puede no haber ningún vector, o un número infinito de vectores x que satisfagan m.x == b para un b particular. Esto ocurre cuando las ecuaciones lineales incorporadas en m no son independientes.

Cuando m tiene determinante cero, siempre es posible encontrar vectores x distintos de cero que satisfagan m.x = 0. El conjunto de vectores x que satisfacen esta ecuación forma el espacio nulo o núcleo de la matriz m. Cualquiera de estos vectores puede expresarse como una combinación lineal de un conjunto particular de vectores base, que se obtiene utilizando EspacioNulo[m].

Ejemplos:

Clear["Global`*"]

Aquí hay una matriz simple, correspondiente a dos ecuaciones lineales idénticas:

m={{1,2},{1,2}}

MatrixForm[%]

LinearSolve no puede encontrar una solución a la ecuación m.x == b en este caso:

LinearSolve[m,{a,b}]

Hay un único vector base para el espacio nulo de m:

NullSpace[m]

Al multiplicar el vector base del espacio nulo por m se obtiene el vector cero:

m.%[[1]]

Solo hay una fila linealmente independiente en m:

MatrixRank[m]

NullSpace y MatrixRank deben determinar si determinadas combinaciones de elementos de la matriz son cero. Para matrices numéricas aproximadas, se puede usar la opción Tolerance para especificar qué tan cerca de cero se considera suficiente. Para matrices simbólicas exactas, a veces puede ser necesario especificar algo como ZeroTest->(FullSimplify[#]==0&) para forzar un análisis más exhaustivo y comprobar si las expresiones simbólicas son cero.

Aquí hay una matriz simbólica simple con determinante cero:

m={{a,b,c},{2 a,2 b,2 c},{3 a,3 b,3 c}}

La base del espacio nulo de m contiene dos vectores:

NullSpace[m]

Multiplicar m por cualquier combinación lineal de estos vectores da cero:

Simplify[m.(x %[[1]]+y %[[2]])]

Matrices rectangulares

Una característica importante de funciones como LinearSolve y NullSpace es que funcionan con matrices rectangulares y cuadradas.

Cuando se representa un sistema de ecuaciones lineales mediante una ecuación matricial de la forma m.x == b, el número de columnas en m indica el número de variables, y el número de filas indica el número de ecuaciones. Existen varios casos.

Indeterminado (Undetermined)
Cuando el número de ecuaciones es menor que el número de variables; pueden existir muchas soluciones o ninguna.

Sobredeterminado (Undetermined)
Cuando el número de ecuaciones independientes es mayor que el número de variables; las soluciones pueden existir o no.

No singular (Nonsingular)
Cuando número de ecuaciones independientes igual al número de variables y determinante distinto de cero; existe una solución única.

Consistente (Consistent)
Existe al menos una solución.

Inconsistente (Inconsistent)
No existen soluciones.

Ejemplos:

Esto pide la solución al conjunto inconsistente de ecuaciones x == 1 y x == 0:

LinearSolve[{{1},{1}},{1,0}]

La siguiente matriz representa dos ecuaciones para tres variables:

m={{1,3,4},{2,1,3}}

MatrixForm[%]

LinearSolve proporciona una de las posibles soluciones a este conjunto subdeterminado de ecuaciones:

v=LinearSolve[m,{1,1}]

Cuando una matriz representa un sistema de ecuaciones indeterminado, la matriz tiene un espacio nulo no trivial. En este caso, el espacio nulo está abarcado por un único vector:

NullSpace[m]

Si tomas la solución que obtienes de LinearSolve y agregas cualquier combinación lineal de los vectores base para el espacio nulo, aún obtienes una solución:

m.(v+4 %[[1]])

El número de ecuaciones independientes es el rango de la matriz MatrixRank[m]. El número de ecuaciones redundantes es Length[NullSpace[m]]. Nótese que la suma de estas cantidades siempre es igual al número de columnas en m.

MatrixRank[m]

Length[NullSpace[m]]

LinearSolve [m]
Genera una función para resolver ecuaciones en forma matricial: m.x == b.

En algunas aplicaciones, querrás resolver ecuaciones de la forma m.x == b varias veces con la misma m, pero con un valor de b diferente. Puedes hacerlo eficientemente en Wolfram Language usando LinearSolve[m] para crear una única función LinearSolveFunction que puedas aplicar a tantos vectores como desees.

Esto crea la LinearSolveFuntion:

f=LinearSolve[{{1,4},{2,3}}]

Se puede aplicar esto al vector:

f[{5,7}]

Obtendrás el mismo resultado al dar el vector como un segundo argumento explícito a LinearSolve:

LinearSolve[{{1,4},{2,3}},{5,7}]

Podemos aplicar f a cualquier vector que quieras:

f[{-5,9}]

LeastSquares [m, b]
Da un vector x que resuelve el problema de mínimos cuadrados m.x == b

El siguiente sistema lineal es inconsistente:

LinearSolve[{{1,2},{3,4},{5,6}},{-1,0,2}]

LeastSquares encuentra un vector x que minimiza m.x-b en el sentido de mínimos cuadrados:

LeastSquares[{{1,2},{3,4},{5,6}},{-1,0,2}]