TL; DRพวกเขาได้รายงานจำนวนสภาพไม่จำเป็นต้องขวาจำนวนเงื่อนไขสำหรับเมทริกซ์เพราะมีความแตกต่าง
นี่คือเมทริกซ์และเวกเตอร์ด้านขวามือโดยเฉพาะ ถ้าคุณดูเอกสารประกอบ*getrs
มันบอกว่าข้อผิดพลาดที่ส่งต่อคือ
ที่นี่ไม่ใช่เงื่อนไขหมายเลขปกติแต่แทนที่จะ
(ที่นี่ภายในบรรทัดฐานเหล่านี้คือค่าสัมบูรณ์ที่ชาญฉลาดขององค์ประกอบ) ดูตัวอย่างเช่นการปรับแต่งซ้ำสำหรับระบบเชิงเส้นและ LAPACKโดย Highamหรือความแม่นยำและความเสถียรของอัลกอริธึมตัวเลข (7.2)
∥x−x0∥∞∥x∥∞≲cond(A,x)u≤cond(A)u.
cond(A,x)κ∞(A)cond(A,x)=∥|A−1||A||x|∥∞∥x∥∞,cond(A)=∥|A−1||A|∥.
สำหรับตัวอย่างของคุณฉันใช้โอเปอเรเตอร์ pseudospectral สำหรับปัญหาที่คล้ายกันกับและที่จริงแล้วมีความแตกต่างอย่างมากระหว่างและฉันคำนวณและซึ่งเพียงพอที่จะอธิบายการสังเกตว่าสิ่งนี้เกิดขึ้นสำหรับทุกด้านขวาเพราะคำสั่งของขนาดตรงกับสิ่งที่เป็น เห็นได้ในตารางที่ 3.1 (ข้อผิดพลาดดีกว่าสั่งซื้อ 3-4) นี้ไม่ได้ทำงานเมื่อฉันพยายามเดียวกันเพียงสุ่มเมทริกซ์ป่วยปรับอากาศดังนั้นมันจะต้องมีคุณสมบัติของn=128∥|A−1||A|∥κ∞(A)7×1032.6×107A
ตัวอย่างที่ชัดเจนซึ่งตัวเลขเงื่อนไขสองหมายเลขไม่ตรงกันซึ่งฉันได้จาก Higham (7.17, p.124) เนื่องจาก Kahan คือ
ตัวอย่างที่ผมพบก็คือเพียงแค่เมทริกซ์ Vandermonde ธรรมดาบนกับสุ่มขฉันเดินผ่านและบางเมทริกซ์ป่วยปรับอากาศอื่น ๆ ยังผลิตชนิดของผลนี้เช่นและ
⎛⎝⎜2−11−1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2+2ϵ−ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
โดยพื้นฐานแล้วสิ่งที่เกิดขึ้นคือเมื่อคุณวิเคราะห์ความเสถียรของการแก้ปัญหาระบบเชิงเส้นด้วยความเคารพต่อการก่อกวนคุณต้องระบุว่าการก่อกวนใดที่คุณกำลังพิจารณาอยู่ เมื่อการแก้ระบบเชิงเส้นที่มี LAPACK ข้อผิดพลาดนี้ถูกผูกไว้พิจารณาเยี่ยงอย่างองค์ประกอบที่ชาญฉลาดในแต่การก่อกวนในไม่มีขดังนั้นสิ่งนี้จึงแตกต่างจากปกติที่จะพิจารณาเยี่ยงอย่าง normwise ทั้งในและขAbκ(A)=∥A−1∥∥A∥Ab
ลองพิจารณา (เป็นตัวอย่าง) ว่าจะเกิดอะไรขึ้นถ้าคุณไม่แยกความแตกต่าง เรารู้ว่าการใช้การปรับแต่งที่มีความแม่นยำซ้ำสองครั้ง (ดูลิงค์ด้านบน) เราจะได้รับเป็นไปได้ความผิดพลาดที่ดีที่สุดไปข้างหน้าของสำหรับการฝึกอบรมผู้ที่มี u ดังนั้นหากเราพิจารณาความคิดที่ว่าระบบเชิงเส้นไม่สามารถแก้ไขได้เพื่อความแม่นยำที่ดีกว่าวิธีการกลั่นจะทำงานอย่างไรO(u)κ(A)≪1/uκ(A)u
PSมันเรื่องที่?getrs
กล่าวว่าการแก้ปัญหาการคำนวณเป็นทางออกที่แท้จริงของการ(A + E)x = b
มีการก่อกวนในแต่ไม่มีการก่อกวนในขสิ่งต่าง ๆ จะแตกต่างกันถ้าการก่อกวนได้รับอนุญาตใน .EAbb
แก้ไขเพื่อแสดงให้เห็นว่าการทำงานนี้โดยตรงยิ่งขึ้นในรหัสว่านี่ไม่ใช่ความบังเอิญหรือโชคดี แต่ผลลัพธ์ (ผิดปกติ) ซึ่งเป็นผลมาจากตัวเลขสองเงื่อนไขที่แตกต่างกันมากสำหรับการฝึกอบรมเฉพาะเช่น
cond(A,x)≈cond(A)≪κ(A).
function main2(m=128)
A = matrixdepot("chebspec", m)^2
A[1,:] = A[end,:] = 0
A[1,1] = A[end,end] = 1
best, worst = Inf, -Inf
for k=1:2^5
b = randn(m)
x = A \ b
x_exact = Float64.(big.(A) \ big.(b))
err = norm(x - x_exact, Inf) / norm(x_exact, Inf)
best, worst = min(best, err), max(worst, err)
end
@printf "Best relative error: %.3e\n" best
@printf "Worst relative error: %.3e\n" worst
@printf "Predicted error κ(A)*ε: %.3e\n" cond(A, Inf)*eps()
@printf "Predicted error cond(A)*ε: %.3e\n" norm(abs.(inv(A))*abs.(A), Inf)*eps()
end
julia> main2()
Best relative error: 2.156e-14
Worst relative error: 2.414e-12
Predicted error κ(A)*ε: 8.780e-09
Predicted error cond(A)*ε: 2.482e-12
แก้ไข 2นี่คืออีกตัวอย่างหนึ่งของปรากฏการณ์เดียวกันที่จำนวนเงื่อนไขที่แตกต่างกันแตกต่างกันมากโดยไม่คาดคิด เวลานี้
นี่เป็น 10 × 10 Vandermonde เมทริกซ์ในและเมื่อมีการสุ่มเลือกเป็น noticably ขนาดเล็กกว่าและกรณีที่เลวร้ายที่สุดจะได้รับโดยบาง
cond(A,x)≪cond(A)≈κ(A).
A1:10xcond(A,x)κ(A)xxi=iaa
function main4(m=10)
A = matrixdepot("vand", m)
lu = lufact(A)
lu_big = lufact(big.(A))
AA = abs.(inv(A))*abs.(A)
for k=1:12
# b = randn(m) # good case
b = (1:m).^(k-1) # worst case
x, x_exact = lu \ b, lu_big \ big.(b)
err = norm(x - x_exact, Inf) / norm(x_exact, Inf)
predicted = norm(AA*abs.(x), Inf)/norm(x, Inf)*eps()
@printf "relative error[%2d] = %.3e (predicted cond(A,x)*ε = %.3e)\n" k err predicted
end
@printf "predicted κ(A)*ε = %.3e\n" cond(A)*eps()
@printf "predicted cond(A)*ε = %.3e\n" norm(AA, Inf)*eps()
end
กรณีเฉลี่ย (เกือบ 9 คำสั่งของข้อผิดพลาดที่ดีกว่าขนาด):
julia> T.main4()
relative error[1] = 6.690e-11 (predicted cond(A,x)*ε = 2.213e-10)
relative error[2] = 6.202e-11 (predicted cond(A,x)*ε = 2.081e-10)
relative error[3] = 2.975e-11 (predicted cond(A,x)*ε = 1.113e-10)
relative error[4] = 1.245e-11 (predicted cond(A,x)*ε = 6.126e-11)
relative error[5] = 4.820e-12 (predicted cond(A,x)*ε = 3.489e-11)
relative error[6] = 1.537e-12 (predicted cond(A,x)*ε = 1.729e-11)
relative error[7] = 4.885e-13 (predicted cond(A,x)*ε = 8.696e-12)
relative error[8] = 1.565e-13 (predicted cond(A,x)*ε = 4.446e-12)
predicted κ(A)*ε = 4.677e-04
predicted cond(A)*ε = 1.483e-05
กรณีที่เลวร้ายที่สุด ( ):a=1,…,12
julia> T.main4()
relative error[ 1] = 0.000e+00 (predicted cond(A,x)*ε = 6.608e-13)
relative error[ 2] = 1.265e-13 (predicted cond(A,x)*ε = 3.382e-12)
relative error[ 3] = 5.647e-13 (predicted cond(A,x)*ε = 1.887e-11)
relative error[ 4] = 8.895e-74 (predicted cond(A,x)*ε = 1.127e-10)
relative error[ 5] = 4.199e-10 (predicted cond(A,x)*ε = 7.111e-10)
relative error[ 6] = 7.815e-10 (predicted cond(A,x)*ε = 4.703e-09)
relative error[ 7] = 8.358e-09 (predicted cond(A,x)*ε = 3.239e-08)
relative error[ 8] = 1.174e-07 (predicted cond(A,x)*ε = 2.310e-07)
relative error[ 9] = 3.083e-06 (predicted cond(A,x)*ε = 1.700e-06)
relative error[10] = 1.287e-05 (predicted cond(A,x)*ε = 1.286e-05)
relative error[11] = 3.760e-10 (predicted cond(A,x)*ε = 1.580e-09)
relative error[12] = 3.903e-10 (predicted cond(A,x)*ε = 1.406e-09)
predicted κ(A)*ε = 4.677e-04
predicted cond(A)*ε = 1.483e-05
แก้ไข 3อีกตัวอย่างหนึ่งคือ Forsythe matrix ซึ่งเป็นบล็อก Jordan ที่ถูกรบกวนทุกขนาดของรูปแบบ
นี่คือ ,ดังนั้นแต่ดังนั้น1 และในขณะที่สามารถตรวจสอบได้ด้วยมือแก้ระบบสมการเชิงเส้นเช่นกับระบบมีความถูกต้องมากแม้จะมีที่อาจเกิดขึ้นมากมาย(A) เมทริกซ์นี้ก็จะให้ผลลัพธ์ที่แม่นยำอย่างไม่คาดคิดเช่นกัน
A=⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟.
∥A∥=1∥A−1∥=ϵ−1κ∞(A)=ϵ−1|A−1|=A−1=|A|−1cond(A)=1Ax=bκ∞(A)
แก้ไข 4 Kahan เมทริกซ์ก็เป็นแบบนี้ด้วย :cond(A)≪κ(A)
A = matrixdepot("kahan", 48)
κ, c = cond(A, Inf), norm(abs.(inv(A))*abs.(A), Inf)
@printf "κ=%.3e c=%.3e ratio=%g\n" κ c (c/κ)
κ=8.504e+08 c=4.099e+06 ratio=0.00482027