Estou ciente de que inverter uma matriz para resolver um sistema linear não é uma boa ideia, pois não é tão preciso e eficiente como solucionar diretamente o sistema ou usar a decomposição LU, Cholesky ou QR.
No entanto, não pude verificar isso com um exemplo prático. Eu tentei este código (em 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))
e os resíduos são sempre da mesma ordem (10 ^ -13).
Alguém poderia fornecer um exemplo prático em que inv (A) * b é muito menos impreciso que A \ b?
------ Atualização da pergunta ------
Obrigado por suas respostas. No entanto, suponha que tenhamos que resolver vezes um sistema , onde é sempre a mesma matriz. Considere isso
- está cheio, e, assim, requer o mesmo armazenamento de memória do que .
-O número da condição de é pequeno, portanto pode ser calculado com precisão.
Nesse caso, não seria mais eficiente calcular do que usar uma decomposição de LU? Por exemplo, eu tentei este código do 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))
Para uma matriz com o número de condição em torno de 450, os resíduos são nos dois casos, mas são necessários 19 segundos para resolver o sistema n vezes usando a decomposição da LU, enquanto que o inverso de A leva apenas 9 segundos.
Ax=b
com o mesmoA
e for pequeno o suficiente para suportar o inverso, poderá salvar a fatoração da LU e reutilizá-la.Respostas:
Normalmente, existem algumas razões principais para preferir resolver um sistema linear em relação ao uso do inverso. Resumidamente:
De qualquer forma, como o @ChristianClason observou nos comentários, pode haver alguns casos em que o uso do inverso é uma boa opção.
Na nota / artigo de Alex Druinsky, Sivan Toledo, Quão preciso é inv (A) * b? Há alguma consideração sobre esse problema.
De acordo com o artigo, a principal razão para a preferência geral usar resolver o sistema linear está dentro dessas duas estimativas ( é a solução verdadeira): inversox
Agora, a estimativa para o inverso pode ser melhorada, sob alguma condição sobre o inverso, veja o teorema 1 no artigo, mas pode ser condicionalmente preciso e não ser estável para trás.xV
O artigo mostra os casos em que isso acontece ( é o inverso)V
Portanto, a oportunidade de usar ou não o inverso depende do aplicativo, você pode verificar o artigo e ver se o seu caso satisfaz a condição de obter a estabilidade para trás ou se não precisa.
Em geral, na minha opinião, é mais seguro resolver o sistema linear.
fonte
SpecialMatrices.jl
No entanto, digamos que queremos inverter a matriz.
\
IterativeSolvers.jl
Como outros já mencionaram, o número da condição e o erro numérico é outra razão, mas o fato de a inversa de uma matriz esparsa ser densa dá uma ideia muito clara "essa é uma má idéia".
fonte