Używam rozkładu Cholesky'ego dla Ax=b, aby znaleźć x, wykonując L*LT=A, a następnie y=L*b i na końcu x=LT*b. Kiedy sprawdzam, czy nie. Wydaje się, że daje takie same wyniki, jak wykonanie klasycznej Ax=b. Oto mój kod:

import numpy as np
import scipy.linalg as sla

myL=np.linalg.cholesky(A)


#check_x = np.dot(A, b)
#check_x = np.dot(A,b)
check_x = sla.solve(A, b)

#check if the composition was done right
myLT=myL.T.conj() #transpose matrix
Ac=np.dot(myL,myLT) #should give the original matrix A



#y=np.dot(myL,b)
y = sla.solve_triangular(myL, b)

#x=np.dot(myL.T.conj(),y)
x = sla.solve_triangular(myLT, b)
2
KevinWendellCrumb 16 grudzień 2019, 04:21
1
Spójrz na ten opis w Wikipedii. W szczególności, „rozwiązywanie L y = b dla y przez podstawienie w przód, a na koniec rozwiązywanie L ∗ x = y dla x przez podstawienie wsteczne”. Twój kod po prostu się mnoży, a nie rozwiązuje.
 – 
Warren Weckesser
16 grudzień 2019, 04:28
Masz rację , zmieniłem to ale nadal otrzymuję złe wyniki , edytuję swój kod wraz z aktualizacją
 – 
KevinWendellCrumb
16 grudzień 2019, 04:58
Być może problem polega na podstawieniu w przód i w tył , że pierwsza jest używana dla Ly=b, a druga dla Lx=y.
 – 
KevinWendellCrumb
16 grudzień 2019, 05:11

1 odpowiedź

Najlepsza odpowiedź

Byłem bezsenny i zmęczony, pomyliłem ostatnią linijkę, tak naprawdę jest

x=np.linalg.solve(myLT, y)
1
KevinWendellCrumb 16 grudzień 2019, 06:36