ฉันทราบเกี่ยวกับการแปลงเมทริกซ์เพื่อแก้ปัญหาระบบเชิงเส้นไม่ใช่ความคิดที่ดีเนื่องจากมันไม่ถูกต้องและมีประสิทธิภาพเท่ากับการแก้ไขระบบโดยตรงหรือใช้การสลาย 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 - 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 ส่วนที่เหลือคือในทั้งสองกรณี แต่ใช้เวลา 19 วินาทีสำหรับการแก้ปัญหาระบบ n ครั้งโดยใช้การสลายตัวของ LU ในขณะที่การใช้อินเวอร์สของ A จะใช้เวลาเพียง 9 วินาที
Ax=b
กันA
และมีขนาดเล็กพอที่จะใช้อินเวอร์สคุณสามารถบันทึก LU-factorization และนำกลับมาใช้ใหม่ได้