Soy consciente de que invertir una matriz para resolver un sistema lineal no es una buena idea, ya que no es tan preciso y eficiente como resolver directamente el sistema o usar la descomposición LU, Cholesky o QR.
Sin embargo, no he podido comprobar esto con un ejemplo práctico. He intentado este código (en 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))
y los residuos son siempre del mismo orden (10 ^ -13).
¿Podría alguien proporcionar un ejemplo práctico en el que inv (A) * b sea mucho menos impreciso que A \ b?
------ Actualización de la pregunta ------
Gracias por sus respuestas. Sin embargo, supongamos que tenemos que resolver veces un sistema A x = b , donde A es siempre la misma matriz. Considere eso
- es completa, y por lo tanto A - 1 requiere el mismo almacenamiento de memoria de A .
-El número de condición de es pequeño, por lo tanto, A - 1 se puede calcular con precisión.
En ese caso, ¿no sería más eficiente calcular lugar de usar una descomposición LU? Por ejemplo, he probado este código de 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 una matriz con la condición número de 450, los residuos son en ambos casos, pero se necesita 19 segundos para resolver el sistema de n veces usando la descomposición LU, mientras que usando la inversa de A sólo toma 9 segundos.
Ax=b
con lo mismoA
y es lo suficientemente pequeño como para tomar el inverso, puede guardar la factorización LU y reutilizarla.Respuestas:
Normalmente hay algunas razones principales para preferir resolver un sistema lineal con respecto al uso del inverso. Brevemente:
De todos modos, como comentó @ChristianClason en los comentarios, puede haber algunos casos en los que el uso del inverso sea una buena opción.
En la nota / artículo de Alex Druinsky, Sivan Toledo, ¿Qué precisión tiene inv (A) * b? Hay alguna consideración sobre este problema.
Entonces, la oportunidad de usar o no el inverso depende de la aplicación, puede consultar el artículo y ver si su caso cumple la condición para obtener la estabilidad hacia atrás o si no la necesita.
En general, en mi opinión, es más seguro resolver el sistema lineal.
fuente
SpecialMatrices.jl
Sin embargo, digamos que queremos invertir la matriz.
\
IterativeSolvers.jl
Como otros han mencionado, el número de condición y el error numérico es otra razón, pero el hecho de que el inverso de una matriz dispersa sea denso da una clara "esta es una mala idea".
fuente