Warum können schlecht konditionierte lineare Systeme präzise gelöst werden?


13

Entsprechend der Antwort hier verringert eine große Bedingungszahl (für das Lösen eines linearen Systems) die garantierte Anzahl korrekter Stellen in der Gleitkomma-Lösung. Differenzierungsmatrizen höherer Ordnung in pseudospektralen Verfahren sind typischerweise sehr schlecht konditioniert. Warum sind sie dann immer noch sehr genaue Methoden?

Ich verstehe, dass die geringe Präzision, die von den schlecht konditionierten Matrizen ausgeht, nur ein garantierter Wert ist, aber ich frage mich trotzdem, warum schlecht konditionierte Matrizen durch direkte Methoden in der Praxis genau gelöst werden - zB die LCOLSpalten in Tabelle 3.1 auf Seite 11 von Wang et al., Eine gut konditionierte Kollokationsmethode unter Verwendung einer PSEUDOSPECTRAL INTEGRATION MATRIX , SIAM J. Sci. Comput., 36 (3) .


2
Meine Intuition ist, dass die Lösbarkeit / Genauigkeit eines Ax = b-Systems an den Forcierungsvektor b gebunden ist, nicht nur an die Matrix A. Wenn b die schlecht konditionierten Modi von A nicht "sondiert" oder "erregt", dann ist dies eine genaue Lösung bleibt möglich. Als einschränkendes Beispiel kann A genau singulär sein (unendliche Bedingungszahl), aber Ax = b kann immer noch eine Lösung besitzen, die genau berechnet werden kann, wenn die Forcierungsdaten b im Bereich von A liegen. Ich gebe zu, das ist eine schöne Hand -wavy, weshalb ich nur kommentiere anstatt zu antworten.
rchilton1980

@ rchilton1980 "Axe = b besitzt möglicherweise noch eine Lösung" Diese Lösung ist jedoch nicht eindeutig. Und die Beispiele, von denen ich spreche, haben eine einzigartige Lösung.
Zoltán Csáti

Das ist ein fairer Kontrapunkt - vielleicht ein Artefakt der Auswahl einer unendlichen Bedingungszahl (ein Eigenwert von genau Null). Ich denke jedoch, Sie können diesen Null-Eigenwert durch Maschinen-Epsilon ersetzen, und mein Punkt bleibt bestehen. (Das heißt, das System hat eine sehr große Bedingungszahl, das System ist nicht singulär mit einer eindeutigen Lösung, die wir sehr genau berechnen können, vorausgesetzt, b hat keine Komponente entlang dieses winzigen Eigenpaars).
rchilton1980

1
Genauer gesagt ist mein Gedankenexperiment hier so etwas wie A = diag ([1 1 1 1 1 eps]), b = [b1 b2 b3 b4 b5 0]. Es ist erfunden, aber ich denke, es ist ausreichend, um die ursprüngliche Behauptung zu rechtfertigen: "Manchmal können schlecht konditionierte As für bestimmte Entscheidungen von b genau gelöst werden"
rchilton1980

1
Geben Sie einfach ein weiteres Beispiel von Moler Blog blogs.mathworks.com/cleve/2015/02/16/...
percusse

Antworten:


7

Nach meiner ersten Antwort hinzugefügt:

Es scheint mir jetzt, dass der Autor des referenzierten Papiers Bedingungsnummern (anscheinend 2-Norm-Bedingungsnummern, möglicherweise aber Unendlich-Norm-Bedingungsnummern) in der Tabelle angibt, während er maximale absolute Fehler anstelle von normrelativen Fehlern oder maximalen elementweisen relativen Fehlern angibt ( Dies sind alles unterschiedliche Maße.) Beachten Sie, dass der maximale elementweise relative Fehler nicht mit dem relativen Fehler der Unendlichkeitsnorm identisch ist. Darüber hinaus beziehen sich die Fehler in der Tabelle eher auf die exakte Lösung des ursprünglichen Differentialgleichungsgrenzwertproblems als auf das diskretisierte lineare Gleichungssystem. Aus diesem Grund sind die in diesem Dokument enthaltenen Informationen nicht für die Verwendung mit dem Fehler geeignet, der auf der Bedingungsnummer basiert.

In meiner Replikation der Berechnungen sehe ich jedoch Situationen, in denen der relative Unendlich-Normfehler (oder der relative Zwei-Norm-Fehler) wesentlich kleiner ist als die Grenze, die durch die Unendlich-Norm-Bedingungsnummer (bzw. die 2-Norm-Bedingungsnummer) festgelegt wird. Manchmal hat man einfach Glück.

