tl; dr Mereka melaporkan sebuah nomor kondisi, belum tentu tepat jumlah kondisi matriks, karena ada perbedaan.
Ini khusus untuk matriks dan vektor sisi kanan. Jika Anda melihat dokumentasi untuk*getrs
, dikatakan batas kesalahan maju adalah
Di sinicond(A,x)tidak cukup seperti bilangan kondisiκ∞(A), melainkan
cond(A,x)=‖| A - 1
∥ x - x0∥∞∥ x ∥∞≲ c o n d ( A , x ) u ≤ c o n d ( A ) u .
c o n d (A,x)κ∞( A )
(Di sini di dalam norma ini adalah nilai absolut komponen-bijaksana.) Lihat, misalnya,
perbaikan berulang untuk sistem linier dan LAPACKoleh Higham, atau
Akurasi dan Stabilitas Algoritma NumerikHigham(7.2).
c o n d (A,x)= ∥ | SEBUAH- 1||A||x|∥∞∥x∥∞,cond(A)=∥|A−1||A|∥.
Sebagai contoh Anda, saya mengambil operator diferensial pseudospectral untuk masalah yang sama dengan , dan sebenarnya ada perbedaan besar antara ‖ | A - 1 | | A | ‖ Dan κ ∞ ( A ) , saya menghitung 7 × 10 3 dan 2,6 × 10 7n=128∥|A−1||A|∥κ∞(A)7×1032.6×107, yang cukup untuk menjelaskan pengamatan bahwa ini terjadi untuk semua sisi kanan, karena urutan besarnya kira-kira sesuai dengan yang terlihat pada Tabel 3.1 (3-4 urutan kesalahan yang lebih baik). Ini tidak bekerja ketika saya mencoba sama untuk hanya random matrix sakit-AC, sehingga harus menjadi milik .A
Contoh eksplisit di mana kedua nomor kondisi tidak cocok, yang saya ambil dari Higham (7.17, hal.124), karena Kahan adalah
Contoh lain yang saya temukan hanyalah matriks Vandermonde polosdenganbacak. Saya melewatidan beberapa matriks berkondisi buruk lainnya juga menghasilkan jenis hasil ini, sepertidan.
⎛⎝⎜2−11−1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2+2ϵ−ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
Pada dasarnya, apa yang terjadi adalah ketika Anda menganalisis stabilitas penyelesaian sistem linier sehubungan dengan gangguan, Anda harus terlebih dahulu menentukan gangguan mana yang Anda pertimbangkan. Saat memecahkan sistem linier dengan LAPACK, batas kesalahan ini mempertimbangkan gangguan komponen-bijaksana dalam , tetapi tidak ada gangguan di b . Jadi ini berbeda dari yang biasa κ ( A ) = ‖ A - 1 ‖ ‖ A ‖ , yang menganggap gangguan normwise di kedua A dan b .Abκ(A)=∥A−1∥∥A∥Ab
Pertimbangkan (sebagai contoh tandingan) juga apa yang akan terjadi jika Anda tidak membuat perbedaan. Kita tahu bahwa menggunakan perbaikan berulang dengan presisi ganda (lihat tautan di atas) kita bisa mendapatkan kesalahan relatif ke depan yang paling baik dari untuk matriks dengan κ ( A ) ≪ 1 / u . Jadi jika kita mempertimbangkan gagasan bahwa sistem linier tidak dapat diselesaikan dengan akurasi lebih baik daripada κ ( A ) u , bagaimana mungkin solusi pemurnian bekerja?O(u)κ(A)≪1/uκ(A)u
PS Itu penting yang ?getrs
mengatakan solusi dihitung adalah solusi yang benar (A + E)x = b
dengan perturbasi di A , tetapi tidak ada gangguan di b . Keadaan akan berbeda jika gangguan diizinkan di b .EAbb
Mengedit Untuk menunjukkan ini bekerja lebih langsung, dalam kode, bahwa ini bukan kebetulan atau masalah keberuntungan, melainkan (biasa) konsekuensi dari dua angka kondisi yang sangat berbeda untuk beberapa matriks tertentu, yaitu,
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
Sunting 2 Berikut adalah contoh lain dari fenomena yang sama di mana kondisi yang berbeda jumlahnya berbeda-beda. Kali ini,
Di sini A adalah matriks Vandermonde 10 × 10 pada 1 : 10 , dan ketika x dipilih secara acak, c o n d ( A , x ) secara nyata lebih kecil dari κ
cond(A,x)≪cond(A)≈κ(A).
A1:10xcond(A,x) , dan kasus terburuk
x diberikan oleh
x i = i a untuk beberapa
a .
κ(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
Kasus rata-rata (hampir 9 urutan kesalahan lebih besar lebih baik):
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
Kasus terburuk ( ):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
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