¿Hay disponible una implementación de Python del algoritmo de descomposición LDL (‘ldl’ en Matlab)?

Parece que no hay una función de descomposición de LDL en numpy, pero hay una implementación de la descomposición de Cholesky estrechamente relacionada. [1] [2]

Te dejaré leer sobre eso tú mismo, pero aquí hay una función que implementa la descomposición de LDL:

En [1]: def ldl_decomp (A):
…: importar numpy como np
…: A = matriz de np (A)
…: Si no (AH == A) .todos ():
…: print (“¡A debe ser Hermitiano!”)
…: Devuelve Ninguno, Ninguno
…: si no:
…: S = np.diag (np.diag (A))
…: Sinv = np.diag (1 / np.diag (A))
…: D = matriz np (S.dot (S))
…: Lch = np.linalg.cholesky (A)
…: L = np.matrix (Lch.dot (Sinv))
…: Devuelve L, D

En [2]: importar numpy como np

En [3]: A = matriz np. ([[4,12, -16], [12,37, -43], [- 16, -43,98]])

En [4]: ​​L, D = ldl_decomp (A)

En [5]: L
Fuera [5]:
matriz ([[0.5, 0., 0.],
[1.5, 0.02702703, 0.],
[-2. , 0.13513514, 0.03061224]])

En [6]: D
Fuera [6]:
matriz ([[16, 0, 0],
[0, 1369, 0],
[0, 0, 9604]])

En [7]: L.dot (D) .dot (LH)
Fuera [7]:
matriz ([[4., 12., -16.],
[12., 37., -43.],
[-16., -43., 98.]])

Notas:

  • La línea 4 verifica que la matriz A sea hermitiana. Si solo está trabajando con números reales, esto verifica si A es simétrico.
  • La línea 8 crea una matriz diagonal S cuyas entradas son la diagonal de A.
  • La línea 9 calcula el inverso de S (que es trivial ya que S es diagonal).
  • La línea 10 calcula la “D” en la composición de LDL.
  • La línea 11 calcula Lch, la matriz triangular inferior en la descomposición de Cholesky. Tenga en cuenta que A = (Lch) (Lch) *, donde * es el conjugado hermitiano (transposición del conjugado).
  • La línea 12 calcula la “L” en la descomposición de LDL.
  • La función devuelve las matrices L y D de modo que A = LDL *.

Notas al pie

[1] Descomposición de Cholesky – Wikipedia

[2] numpy.linalg.cholesky – NumPy v1.12 Manual