Un problema de cálculo que se puede resolver fácilmente con Python son los sistemas de ecuaciones lineales. Gracias a las matrices de numpy
se puede conseguir el resultado poco más de un par de líneas. Por ejemplo, para resolver un sistema de ecuaciones lineales con numpy solamente se ha de utilizar el siguiente bloque de código:
import numpy as np A = np.matrix([[2, 3],[1, -2]]) b = np.matrix([[8],[-10]]) x = (A**-1)*b
Al ejecutar el código se puede comprobar que en la variable x
se ha almacenado la matriz [[-2], [4]]
que se corresponde con la solución del problema:
\begin{matrix} 2 x_1 + 3x_2 & = 8 \\ x_1 - 2 x_2 & = -10 \end{matrix}
Un sistema de n ecuaciones con n incógnitas se puede escribir de la siguiente forma:
\begin{matrix} a_{11} x_1 + a_{12} x_2 + \ldots + a_{1n} x_n &= b_1 \\ a_{21} x_1 + a_{22} x_2 + \ldots + a_{2n} x_n &= b_2 \\ \ldots \\ a_{n1} x_1 + a_{n2} x_2 + \ldots + a_{nn} x_n &= b_n \end{matrix}
El sistema también se puede escribir en forma matricial de la forma:
\begin{bmatrix} a_{11} & a_{12} & \ldots & a_{1n} \\ a_{21} & a_{22} & \ldots & a_{2n} \\ \ldots & \ldots & \ldots & \ldots \\ a_{n1} & a_{n2} & \ldots & a_{nn} \end{bmatrix} \begin{bmatrix} x_1 \\ x_2 \\ \ldots \\ x_n \end{bmatrix} = \begin{bmatrix} b_1 \\ b_2 \\ \ldots \\ b_n \end{bmatrix}
Lo que se puede reescribir de forma compacta utilizando \boldsymbol{A}\boldsymbol{x} = \boldsymbol{b} donde \boldsymbol{A} es una matriz de dimensión n \times n y \boldsymbol{x} y \boldsymbol{b} son dos vectores columna de longitud n. En esta ecuación se ha para despejar el valor de \boldsymbol{x}. Para ello, asumiendo que la matriz \boldsymbol{A} es regular se puede multiplicar la expresión por la inversa de \boldsymbol{A}, \boldsymbol{A^{-1}}
\boldsymbol{A^{-1}} \boldsymbol{A} \boldsymbol{x} = \boldsymbol{A^{-1}} \boldsymbol{b}
En este caso \boldsymbol{A^{-1}} \boldsymbol{A}A es la matriz identidad y, por lo tanto, se puede escribir la solución del sistema como:
\boldsymbol{x} = \boldsymbol{A^{-1}} \boldsymbol{b}
Esta operación es lo que se ha escrito anteriormente en el código Python. La matriz inversa de A
se puede obtener mediante A**-1
y al multiplicar esta matriz por b
se obtiene el resultado buscado.
Determinar si el sistema se puede resolver
Para poder implementar este método se ha de verificar que la matriz A sea invertible. En caso de que no sea así al intentar invertirá Python generar un error. Cuando se trabaja de forma interactiva con Python esto no es problema mayor, pero si cuando el procedimiento se implementa en un programa. Para asegurar que se puede resolver el problema simplemente se ha de verificar que el determinante de la matriz se distinto de cero, mediante la utilización del método det()
.
if np.linalg.det(A) == 0: x = None print("No se puede resolver") else: x = (A**-1)*b
Este trozo de código devuelve la solución cuando es posible y None
en caso contrario.
Conclusiones
En esta entrada se ha visto cómo resolver un sistema de ecuaciones con numpy de forma rápida. Esta es una tarea que puede ser bastante habitual y con este truco se puede aumentar la productividad a la hora de realizar cálculos numéricos.
Imágenes: Unsplash (Antoine Dautry)