ตัวอย่างที่ใช้ได้จริงว่าทำไมมันไม่ดีที่จะกลับเมทริกซ์


16

ฉันทราบเกี่ยวกับการแปลงเมทริกซ์เพื่อแก้ปัญหาระบบเชิงเส้นไม่ใช่ความคิดที่ดีเนื่องจากมันไม่ถูกต้องและมีประสิทธิภาพเท่ากับการแก้ไขระบบโดยตรงหรือใช้การสลาย 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 หรือไม่

------ อัปเดตคำถาม ------

ขอบคุณสำหรับคำตอบ อย่างไรก็ตามสมมติว่าเราต้องแก้คูณnระบบAx=bโดยที่Aมักเป็นเมทริกซ์เดียวกันเสมอ พิจารณาว่า

- Aเต็มและA1ต้องการหน่วยความจำเดียวกันกับA

- หมายเลขเงื่อนไขของเล็กดังนั้นA - 1AA1สามารถคำนวณได้อย่างแม่นยำ

ในกรณีนี้การคำนวณจะมีประสิทธิภาพมากกว่าการใช้การแยกย่อย LU หรือไม่ ตัวอย่างเช่นฉันได้ลองใช้รหัส Matlab นี้แล้ว:A1

%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 วินาทีO(1011)


8
หน้าวิธีใช้ MATLAB สำหรับการขอร้องเป็นตัวอย่างที่ดี ดูภายใต้หัวข้อการแก้ระบบเชิงเส้น
GoHokies

1
btw, จำนวนเงื่อนไขของเมทริกซ์ของคุณคืออะไร? ฉันไม่มี MATLAB บนพีซีของฉันในที่ทำงานดังนั้นฉันจึงไม่สามารถตรวจสอบได้ แต่ฉันคิดว่ามันเล็กพอที่คุณจะได้ค่าผกผันที่แม่นยำ ...A
GoHokies

2
ฉันได้ดูที่ Trefethen และ Bau ​​(แบบฝึกหัด 21.4) และพวกเขาอธิบายอย่างหมดจดว่ามันเป็นค่าใช้จ่ายในการคำนวณ flops เทียบกับ22n3flops ดังนั้นแม้ว่าคุณจะพบว่ามีสารตกค้างเหมือนกัน (คุณลองตรวจสอบเมทริกซ์ที่มีเงื่อนไขต่ำกว่าอย่างที่เป็นในความคิดเห็นของ GoHokies หรือไม่) ค่าใช้จ่ายในการคำนวณที่ไม่จำเป็นเพียงอย่างเดียวอาจคุ้มค่ากับคำแนะนำ 23n3
คิริลล์

3
ขนาดเมทริกซ์ของคุณเล็กเกินไปและมีข้อ จำกัด ในการเปรียบเทียบนี้ ไม่ใช่ว่าไม่มีปัญหาที่เกี่ยวข้องที่คุณมีเมทริกซ์ดังกล่าว แต่ความเห็นที่ได้รับว่าคุณไม่ควรกลับด้านมีความหมายสำหรับการตั้งค่าที่แตกต่าง (เช่นที่ Chris Rackauckas พูดถึงในคำตอบของเขา) ในความเป็นจริงสำหรับเมทริกซ์ขนาดเล็กและ - ที่รับรองได้ดีการคำนวณอินเวอร์สอาจเป็นตัวเลือกที่ดีกว่า กรณีที่รุนแรงที่สุดคือการหมุนแบบ 3x3 (หรือการแปลงเลียนแบบสมจริง)
Christian Clason

1
หากคุณต้องการแก้ปัญหาซ้ำ ๆAx=bกันAและมีขนาดเล็กพอที่จะใช้อินเวอร์สคุณสามารถบันทึก LU-factorization และนำกลับมาใช้ใหม่ได้
Chris Rackauckas

คำตอบ:


11

