Tôi biết rằng việc đảo ngược một ma trận để giải quyết một hệ thống tuyến tính không phải là một ý tưởng tốt, vì nó không chính xác và hiệu quả như giải quyết trực tiếp hệ thống hoặc sử dụng phân tách LU, Cholesky hoặc QR.
Tuy nhiên, tôi đã không thể kiểm tra điều này với một ví dụ thực tế. Tôi đã thử mã này (trong 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))
và phần dư luôn theo cùng một thứ tự (10 ^ -13).
Ai đó có thể cung cấp một ví dụ thực tế trong đó inv (A) * b ít chính xác hơn A \ b không?
------ Cập nhật câu hỏi ------
Cảm ơn bạn cho câu trả lời của bạn. Tuy nhiên, giả sử rằng chúng ta phải giải lần một hệ thống A x = b , trong đó A luôn là cùng một ma trận. Xem xét điều đó
- là đầy đủ, và do đó A - 1 đòi hỏi bộ nhớ lưu trữ cùng hơn Một .
-Số điều kiện của nhỏ, do đó A - 1 có thể được tính toán với độ chính xác.
Trong trường hợp đó, sẽ không hiệu quả hơn khi tính thay vì sử dụng phân tách LU? Ví dụ: tôi đã thử mã Matlab này:
%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))
Đối với một ma trận có số điều kiện khoảng 450, phần dư là trong cả hai trường hợp, nhưng phải mất 19 giây để giải hệ thống n lần bằng cách sử dụng phân tách LU, trong khi sử dụng nghịch đảo A chỉ mất 9 giây.
Ax=b
tương tự A
và nó đủ nhỏ để thực hiện nghịch đảo, thay vào đó bạn có thể lưu hệ số LU và sử dụng lại điều đó.