Perché i sistemi lineari mal condizionati possono essere risolti con precisione?


13

Secondo la risposta qui , un numero di condizione elevato (per la risoluzione del sistema lineare) riduce il numero garantito di cifre corrette nella soluzione a virgola mobile. Le matrici di differenziazione di ordine superiore nei metodi pseudospettrali sono in genere molto mal condizionate. Perché è allora che sono ancora metodi molto precisi?

Capisco che la bassa precisione proveniente dalle matrici mal condizionate è solo un valore garantito , ma mi chiedo ancora perché le matrici mal condizionate siano risolte accuratamente con metodi diretti nella pratica - ad esempio, le LCOLcolonne della Tabella 3.1 a pagina 11 di Wang et al., UN METODO DI COLLOCAZIONE BEN CONDIZIONATO CON UNA MATRICE DI INTEGRAZIONE PSEUDOSPECTRALE , SIAM J. Sci. Comput., 36 (3) .


2
La mia intuizione è che la solvibilità / accuratezza di un sistema Ax = b è legata al vettore di forzatura b, non solo alla matrice A. Forse se b non "sonda" o "eccita" i modi mal condizionati di A, allora una soluzione accurata rimane possibile. A titolo di esempio limitante, A può essere esattamente singolare (numero di condizione infinita), tuttavia Ax = b può ancora possedere una soluzione, che può essere calcolata con precisione, se i dati di forzatura b risiedono nell'intervallo di A. Ammetto che questa è una bella mano -wavy, motivo per cui faccio solo commenti invece di rispondere.
rchilton1980,

@ rchilton1980 "ma Ax = b potrebbe ancora possedere una soluzione" Ma quella soluzione non è unica. E gli esempi a cui mi riferisco possiedono una soluzione unica.
Zoltán Csáti,

Questo è un giusto contrappunto - forse un artefatto di scegliere un numero infinito di condizioni (un autovalore esattamente zero). Comunque penso che tu possa sostituire quell'autovalore zero con epsilon macchina e il mio punto è ancora valido. (Cioè, il sistema ha un numero di condizione molto grande, il sistema non è singolare con una soluzione unica, che possiamo calcolare in modo molto accurato a condizione che b non abbia alcun componente lungo quella piccola autovettura).
rchilton1980,

1
Per essere più specifici, il mio esperimento mentale qui è qualcosa come A = diag ([1 1 1 1 1 eps]), b = [b1 b2 b3 b4 b5 0]. È inventato, ma penso che sia sufficiente giustificare l'affermazione originale: "a volte le A mal condizionate possono essere risolte in modo accurato per particolari scelte di b"
rchilton1980

1
Basta dare un altro esempio dal blog di Moler blogs.mathworks.com/cleve/2015/02/16/...
percusse

Risposte:


7

Aggiunto dopo la mia risposta iniziale:

Ora mi sembra che l'autore dell'articolo a cui si fa riferimento fornisca numeri di condizione (numeri di condizione apparentemente a 2 norme, ma forse numeri di condizione a norma di infinito) nella tabella, fornendo al contempo errori assoluti massimi anziché errori relativi alla norma o errori relativi ai massimi elementi elementalmente ( queste sono tutte misure diverse.) Notare che l'errore relativo massimo a livello elementare non è la stessa cosa dell'errore relativo a norma di infinito. Inoltre, gli errori nella tabella sono relativi alla soluzione esatta al problema del valore limite dell'equazione differenziale originale piuttosto che al sistema lineare discretizzato di equazioni. Pertanto, le informazioni fornite nel documento non sono davvero appropriate per l'uso con il limite di errore basato sul numero della condizione.

Tuttavia, nella mia replica dei calcoli, vedo situazioni in cui l'errore relativo alla norma dell'infinito (o errore relativo a due norme) è sostanzialmente più piccolo del limite impostato dal numero di condizione della norma di infinito (rispettivamente numero di condizione di 2 norme). A volte sei solo fortunato.

Ho usato il pacchetto DMSUITE MATLAB e risolto il problema di esempio di questo documento usando il metodo pseudospettrale con i polinomi di Chebyshev. I miei numeri di condizione e gli errori assoluti massimi erano simili a quelli riportati nel documento.

Ho anche visto errori relativi alla norma che erano leggermente migliori di quanto ci si potrebbe aspettare in base al numero della condizione. Ad esempio, sul problema di esempio con , usando N = 1024 , ottengoϵ=0.01N=1024

cond (A, 2) = 7.9e + 8

cond (A, inf) = 7.8e + 8

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

norma (u-uexact, inf) / norma (uexact, inf) = 2,7E-12