โดยทั่วไปมีเหตุผลบางอย่างที่ต้องการแก้ปัญหาระบบเชิงเส้นให้ใช้อินเวอร์ส สั้น ๆ :

  • ปัญหากับหมายเลขตามเงื่อนไข (ความเห็น @GoHokies)
  • ปัญหาในกรณีกระจัดกระจาย (@ChrisRackauckas ตอบ)
  • ประสิทธิภาพ (ความคิดเห็น @Kirill)

อย่างไรก็ตามตามที่ @ChristianClason ตั้งข้อสังเกตในความคิดเห็นอาจมีบางกรณีที่การใช้อินเวอร์สเป็นตัวเลือกที่ดี

ในบันทึกย่อ / บทความโดย Alex Druinsky, Sivan Toledo, วิธีการที่ถูกต้อง inv (A) * b มีการพิจารณาบางอย่างเกี่ยวกับปัญหานี้

ตามกระดาษเหตุผลหลักสำหรับการตั้งค่าทั่วไปที่จะใช้แก้ปัญหาระบบเชิงเส้นอยู่ภายในประมาณการทั้งสองนี้ ( เป็นทางออกที่แท้จริง): ผกผันx

inverse||xVx||O(κ2(A)ϵmachine) backward stable (LU, QR,...)||xbackwardstablex||O(κ(A)ϵmachine)

ตอนนี้การประมาณค่าสำหรับผกผันสามารถปรับปรุงได้ภายใต้เงื่อนไขบางอย่างเหนือผกผันให้ดูทฤษฎีบท 1 ในกระดาษ แต่สามารถมีความถูกต้องตามเงื่อนไขและไม่เสถียรย้อนหลังxV

กระดาษแสดงกรณีที่เกิดเหตุการณ์นี้ ( คือสิ่งที่ตรงกันข้าม)V

V

V||xV||||x||

bA

ดังนั้นโอกาสที่จะใช้หรือไม่ตรงกันข้ามนั้นขึ้นอยู่กับแอพพลิเคชั่นคุณสามารถตรวจสอบบทความและดูว่าคุณมีคุณสมบัติตรงตามเงื่อนไขหรือไม่หากต้องการความเสถียรแบบย้อนกลับหรือหากคุณไม่ต้องการ

โดยทั่วไปแล้วในความคิดของฉันมีความปลอดภัยมากขึ้นในการแก้ปัญหาระบบเชิงเส้น


12

Δu

ut=Δu+f(t,u).

A

ut=Au+f(t,u)

AIγASpecialMatrices.jl

julia> using SpecialMatrices
julia> Strang(5)
5×5 SpecialMatrices.Strang{Float64}:
 2.0  -1.0   0.0   0.0   0.0
-1.0   2.0  -1.0   0.0   0.0
 0.0  -1.0   2.0  -1.0   0.0
 0.0   0.0  -1.0   2.0  -1.0
 0.0   0.0   0.0  -1.0   2.0

nO(3n)O(1)

อย่างไรก็ตามสมมุติว่าเราต้องการกลับเมทริกซ์

julia> inv(collect(Strang(5)))
5×5 Array{Float64,2}:
 0.833333  0.666667  0.5  0.333333  0.166667
 0.666667  1.33333   1.0  0.666667  0.333333
 0.5       1.0       1.5  1.0       0.5
 0.333333  0.666667  1.0  1.33333   0.666667
 0.166667  0.333333  0.5  0.666667  0.833333

O(n2)

\IterativeSolvers.jlAx=bA1A

ดังที่คนอื่น ๆ ได้กล่าวถึงหมายเลขเงื่อนไขและข้อผิดพลาดเชิงตัวเลขเป็นอีกเหตุผลหนึ่ง แต่ความจริงที่ว่าค่าผกผันของเมทริกซ์เบาบางนั้นหนาแน่นจะให้ความชัดเจนมาก "นี่เป็นความคิดที่ไม่ดี"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.