Inversa en Python

Inversa en Python

de Karolina Soca Rosas -
Número de respuestas: 6

Buenas, dada la matriz D, y el producto de D^T D estoy intentando aplicarle la inversa al producto con la función: np.linalg.inv() y realmente no hay manera de que no me de que la matriz no es invertible. Tengo definido D como:

D =\begin{pmatrix} A& 0 & 0 \\  0& B & 0 \\  0 & 0 & C\end{pmatrix}


D^T =\begin{pmatrix} A^T& 0 & 0 \\  0& B^T & 0 \\  0 & 0 & C^T\end{pmatrix}

donde los ceros son matrices nulas de dimensión (10x10) que es la dimensión que tienen A, B, C en el problema. Probé haciendo el producto de las matrices D y D^T, con la función np.dot() y con np.matmul(), que me dan cosas diferentes, no entiendo bien porqué, pero en ninguno de los dos casos tampoco fue fructífero el paso siguiente de hacer la inversa.

Si a la matriz D, le aplico la función D.transpose(), me da algo que parece muy incoherente, igual intenté hacer el producto de D por su traspuesta (con D traspuesta obtenida a partir de esta función) y tampoco fue feliz el resultado, directamente me da error en este caso el producto.

Me queda la duda de si estoy definiendo mal para el problema la matriz D, o si esa función no sirve para hacer inversa de un array de arrays, o es otra cosa que ni siquiera se me ocurrió.

Hace horas que intento distintas cosas pero nada tiene resultado, y la verdad que no poder hacer esto me tranca el resto.

Tengo exactamente el mismo problema con la H y H^T

Desde ya muchas gracias.

Saludos,

Karolina

En respuesta a Karolina Soca Rosas

Re: Inversa en Python

de Ignacio Ramirez -
Hola Karolina,
Para mí tenés algo mal al cargar A,B y C.
Definitivamente D es invertible. También lo son A,B y C. Lo acabo de verificar y todas esas matrices dan bien.
Más aún, D^T*D también es invertible (algo que es obvio si A, B y C son invertibles).
El número de condición de D^TD es bastante grande, pero igual es invertible.
Finalmente, tanto np.dot como np.matmul me dan exactamente lo mismo. Según la documentación, deberían dar lo mismo.
Podés pasar por acá el código donde cargas los datos y construis D?
En respuesta a Ignacio Ramirez

Re: Inversa en Python

de Karolina Soca Rosas -
Hola Ignacio, capaz es eso pero no me doy cuenta que estaría mal. Si claro cargo lo que tengo hecho:

A = np.loadtxt('A.txt')
B = np.loadtxt('B.txt')
C = np.loadtxt('C.txt')
A_T = np.loadtxt('A.txt').T
B_T = np.loadtxt('B.txt').T
C _T= np.loadtxt('C.txt').T


Z= np.zeros((10, 10))
# print(Z)

I = np.identity(10)
# print(I)

H = np.array([[I , Z , -I],
[Z , I , -I ],
[Z , Z , Z]])


H_T = np.array([[I , Z , -I],
[Z , I , -I ],
[Z , Z , Z]])

D = np.array([[A, Z, Z],
[Z, B, Z],
[Z, Z, C]])


D_T = np.array([[A_T, Z, Z],
[Z, B_T, Z],
[Z, Z, C_T]])

La multiplicación me la hace, pero la inversa no. 

Desde ya muchas gracias.

Saludos,

Karolina
En respuesta a Karolina Soca Rosas

Re: Inversa en Python

de Karolina Soca Rosas -
Ahora estoy intentando armar las matrices de esta otra forma:

Z= np.zeros((10, 10))
I = np.identity(10)
I_neg = I*(-1)
D= np.block([[A,Z,Z],[Z,B,Z],[Z,Z,C]])
# print('D',D)

D_T = D.T
# print('traspuesta de D',D_T)

D_TD = np.matmul(D_T, D)

inv_D_TD = np.linalg.inv(D_TD)

print('inversa D',inversa)

H = np.block([[I,Z,I_neg],[Z,I ,I_neg ]])
print('H',H)
H_T = H.T
print('H traspuesta', H_T)
HH_T = np.matmul(H, H_T)
print('HH_T',HH_T)
inv_HH_T = np.linalg.inv(HH_T)

print('inversa H',inversa)


En este caso si me deja hacer la inversa para D^TD y HH^T, es correcto definirlo de este modo?

Perdón por preguntar tanto, es que realmente no sabía más que hacer, pero si eso está bien capaz le encontré la vuelta.

Muchas gracias desde ya.

Saludos,

Karolina
En respuesta a Karolina Soca Rosas

Re: Inversa en Python

de Ignacio Ramirez -
Ya te respondí antes, pero ahora que veo esto: no no sé, nunca usé np.block. Yo sería menos fancy con esto y hacerlo como te dije antes. No importa que quede en duro el tamaño de la matriz, etc.
En todo caso, ojo con StackOverflow. Si acaso buscaste alguna de estas cosas ahí, tené cuidado porque suelen poner soluciones estrambóticas que sólo confunden.
En respuesta a Karolina Soca Rosas

Re: Inversa en Python

de Ignacio Ramirez -

OK, ya sé lo que te pasó.

Primer consejo: nunca repitas código de esa manera. Ya sabés que numpy hace la inversa con ".T". Entonces, no armes por separado D y D_T.

Es mejor hacer D_T = D.T

tampoco tiene mucho sentido almacenar las traspuestas: es gratis, no implica ningún cómputo extra. Y no facilita la lectura tampoco.

*Ahora* al problema: no podés armar matrices de numpy de esa manera. Lo que estás obteniendo son matrices 4-dimensionales, porque son arrays bidimensionales de arrays bidimensionales! La forma fácil y correcta de hacero sería algo así:

D = np.zeros((30,30))

D[:10,:10 ] = A

D[10:20,10:20] = B

D[20:30,20:30] = C

Lo mismo con H y w