Мені відомо про те, що інвертування матриці для вирішення лінійної системи не є хорошою ідеєю, оскільки вона не настільки точна і настільки ефективна, як безпосередньо розв’язання системи або з використанням розкладання LU, Cholesky або QR.
Однак я не зміг перевірити це на практичному прикладі. Я спробував цей код (у 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))
і залишки завжди в одному порядку (10 ^ -13).
Чи може хтось надати практичний приклад, у якому inv (A) * b набагато менш неточний, ніж A \ b?
------ Оновлення питань ------
Дякую за відповіді. Однак припустимо, що ми повинні розв’язати разів систему A x = b , де A завжди однакова матриця. Вважайте це
- повно, і , таким чином - 1 вимагає того ж зберігання пам'яті , ніж A .
- Кількість умов невелике, отже, A - 1 можна обчислити з точністю.
У цьому випадку, чи не було б більш ефективним обчислити а не використовувати розклад LU? Наприклад, я спробував цей код 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))
Для матриці з числом умов близько 450 залишковими є в обох випадках, але для розв’язання системи n разів за допомогою розкладання LU потрібно 19 секунд, тоді як для використання зворотного A це займає лише 9 секунд.
Ax=b
одне A
і те ж, і це досить мало, щоб зробити зворотну, ви можете замість цього зберегти LU-коефіцієнт і використовувати його повторно.