Doğrusal bir sistemi çözmek için bir matrisi ters çevirmenin iyi bir fikir olmadığının farkındayım, çünkü sistemi doğrudan çözmek veya LU, Cholesky veya QR ayrışımı kullanmak kadar doğru ve verimli değildir.
Ancak, bunu pratik bir örnekle kontrol edemedim. Bu kodu denedim (MATLAB'da)
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))
ve artıklar her zaman aynı sıradadır (10 ^ -13).
Birisi inv (A) * b'nin A \ b'den çok daha az yanlış olduğu pratik bir örnek verebilir mi?
------ Soru güncelleme ------
Cevaplarınız için teşekkür ederim. Bununla birlikte, bir sistem A x = b'yi kez çözmemiz gerektiğini varsayalım , burada A her zaman aynı matristir. Bunu bir düşün
- dolu ve böylece bir - 1 ile aynı bellek depolama gerektiren A .
Alınmış durum sayısı , dolayısıyla küçük bir - 1 doğrulukla hesaplanabilir.
Bu durumda, A - 1 hesaplamak daha verimli olmaz mıydı? LU ayrışımı kullanmak yerine ? Örneğin, bu Matlab kodunu denedim:
%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))
450 ile ilgili durumu numarası ile bir matris için, artıklar olan her iki durumda da, ancak, sadece 9 saniye sürer A tersinin kullanılması ise, sistem çözme n kere LU parçalama kullanılarak 19 saniye sürer.
Ax=b
Aynı şeyi tekrar tekrar çözmeniz A
gerekiyorsa ve tersini alacak kadar küçükse, bunun yerine LU çarpanlara ayırmayı kaydedebilir ve yeniden kullanabilirsiniz.