行列を反転して線形システムを解くことは、システムを直接解くか、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の行列の場合、残差はどちらの場合もですが、LU分解を使用してシステムをn回解くには19秒かかりますが、Aの逆を使用すると9秒。
Ax=b
同じもので繰り返し解く必要がありA
、逆を行うのに十分小さい場合は、代わりにLU分解を保存して再利用できます。