선형 시스템을 해결하기 위해 행렬을 뒤집는 것은 시스템을 직접 해결하거나 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 는 항상 같은 행렬입니다. 그것을 고려하십시오
- 전체이고, 따라서 A는 - 1 보다 동일한 메모리 저장 요구 를 .
조건 수가 적 으므로 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에 대한 조건 수와 행렬, 잔차는 모두의 경우가 있지만, 그것만 9초 소요의 역수를 사용하는 반면, 시스템을 해결 N 배는 LU 분해를 사용하여 19 초가 걸린다.
Ax=b
동일한 방법 으로 반복해서 풀어야 A
하고 역수를 취하기에 충분히 작은 경우 LU 인수 분해를 저장하고 재사용 할 수 있습니다.