Zdaję sobie sprawę z tego, że odwrócenie matrycy w celu rozwiązania układu liniowego nie jest dobrym pomysłem, ponieważ nie jest tak dokładne i tak wydajne, jak bezpośrednie rozwiązywanie układu lub użycie rozkładu LU, Cholesky'ego lub QR.
Nie byłem jednak w stanie tego sprawdzić na praktycznym przykładzie. Próbowałem tego kodu (w MATLAB)
M = 500;
A = rand(M,M);
A = real(expm(1i*(A+A.')));
b = rand(M,1);
x1 = A\b;
x2 = inv(A)*b;
disp(norm(b-A*x1))
disp(norm(b-A*x2))
a reszty są zawsze tego samego rzędu (10 ^ -13).
Czy ktoś mógłby podać praktyczny przykład, w którym inv (A) * b jest znacznie mniej niedokładne niż A \ b?
------ Aktualizacja pytania ------
Dziękuję Ci za Twoje odpowiedzi. Załóżmy jednak, że musimy rozwiązać razy układ , gdzie jest zawsze tą samą macierzą. Rozważ to
- jest pełna, a tym samym wymaga tej samej pamięci w pamięci niż .
-Numer warunku jest niewielki, dlatego można obliczyć z dokładnością.
Czy w takim przypadku obliczenie nie byłoby bardziej efektywne niż zastosowanie dekompozycji LU? Na przykład wypróbowałem ten kod Matlab:
%Set A and b:
M = 1000;
A = rand(M,M);
A = real(expm(1i*(A+A.')));
b = rand(M,1);
%Times we solve the system:
n = 3000;
%Performing LU decomposition:
disp('Performing LU decomposition')
tic
[L,U,P] = lu(A);
toc
fprintf('\n')
%Solving the system n times with LU decomposition:
optsL.LT = true; %Options for linsolve
optsU.UT = true;
disp('Solving the system n times using LU decomposition')
tic
for ii=1:n
x1 = linsolve(U, linsolve(L,P*b,optsL) , optsU);
end
toc
fprintf('\n')
%Computing inverse of A:
disp('Computing inverse of A')
tic
Ainv = inv(A);
toc
fprintf('\n')
%Solving the system n times with Ainv:
disp('Solving the system n times with A inv')
tic
for ii=1:n
x2 = Ainv*b;
end
toc
fprintf('\n')
disp('Residuals')
disp(norm(b-A*x1))
disp(norm(b-A*x2))
disp('Condition number of A')
disp(cond(A))
Dla macierzy o liczbie warunków około 450 resztami są w obu przypadkach, ale rozwiązanie układu n razy przy użyciu rozkładu LU zajmuje 19 sekund, natomiast użycie odwrotności A zajmuje tylko 9 sekund.
Ax=b
z tym samym A
i jest wystarczająco mały, aby wziąć odwrotność, możesz zamiast tego zapisać faktoryzację LU i użyć tego ponownie.