Sembrerebbe che la soluzione sia buona a circa 11-12 cifre, mentre il numero della condizione è dell'ordine di 1e8.

Tuttavia, la situazione con errori dal punto di vista degli elementi è più interessante.

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

Sembra ancora buono.

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

Wow, c'è un errore relativo molto grande in almeno un componente della soluzione.

Quello che è successo? La soluzione esatta di questa equazione ha componenti minuscoli (ad es. 1,9e-22) mentre la soluzione approssimativa arriva a un valore molto più grande di 9e-14. Ciò è nascosto dalla misurazione dell'errore relativo della norma (sia che si tratti della norma 2 o dell'infinito) e diventa visibile solo quando si osservano gli errori relativi elementalmente e si prende il massimo.

La mia risposta originale di seguito spiega perché è possibile ottenere un errore relativo alla norma nella soluzione che è inferiore al limite dato dal numero di condizione.


Come hai notato nella domanda, il numero di condizione, , di una matrice non singolare fornisce un errore relativo nel caso peggiore associato alla soluzione a un sistema perturbato di equazioni. Cioè, se risolviamo A ( x + Δ x ) = b + Δ b esattamente e risolviamo A x = b esattamente, alloraκ(A)A(x+Δx)=b+ΔbAx=b

Δxxκ(A)Δbb

I numeri delle condizioni possono essere calcolati rispetto a una varietà di norme, ma viene spesso utilizzato il numero della condizione a due norme, e questo è il numero della condizione utilizzato nel documento a cui si fa riferimento.

L'errore caso peggiore si verifica quando è un vettore singolare fianco di A corrispondente al più piccolo valore singolare di A . Il caso migliore si verifica quando Δ b è un vettore singolare fianco di A corrispondente al massimo valore singolare A . Quando Δ b è casuale, allora devi guardare le proiezioni di Δ b su tutti i vettori singolari sinistri di A e i corrispondenti valori singolari. A seconda dello spettro di A , le cose possono andare molto male o molto bene. ΔbAAΔbAAΔbΔbAA

Considera due matrici , entrambe con numero di condizione a 2 norme 1,0 × 10 10 . La prima matrice ha i valori singolari 1 , 1 × 10 - 10 , , 1 × 10 - 10 . La seconda matrice ha valori singolari 1 , 1 , , 1 , 1 × 10A1.0×101011×10101×1010111 . 1×1010

Nel primo caso, è improbabile che una perturbazione casuale si trovi nella direzione del primo vettore singolare sinistro, e più probabilmente si avvicini a uno dei vettori singolari con valore singolare . Pertanto, è probabile che il cambiamento relativo nella soluzione sia molto grande. Nel secondo caso, quasi tutte le perturbazioni saranno vicine in direzione di un vettore singolare con valore singolare 1 e la variazione relativa nella soluzione sarà piccola. 1×10101

PS (aggiunto più tardi dopo che sono tornato dalla lezione di yoga ...)

La formula per la soluzione di èAΔx=Δb

Δx=VΣ1UTΔb=i=1nUiTΔbσiVi

By the Pythagorean theorem,

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

Se manteniamo , questa somma viene massimizzata quando Δ b = U n e minimizzata quando Δ b = U 1Δb2=1Δb=UnΔb=U1 .

Nella situazione considerata qui, è il risultato di errori di arrotondamento casuali, quindi i valori U T i Δ b dovrebbero avere tutti all'incirca la stessa grandezza. I termini con valori più piccoli di σ i contribuiranno molto all'errore, mentre i termini con valori più grandi di σ i non contribuiranno molto. A seconda dello spettro, questo potrebbe facilmente essere molto più piccolo del limite peggiore. ΔbUiTΔbσiσi


Wouldn't this argument imply that it is possible (even if unlikely) to reach the worst-case bound of κ(A) for the matrix in the example? AFAIU, based on my answer and based on ?getrs's documentation this shouldn't be possible.
Kirill

@BrianBorchers Could you please elaborate why "The worst case error occurs when Δb is a left singular vector of A corresponding to the smallest singular value of A. The best case occurs when Δb is a left singular vector of A corresponding to the largest singular value of A." holds? From the example below it is logical, but I would need some formulas. Let the SVD of A be A=UΣVT. In the first case, A=Δbσ1v1T+i=2NuiσiviT. How to proceed?
Zoltán Csáti

I haven't discussed round-off errors in the A matrix, but the general effect is similar- unless you get really unlucky in the round-off errors, you typically do somewhat better than the pessimistic worst-case bound.
Brian Borchers

(-1) The discussion of component-wise relative errors in the output is seriously misleading.
Kirill

1

tl;dr They reported a condition number, not necessarily the right condition number for the matrix, because there is a difference.

