tl; dr Họ đã báo cáo một số điều kiện, không nhất thiết là số điều kiện phù hợp cho ma trận, vì có sự khác biệt.
Điều này là cụ thể cho ma trận và vector bên phải. Nếu bạn nhìn vào các tài liệu hướng dẫn cho*getrs
, nó nói lỗi mong ràng buộc là
Ở đâycond(A,x)không hoàn toàn là số điều kiện thông thườngκ∞(A), mà là
cond(A,x)=‖| A - 1
∥x−x0∥∞∥x∥∞≲cond(A,x)u≤cond(A)u.
cond(A,x)κ∞(A)
(Ở đây bên trong định mức, đây là các giá trị tuyệt đối theo thành phần.) Xem, ví dụ,
tinh chỉnh lặp cho các hệ thống tuyến tính và LAPACKcủa Higham, hoặc
Độ chính xác và ổn định của thuật toán số(7.2).
cond(A,x)=∥|A−1||A||x|∥∞∥x∥∞,cond(A)=∥|A−1||A|∥.
Ví dụ của bạn, tôi mất một nhà điều hành khác biệt pseudospectral cho một vấn đề tương tự với , và có trong thực tế, một sự khác biệt lớn giữa ‖ | A - 1 | | Một | ‖ Và k ∞ ( Một ) , tôi tính toán 7 × 10 3 và 2,6 × 10 7n=128∥|A−1||A|∥κ∞(A)7×1032.6×107, điều này đủ để giải thích sự quan sát rằng điều này xảy ra cho tất cả các phía bên tay phải, bởi vì các thứ tự cường độ gần như khớp với những gì nhìn thấy trong Bảng 3.1 (3-4 lỗi tốt hơn). Đây không phải làm việc khi tôi cố gắng tương tự cho chỉ là một ma trận ốm lạnh ngẫu nhiên, vì vậy nó có phải là một tài sản của .A
Một ví dụ rõ ràng mà hai số điều kiện không phù hợp, mà tôi mất từ Higham (7,17, p.124), do Kahan là
Một ví dụ khác tôi tìm thấy chỉ là ma trận Vandermonde đơn giảnvới ngẫu nhiênb. Tôi đã trải quavà một số ma trận điều hòa khác cũng tạo ra loại kết quả này, nhưvà.
⎛⎝⎜2−11−1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2+2ϵ−ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
Về cơ bản, điều đang xảy ra là khi bạn phân tích sự ổn định của việc giải quyết các hệ thống tuyến tính liên quan đến nhiễu loạn, trước tiên bạn phải xác định những nhiễu loạn nào bạn đang xem xét. Khi giải các hệ thống tuyến tính bằng LAPACK, lỗi này bị ràng buộc xem xét các nhiễu loạn thành phần trong , nhưng không gây nhiễu trong b . Vì vậy, đây là khác biệt so với thông thường κ ( Một ) = ‖ Một - 1 ‖ ‖ Một ‖ , mà coi nhiễu loạn normwise trong cả hai Một và b .Abκ(A)=∥A−1∥∥A∥Ab
Hãy xem xét (như một ví dụ) cũng như những gì sẽ xảy ra nếu bạn không tạo ra sự khác biệt. Chúng ta biết rằng việc sử dụng tinh lặp đi lặp lại với độ chính xác gấp đôi (xem liên kết ở trên), chúng tôi có thể nhận được các sai số tương đối về phía trước tốt nhất có thể của đối với những ma trận với κ ( Một ) « 1 / u . Vì vậy, nếu chúng ta xem xét ý tưởng rằng các hệ thống tuyến tính không thể được giải quyết với độ chính xác tốt hơn κ ( A ) u , thì các giải pháp tinh chỉnh có thể hoạt động như thế nào?O(u)κ(A)≪1/uκ(A)u
PS Vấn đề là ?getrs
giải pháp tính toán là giải pháp thực sự (A + E)x = b
với nhiễu loạn trong A , nhưng không có nhiễu loạn trong b . Mọi thứ sẽ khác nếu nhiễu loạn được cho phép trong b .EAbb
Chỉnh sửa Để hiển thị điều này hoạt động trực tiếp hơn, theo mã, rằng đây không phải là vấn đề may mắn, mà là hậu quả (bất thường) của hai số điều kiện rất khác nhau đối với một số ma trận cụ thể, ví dụ:
c o n d (A,x)≈ c o n d (A)«κ(Một).
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
c o n d (A,x)« c o n d (A)≈k(A).
Một1 : 10xc o n d (A,x)κ ( A )xxTôi= tôimộtmột
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
Trường hợp trung bình (gần 9 lỗi độ lớn tốt hơn):
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
Chỉnh sửa 3 Một ví dụ khác là ma trận Forsythe, là một khối Jordan bị nhiễu loạn với bất kỳ kích thước nào có dạng
A=⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟.
∥A∥=1∥A−1∥=ϵ−1κ∞(A)=ϵ−1|A−1|=A−1=|A|−1cond(A)=1Ax=bκ∞(A)
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