tl; dr Sie berichteten , eine Konditionszahl, die nicht unbedingt die richtige Kondition für die Matrix, weil es einen Unterschied gibt.
Dies ist spezifisch für die Matrix und den Vektor auf der rechten Seite. Wenn man sich anschaut , die Dokumentation*getrs
, sagt es der Vorwärtsfehler gebunden ist
Dabei istcond(A,x)nicht ganz die übliche Bedingungszahlκ∞(A), sondern
cond(A,x)=‖| A - 1
∥x−x0∥∞∥x∥∞≲cond(A,x)u≤cond(A)u.
cond(A,x)κ∞(A)
(Hierbei handelt es sich innerhalb der Norm um komponentenbezogene Absolutwerte.) Siehe z. B.
Iterative Verfeinerung für lineare Systeme und LAPACKvon Highamoder
Genauigkeit und Stabilität numerischer Algorithmenvon Higham(7.2).
c o n d (A,x)= ∥ | EIN- 1| | A | | x | ∥∞∥ x ∥∞,c o n d (A)=∥ | EIN- 1||A|∥.
In Ihrem Beispiel habe ich einen Pseudospektraldifferentialoperator für ein ähnliches Problem mit , und es gibt tatsächlich einen großen Unterschied zwischen ‖ | A - 1 | | A | ‖ Und κ ∞ ( A ) berechnete ich 7 × 10 3 und 2,6 × 10 7n = 128∥ | EIN- 1| | A | ∥κ∞( A )7 × 1032,6 × 107Dies reicht aus, um die Beobachtung zu erklären, dass dies für alle rechten Seiten der Fall ist, da die Größenordnungen in etwa mit den in Tabelle 3.1 gezeigten Werten übereinstimmen (3-4 ordnen bessere Fehler zu). Dies funktioniert nicht, wenn ich dasselbe nur für eine zufällige schlecht konditionierte Matrix versuche, also muss es eine Eigenschaft von .EIN
Ein explizites Beispiel, bei dem die beiden Bedingungsnummern, die ich von Higham (7.17, S.124) aufgrund von Kahan genommen habe, nicht übereinstimmen, ist
Ein anderes Beispiel, das ich gefunden habe, ist nur die einfache Vandermonde-Matrixmit zufälligemb. Ich bin durchgegangenund einige andere schlecht konditionierte Matrizen produzieren ebenfalls diese Art von Ergebnis, wieund.
⎛⎝⎜2- 11- 1ϵϵ1ϵϵ⎞⎠⎟,⎛⎝⎜2 + 2 ϵ- ϵϵ⎞⎠⎟.
[1:10]
bMatrixDepot.jl
triw
moler
Wenn Sie die Stabilität der Lösung linearer Systeme in Bezug auf Störungen analysieren, müssen Sie zunächst angeben, welche Störungen Sie berücksichtigen. Bei der Lösung linearer Systeme mit LAPACK berücksichtigt diese Fehlergrenze komponentenweise Störungen in , aber keine Störungen in b . Dies unterscheidet sich also von dem üblichen κ ( A ) = ‖ A - 1 ‖ ‖ A ‖ , bei dem sowohl in A als auch in b normweise Störungen berücksichtigt werden .EINbκ ( A ) = ∥ A- 1∥ ∥ A ∥EINb
Betrachten Sie (als Gegenbeispiel) auch, was passieren würde, wenn Sie nicht unterscheiden. Wir wissen, dass wir mit iterativer Verfeinerung mit doppelter Genauigkeit (siehe Link oben) den bestmöglichen relativen Fehler von für die Matrizen mit κ ( A ) ≪ 1 / u in Vorwärtsrichtung erhalten können . Wenn wir also die Idee berücksichtigen, dass lineare Systeme nicht mit einer Genauigkeit besser als κ ( A ) u gelöst werden können , wie würden Verfeinerungslösungen möglicherweise funktionieren?O ( u )κ ( A ) ≤ 1 / uκ(A)u
PS Es kommt darauf an, dass ?getrs
die berechnete Lösung die wahre Lösung von (A + E)x = b
mit einer Störung in A , aber keiner Störung in b ist . Anders wäre es, wenn Störungen in b zugelassen würden .EAbb
Bearbeiten Damit dies im Code direkter funktioniert, ist dies kein Zufall oder Glücksfall, sondern die (ungewöhnliche) Folge, dass zwei Bedingungsnummern für bestimmte Matrizen sehr unterschiedlich sind, z. B.
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
c o n d (A,x)≪ c o n d (A)≈κ(A).
EIN1 : 10xc o n d (A,x)κ ( A )xxich= ieinein
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
Durchschnittlicher Fall (fast 9 Größenordnungen besserer Fehler):
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
A = ⎛⎝⎜⎜⎜000ϵ100001000010⎞⎠⎟⎟⎟.
∥ A ∥ = 1∥ A- 1∥ = ϵ- 1κ∞( A ) = ϵ- 1| EIN- 1| = A- 1= | A |- 1c o n d (A)=1A x = bκ∞( A )
c o n d (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