Python - Získání špatné řešení pro Choleského rozklad?

0

Otázka

Snažím se přeložit některé pseudokódu z matlabu do skript v pythonu, ale mám nějaké potíže s dostat správnou odpověď? Může mi někdo pomoci identifikovat, kde jsem to pokazil překlad?

Pseudokód jsem dal v jednom pro Choleského rozklad uveden v Trefethan & Bau kniha je

enter image description here

To se provádí pro horní trojúhelníkové matice, pokud chápu popis správně, ale myslím, že tohle by mělo fungovat pro obecné matice taky, ne?

Každopádně, jsem napsal následující kód v pythonu:

def is_SPD(A):
    if np.all(A == A.T):
        if np.all(la.eigvals(A) > 0):
            return True
    return False

def cholesky_decomp(A):
    #first check if matrix is symmetric and positive definite
    if is_SPD(A) == True:
        R = np.copy(A)
        for k in range (0, len(A)):
            for j in range (k+1, len(A)):
                R[j,j:] = R[j,j:] - (R[k,j:]*(R[k,j]/R[k,k]))
            R[k,k:] = R[k,k:]/sqrt(R[k,k])
        return R
    else:
        return print('Cholesky decomposition not applicable')

Pracuji na 4x4 matrix, a já jsem udělal rozklad do np.linalg metoda, a mé odpovědi jsou zcela odlišné.

Myslím, že to může? kvůli mé neznalosti MATLAB a můj nedostatek kódování dovednosti obecně, ale nedostal jsem žádnou správné odpovědi na všechny a nemůžu přijít na to, kde jsem jít špatně.

Přidávám vzorek matrice tady, že jsem pomocí, a že to shoulddd být použitelný, a měl by dát správné Choleského rozklad, ale já jsem stále zcela nesprávnou odpověď.

Mohl by mi někdo, prosím, použijte to, aby mi pomohl přijít na to, kde jsem jít špatně?

A = np.array([[16, -12, -12, -16], [-12, 25, 1, -4], [-12, 1, 17, 14], [-16, -4, 14, 57]])

můj kód mi dal:

[[  4  -3  -3  -4]
 [-12   4  -2  -4]
 [-12   1   2  -3]
 [-16  -4  14   4]]

zatímco numpy Choleskyho funkce mi dal:

[[ 4.  0.  0.  0.]
 [-3.  4.  0.  0.]
 [-3. -2.  2.  0.]
 [-4. -4. -3.  4.]]
linear-algebra math matrix python
2021-11-23 19:21:11
1

Nejlepší odpověď

2

Váš kód správně implementuje uvedený algoritmus, ale všimněte si, že text říká (přidáno zdůraznění):

Vstupní matice A představuje superdiagonal polovina z m×m Hermitian pozitivně definitní matice, které mají být zapracovány.

Takže budete muset nahradit vstupní A,

[[ 16 -12 -12 -16]
 [-12  25   1  -4]
 [-12   1  17  14]
 [-16  -4  14  57]]

o np.triu(A):

[[ 16 -12 -12 -16]
 [  0  25   1  -4]
 [  0   0  17  14]
 [  0   0   0  57]]

Kromě toho (notace mírně změnila, kde ' znamená Hermitian provedení),

Výstupní matice R představuje horní-trojúhelníkové faktor, pro který A = R' R

Tak se dostanete horní-trojúhelníkové R, vzhledem k tomu, Numpy je cholesky funkce dává dolní trojúhelníková výsledek. Každý z těchto výsledků je jen Hermitian-provedena verzi druhé (viz zde).

2021-11-24 16:48:18

OHHH ano, tak se nenechte oba pracují pro stejnou matrix!! Také pěkné, nevěděl jsem, že tam byla funkce, jako np.triu, tak to je určitě zajímavé se dozvědět. Ale je to opravdu užitečné, děkuji!!!!
Applesauce44

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................