Saltar al contenido

División de matriz izquierda y solución numérica

Si encuentras algún detalle que no entiendes puedes dejarlo en los comentarios y haremos todo lo necesario de ayudarte rápidamente.

Solución:

De la documentación de MathWorks para la división de matriz izquierda:

Si A es una matriz de m por n con m ~= n y B es un vector columna con m componentes, o una matriz con varias de tales columnas, entonces X = AB es la solución en el sentido de los mínimos cuadrados de la siguiente – o sistema de ecuaciones sobredeterminado AX = B. En otras palabras, X minimiza la norma (A*X – B), la longitud del vector AX – B.

El equivalente en numpy es np.linalg.lstsq:

In [15]: B = np.array([[2],[4]])

In [16]: b = np.array([[4],[4]])

In [18]: x,resid,rank,s = np.linalg.lstsq(B,b)

In [19]: x
Out[19]: array([[ 1.2]])

Matlab en realidad hará una serie de operaciones diferentes cuando se usa el operador , dependiendo de la forma de las matrices involucradas (ver aquí para más detalles). En su ejemplo, Matlab está devolviendo una solución de mínimos cuadrados, en lugar de resolver la ecuación lineal directamente, como sucedería con una matriz cuadrada. Para obtener el mismo comportamiento en numpy, haz esto:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])
print np.linalg.lstsq(B,b)[0]

que debería darle la misma solución que Matlab.

Puedes formar el inverso izquierdo:

import numpy as np
import numpy.linalg as lin
B = np.array([[2],[4]])
b = np.array([[4],[4]])

B_linv = lin.solve(B.T.dot(B), B.T)
c = B_linv.dot(b)
print('cn', c)

Resultado:

c
 [[ 1.2]]

En realidad, podemos simplemente ejecutar el solucionador una vez, sin formar un inverso, como este:

c = lin.solve(B.T.dot(B), B.T.dot(b))
print('cn', c)

Resultado:

c
 [[ 1.2]]

…. como antes

¿Por qué? Porque:

Tenemos:

ingrese la descripción de la imagen aquí

Multiplicar por B.TNos da:

ingrese la descripción de la imagen aquí

Ahora, B.T.dot(B) es cuadrado, rango completo, tiene un inverso. Y por lo tanto podemos multiplicar por el inverso de B.T.dot(B)o use un solucionador, como el anterior, para obtener c.

Comentarios y valoraciones del tutorial

Más adelante puedes encontrar los comentarios de otros sys admins, tú asimismo puedes insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *