A partir del código elaborado en el artículo anterior, y con una
modificación mínima, el ejercicio que se muestra en esta entrada permite
obtener, buscando pivotes igual a 1 siempre que es factible, la inversa
de una matriz usando el método de Gauss. Permite definir los datos de la
matriz de forma manual o generarlos de forma aleatoria a partir de la
dimensión de la matriz y los números entre los que crea esa matriz
aleatoria. Se usa sympy y LaTeX/LyX con el paquete pythontex. Al final
del artículo hay enlaces para descargar el fichero fuente así como el
pdf que se obtendría con una de las matrices aleatorias de orden 3 que
ha creado el propio programa.
En la web, así como con diferentes librerías de python, se puede
obtener de forma directa la inversa de una matriz, de hecho así se
obtiene la solución final y permite comprobar que el proceso seguido es
correcto. De nuevo, para realizar el programa que permite su cálculo he
partido de dos premisas:
Intentar buscar siempre que es posible pivotes 1 (mediante una
función que implementa el Algoritmo de Euclides extendido)
Trabajar con fracciones lo mínimo posible.
El código python es muy parecido al que se usa para la resolución de
sistemas usando el método de Gauss, se ha realizado una modificación
mínima eliminando lo que no se necesita y se ha añadido
def trianSup():
for j in range(dim-1,-1,-1):
#hago uno en ese elemento de la diagonal de la matriz M[-1]
if M[-1][j,j]!=1:
C=Matrix(dim, dim, lambda f,c: 1 if ((f==c) and (f!=j)) else (1/M[-1][j,j] if ((f==c) and (f==j)) else 0))
T.append(C)
M.append(T[-1]*M[-1])
#Hago ceros en los elementos de la columna j (salvo en el primer elemento)
if j!=0:
C=I+Matrix(dim, dim, lambda f,c: -M[-1][f,c] if ((f<c) and (c==j)) else 0)
T.append(C)
M.append(T[-1]*M[-1])
para conseguir la matriz triangular inferior a partir de la matriz
triangular superior que calcula el programa anterior.
En el fichero LyX podemos modificar qué queremos que se haga en el problema:
m
datos <<a mano>>, en ese caso se deben establecer los valores de
la matriz cuadrada con los que trabajar en el fichero.
Con matrices aleatorias
det1
→ se obtiene una matriz aleatoria de
determinante 1
detc
→ se obtiene una matriz aleatoria de
determinante un número distinto de 0
Las opciones anteriores se consiguen modificando la variable:
#Tipo de matriz para hallar la inversa
tipo="detc"
El programa está preparado para hallar la inversa de una matriz cuadrada
de cualquier orden, aunque si se opta por matrices de orden elevado y
con determinante igual a 1 puede ser muy lento o incluso no terminar su
ejecución. Para establecer los valores con los que trabajar, si se opta
por matrices aleatorias, se pueden modificar las variables:
#orden de la matriz para los tipos aleatorios
dim=4
#valores entre los que obtener los números de las matrices aleatorias
v1=-5
v2=5
En el caso de optar por introducir las matrices <<a mano>> debemos
modificarlas en:
if tipo=="m":
#Datos del sistema
# matriz de coeficientes
A=Matrix([[1,2,-1],[2,0,2],[-1,1,1]])
if A.det()==0:
sys.exit("La matriz no tiene inversa ya que su determinante es igual a 0")
dim=A.rank()
cambiando los datos de la matriz cuadrada a la que calcular la inversa.
Al compilar el fichero con la opción de una matriz aleatoria de orden 3
y determinante cualquiera, se ha obtenido un ejercicio como el que sigue:
Calcula por el método de Gauss la inversa de la
matriz: A=−3−432−11−1−20