Мне известно о том, что инвертировать матрицу для решения линейной системы не очень хорошая идея, поскольку она не так точна и эффективна, как непосредственное решение системы или использование разложения 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?
------ Обновление вопроса ------
Спасибо за ваши ответы. Однако предположим, что мы должны решить раз систему , где всегда одна и та же матрица. Считают, что
- полно, и , таким образом требует такого же память для хранения , чем .
-Кондиционное число мало, поэтому может быть вычислено с точностью.
В таком случае, не будет ли эффективнее вычислить , чем использовать разложение 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-факторизацию и использовать ее повторно.Ответы:
Обычно есть несколько основных причин, чтобы предпочесть решить линейную систему относительно использования обратного. Кратко:
В любом случае, как заметил @ChristianClason в комментариях, в некоторых случаях использование обратного является хорошим вариантом.
В заметке / статье Алекса Друинского, Сиван Толедо, Насколько точен inv (A) * b? Есть некоторые соображения по поводу этой проблемы.
Таким образом, возможность использовать или не использовать обратное зависит от приложения. Можете ли вы проверить статью и посмотреть, удовлетворяет ли ваш случай условию получения обратной стабильности или вам она не нужна.
В общем, на мой взгляд, безопаснее решить линейную систему.
источник
SpecialMatrices.jl
Однако, допустим, мы хотим инвертировать матрицу.
\
IterativeSolvers.jl
Как уже упоминали другие, условное число и числовая ошибка - это еще одна причина, но тот факт, что инверсия разреженной матрицы плотная, дает очень четкое «это плохая идея».
источник