This is specific to the matrix and the right hand side vector. If you look at the documentation for *getrs, it says the forward error bound is

xx0xcond(A,x)ucond(A)u.
Here cond(A,x) is not quite the usual condition number κ(A), but rather
cond(A,x)=|A1||A||x|x,cond(A)=|A1||A|.
(Here inside the norm these are component-wise absolute values.) See, for example, Iterative refinement for linear systems and LAPACK by Higham, or Higham's Accuracy and Stability of Numerical Algorithms (7.2).

For your example, I took a pseudospectral differential operator for a similar problem with n=128, and there is in fact a big difference between |A1||A| and κ(A), I computed 7×103 and 2.6×107, which is enough to explain the observation that this happens for all right hand sides, because the orders of magnitudes roughly match what is seen in Table 3.1 (3-4 orders better errors). This doesn't work when I try the same for just a random ill-conditioned matrix, so it has to be a property of A.

An explicit example for which the two condition numbers don't match, which I took from Higham (7.17, p.124), due to Kahan is

(2111ϵϵ1ϵϵ),(2+2ϵϵϵ).
Another example I found is just the plain Vandermonde matrix on [1:10] with random b. I went through MatrixDepot.jl and some other ill-conditioned matrices also produce this type of result, like triw and moler.

Essentially, what's going on is that when you analyze the stability of solving linear systems with respect to perturbations, you first have to specify which perturbations you are considering. When solving linear systems with LAPACK, this error bound considers component-wise perturbations in A, but no perturbation in b. So this is different from the usual κ(A)=A1A, which considers normwise perturbations in both A and b.

Consider (as a counterexample) also what would happen if you don't make the distinction. We know that using iterative refinement with double precision (see link above) we can get the best possible forward relative error of O(u) for those matrices with κ(A)1/u. So if we consider the idea that linear systems can't be solved to accuracy better than κ(A)u, how would refining solutions possibly work?

P.S. It matters that ?getrs says the computed solution is the true solution of (A + E)x = b with a perturbation E in A, but no perturbation in b. Things would be different if perturbations were allowed in b.

Edit To show this working more directly, in code, that this is not a fluke or a matter of luck, but rather the (unusual) consequence of two condition numbers being very different for some specific matrices, i.e.,

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

Edit 2 Here is another example of the same phenomenon where the different conditions numbers unexpectedly differ by a lot. This time,

cond(A,x)cond(A)κ(A).
Here A is the 10×10 Vandermonde matrix on 1:10, and when x is chosen randomly, cond(A,x) is noticably smaller than κ(A), and the worst case x is given by xi=ia for some a.
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

Average case (almost 9 orders of magnitude better error):

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

Worst case (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

Edit 3 Another example is the Forsythe matrix, which is a perturbed Jordan block of any size of the form

A=(010000100001ϵ000).
This has A=1, A1=ϵ1, so κ(A)=ϵ1, but |A1|=A1=|A|1, so cond(A)=1. And as can be verified by hand, solving systems of linear equations like Ax=b with pivoting is extremely accurate, despite the potentially unbounded κ(A). So this matrix too will yield unexpectedly precise solutions.

Edit 4 Kahan matrices are also like this, with 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

I numeri delle condizioni nel documento a cui fa riferimento l'OP sono numeri delle condizioni a due norme. Se torni al riferimento [17] di ElBarbary, vedrai che nel precedente documento si trattava di numeri di condizioni a due norme. Inoltre, ho installato gli esempi di questo documento usando DMsuite e ho ottenuto quasi esattamente gli stessi numeri di condizione a 2 norme riportati nel documento.
Brian Borchers,

I numeri di norma della condizione di infinito norm per questi esempi che ho ottenuto usando dmsuite e l'interpolazione di Chebyshev erano simili in grandezza ai numeri di condizione a due norme. Non penso che la differenza tra la 2-norma nei numeri di condizione della norma-infinito sia così importante per questo esempio particolare.
Brian Borchers,

Credo che gli errori riportati nel documento siano assoluti piuttosto che relativi (non fa molta differenza se non per ε=0.01, dove la soluzione scende vicino a 0.
Brian Borchers,

For ϵ=0.01 and N=1024, the relative errors for the parts of the solution that are near 0 are huge, but the absolute errors are small. I agree that the paper was very vague about what condition number was used and about what the "errors" were exactly (relative or absolute errors.)
Brian Borchers

@BrianBorchers I'm not sure what you mean: this isn't the difference between 2-norm and infty-norm condition numbers, but rather normwise- and component-wise condition numbers (component-wise relative perturbations in the input, not component-wise relative errors in the output as in your answer).
Kirill
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.