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 mismo A
y es lo suficientemente pequeño como para tomar el inverso, puede guardar la factorización LU y reutilizarla.