tl; dr Zgłosili się liczbę warunek, niekoniecznie właściwą liczbę Warunkiem matrycy, ponieważ istnieje różnica.
Jest to specyficzne dla macierzy i wektora po prawej stronie. Jeśli spojrzysz na dokumentację*getrs
, to zobaczysz , że granica błędu przekazywania to
Tutaj nie jest całkiem zwykłym numerem warunku , ale raczej
(Wewnątrz normy są to bezwzględne wartości składowe.) Zobacz na przykład iteracyjne udoskonalenie układów liniowych i LAPACK firmy Higham lub Dokładność i stabilność algorytmów numerycznych Highama (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|∥.
Dla twojego przykładu wziąłem pseudospektralny operator różnicowy dla podobnego problemu z , i faktycznie istnieje duża różnica międzyi , obliczyłem i , co wystarcza do wyjaśnienia obserwacji, że dzieje się to dla wszystkich prawych stron, ponieważ rzędy wielkości z grubsza odpowiadają temu, co jest patrz Tabela 3.1 (lepsze błędy o 3-4 zamówienia). To nie działa, gdy próbuję to samo tylko na losowej źle uwarunkowanym matrycy, więc to musi być właściwością .n=128∥|A−1||A|∥κ∞(A)7×1032.6×107A
Wyraźnym przykładem, dla którego dwie liczby nie pasują do siebie, którą wziąłem od Highama (7.17, s. 124), z powodu Kahana, jest
Innym przykładem, który znalazłem, jest zwykła macierz Vandermonde z losowym . Przeszedłem i niektóre inne źle uwarunkowane matryce również dają tego typu wynik, jak i .
⎛⎝⎜2−11−1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2+2ϵ−ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
Zasadniczo chodzi o to, że analizując stabilność rozwiązywania układów liniowych w odniesieniu do zaburzeń, najpierw musisz określić, które zaburzenia rozważasz. Podczas rozwiązywania układów liniowych za pomocą LAPACK, to ograniczenie błędu uwzględnia perturbacje składowe w , ale brak perturbacji w . To różni się od zwykłego, która uwzględnia zaburzenia normalne zarówno w jak i .Abκ(A)=∥A−1∥∥A∥Ab
Zastanów się (jako kontrprzykład) również, co by się stało, gdybyś nie rozróżniał. Wiemy, że stosując iteracyjne udoskonalanie z podwójną precyzją (patrz link powyżej) możemy uzyskać najlepszy możliwy błąd względny w przód dla tych macierzy z . Więc jeśli weźmiemy pod uwagę pomysł, że układów liniowych nie da się rozwiązać z dokładnością lepszą niż , to jak udałoby się dopracować rozwiązania?O(u)κ(A)≪1/uκ(A)u
PS Ważne jest, że ?getrs
obliczone rozwiązanie jest prawdziwym rozwiązaniem (A + E)x = b
z perturbacją w , ale bez perturbacji w . Sytuacja wyglądałaby inaczej, gdyby perturbacje były dozwolone w .EAbb
Edytuj Aby pokazać temu działającemu bardziej bezpośrednio, w kodzie, że nie jest to przypadek ani szczęście, ale raczej (nietypowa) konsekwencja dwóch liczb warunków bardzo różniących się dla niektórych określonych macierzy, np.
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
Edycja 2 Oto kolejny przykład tego samego zjawiska, w którym różne liczby warunków nieoczekiwanie różnią się znacznie. Tym razem
Tutaj jest macierzą Vandermonde 10 × 10 na , a gdy jest wybierane losowo, jest zauważalnie mniejsze niż , a najgorszy przypadek jest podany przez dla niektórych .
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
Średnia wielkość liter (prawie 9 rzędów lepszych błędów):
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
Najgorszy przypadek ( ):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
Edycja 3 Kolejnym przykładem jest macierz Forsythe, która jest zaburzonym blokiem Jordana o dowolnym rozmiarze postaci
Ma to , , więc , ale , więc . I jak można zweryfikować ręcznie, rozwiązywanie układów równań liniowych, takich jak jest niezwykle dokładne, pomimo potencjalnie nieograniczonego . Więc ta matryca przyniesie nieoczekiwanie precyzyjne rozwiązania.
A=⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟.
∥A∥=1∥A−1∥=ϵ−1κ∞(A)=ϵ−1|A−1|=A−1=|A|−1A x = b κ ∞ ( A )cond(A)=1Ax=bκ∞(A)
Edycja 4 macierzy Kahana jest również taka, z :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