Ich habe das DMSUITE MATLAB-Paket verwendet und das Beispielproblem in diesem Artikel mithilfe der Pseudospektralmethode mit Chebyshev-Polynomen gelöst. Meine Zustandszahlen und maximalen absoluten Fehler entsprachen denen, die in der Veröffentlichung angegeben wurden.

Ich sah auch Fehler in Bezug auf die Norm, die etwas besser waren, als man aufgrund der Bedingungsnummer erwarten würde. Zum Beispiel erhalte ich für das Beispielproblem mit mitN = 1024ϵ=0.01N=1024

cond (A, 2) = 7,9e + 8

cond (A, inf) = 7,8e + 8

norm (u-uexact, 2) / norm (uexact, 2) = 3.1e-12

Norm (u-uexact, inf) / Norm (uexact, inf) = 2,7e-12

Es scheint, dass die Lösung ungefähr 11-12 Stellen gut ist, während die Bedingungsnummer in der Größenordnung von 1e8 liegt.

Interessanter ist jedoch die Situation mit elementweisen Fehlern.

max (abs (u-uexact)) = 2,7e-12

Das sieht immer noch gut aus.

max (abs ((u-uexact) ./ uexact) = 6.1e + 9

Wow, es gibt einen sehr großen relativen Fehler in mindestens einer Komponente der Lösung.

Was ist passiert? Die exakte Lösung dieser Gleichung enthält winzige Komponenten (z. B. 1,9e-22), während die ungefähre Lösung einen viel größeren Wert von 9e-14 ergibt. Dies wird durch die normrelative Fehlermessung (sei es die 2-Norm oder die Unendlichkeitsnorm) ausgeblendet und erst sichtbar, wenn Sie die elementweisen relativen Fehler betrachten und das Maximum nehmen.

Meine ursprüngliche Antwort unten erklärt, warum in der Lösung ein normbezogener Fehler auftreten kann, der geringer ist als die durch die Bedingungsnummer angegebene Grenze.


Wie Sie in der Frage bemerkt haben, ergibt die Bedingungsnummer einer nicht singulären Matrix einen relativen Fehler im ungünstigsten Fall , der für die Lösung eines gestörten Gleichungssystems bestimmt ist. Das heißt, wenn wir genau lösen und genau lösen , dannA ( x + & Dgr; x ) = b + & Dgr; b A x = bκ(A)A(x+Δx)=b+ΔbAx=b

Δxxκ(A)Δbb

Bedingungsnummern können in Bezug auf eine Vielzahl von Normen berechnet werden, aber die Zwei-Normen-Bedingungsnummer wird häufig verwendet, und das ist die Bedingungsnummer, die in dem Artikel verwendet wird, auf den Sie sich beziehen.

Der schlimmste Fehler tritt auf, wenn ein linker Singularvektor von , der dem kleinsten Singularwert von . Der beste Fall liegt vor, wenn ein linker Singularvektor von , der dem größten Singularwert von . Wenn zufällig ist, müssen Sie die Projektionen von auf alle linken Singularvektoren von und die entsprechenden Singularwerte betrachten. Abhängig vom Spektrum von können die Dinge sehr schlecht oder sehr gut laufen. A A Δ B A A Δ B Δ B A AΔbAAΔbAAΔbΔbAA

Betrachten Sie zwei Matrizen , beide mit der 2-Norm-Bedingungsnummer . Die erste Matrix hat die Singularwerte , , , . Die zweite Matrix hat Singularwerte , , , , . 1,0 × 10 10 1 1 × 10 - 101 × 10 - 10 1 1 1 1 × 10 - 10A1.0×101011×10101×10101111×10-10

Im ersten Fall ist es unwahrscheinlich, dass eine zufällige Störung in Richtung des ersten linken Singularvektors auftritt, und es ist wahrscheinlicher, dass sie nahe an einem der Singularvektoren mit dem Singularwert . Daher ist die relative Änderung in der Lösung wahrscheinlich sehr groß. Im zweiten Fall ist fast jede Störung in Richtung eines singulären Vektors mit dem singulären Wert , und die relative Änderung in der Lösung ist gering. 11×10-101

PS (später hinzugefügt, nachdem ich vom Yoga-Kurs zurückkam ...)

Die Formel für die Lösung von lautetEINΔx=Δb

Δx=VΣ-1UTΔb=ich=1nUichTΔbσichVich

Nach dem Satz von Pythagoras

Δx22=i=1n(UiTΔbσi)2

Wenn wir behalten , dann wird diese Summe maximiert, wenn und minimiert, wenn .Δb2=1Δb=UnΔb=U1

In der hier betrachteten Situation ist das Ergebnis zufälliger Rundungsfehler, daher sollten die Werte für ungefähr alle gleich groß sein. Die Terme mit kleineren Werten von tragen viel zum Fehler bei, während Terme mit größeren Werten von nicht viel beitragen. Abhängig vom Spektrum kann dies leicht viel kleiner sein als im ungünstigsten Fall. ΔbUiTΔbσiσich


Wäre dieses Argument nicht bedeuten , dass es ist möglich (wenn auch unwahrscheinlich) , um den schlimmsten Fall zu erreichen gebunden von für die Matrix im Beispiel? AFAIU, basierend auf meiner Antwort und basierend auf der Dokumentation, sollte dies nicht möglich sein. κ(A)?getrs
Kirill

@BrianBorchers Könnten Sie bitte erläutern, warum "der schlimmste Fehler auftritt, wenn ein linker Singularvektor von , der dem kleinsten Singularwert von . Der beste Fall tritt auf, wenn ein linker Singularvektor von ist, der entspricht der größte Singularwert von " hält? Aus dem folgenden Beispiel ist es logisch, aber ich würde einige Formeln benötigen. Lassen Sie den SVD von sein . Im ersten Fall . Wie geht es weiter? ΔbAAΔbAAAA=UΣVTA=Δbσ1v1T+i=2NuichσichvichT
Zoltán Csáti

Ich habe Rundungsfehler in der Matrix nicht besprochen , aber der allgemeine Effekt ist ähnlich. Wenn Sie bei den Rundungsfehlern nicht wirklich Pech haben, schneiden Sie in der Regel etwas besser ab als im pessimistischen Worst-Case-Fall. EIN
Brian Borchers

(-1) Die Diskussion komponentenbezogener relativer Fehler in der Ausgabe ist ernsthaft irreführend.
Kirill

1

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

xx0xcond(A,x)ucond(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 HighamoderGenauigkeit und Stabilität numerischer Algorithmenvon Higham(7.2).
cond(A,x)=|A1||A||x|x,cond(A)=|A1||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||EIN|κ(EIN)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.jltriwmoler

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 - 1A , bei dem sowohl in A als auch in b normweise Störungen berücksichtigt werden .EINbκ(EIN)=EIN-1EINEINb

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?Ö(u)κ(EIN)1/uκ(A)u

PS Es kommt darauf an, dass ?getrsdie berechnete Lösung die wahre Lösung von (A + E)x = bmit 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Önd(EIN,x)cÖnd(EIN)κ(EIN).
EIN1:10xcÖnd(EIN,x)κ(EIN)xxich=icheinein
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

ein=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

EIN=(010000100001ϵ000).
EIN=1EIN-1=ϵ-1κ(EIN)=ϵ-1|EIN-1|=EIN-1=|EIN|-1cÖnd(EIN)=1EINx=bκ(EIN)

cÖnd(EIN)κ(EIN)

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

Die Bedingungsnummern in der Veröffentlichung, auf die sich das OP bezieht, sind Zwei-Norm-Bedingungsnummern. Wenn Sie zu Referenz [17] von ElBarbary zurückkehren, werden Sie feststellen, dass es sich in der früheren Veröffentlichung um Zwei-Norm-Bedingungsnummern handelte. Außerdem habe ich die Beispiele aus diesem Artikel mit DMsuite erstellt und fast genau dieselben 2-Norm-Bedingungsnummern erhalten, die im Artikel angegeben sind.
Brian Borchers

Die Normnummern für Unendlich-Normbedingungen für diese Beispiele, die ich mithilfe von DMSUITE- und Chebyshev-Interpolation erhalten habe, waren in der Größenordnung den Zwei-Norm-Bedingungsnummern ähnlich. Ich denke nicht, dass der Unterschied zwischen der 2-Norm und der Unendlichkeitsnorm für dieses Beispiel so wichtig ist.
Brian Borchers

ϵ=0,01

ϵ=0,01N=1024

@BrianBorchers Ich bin mir nicht sicher, was Sie meinen: Dies ist nicht der Unterschied zwischen 2-Norm- und Infty-Norm-Bedingungsnummern, sondern norm- und komponentenbezogene Bedingungsnummern (komponentenbezogene relative Störungen in der Eingabe, nicht Komponente) relative Fehler in der Ausgabe wie in Ihrer Antwort).
Kirill
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.