MN05: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Przykry (dyskusja | edycje)
mNie podano opisu zmian
Linia 1: Linia 1:


==Uwarunkowanie układu równań liniowych==
=Układy równań liniowych=


Zajmiemy się wrażliwością układu równań na zaburzenia danych: prawej strony i
Czasem zadania obliczeniowe wymagają wykonania naprawdę wielkiej liczby obliczeń
współczynników macierzy układu. Jak zobaczymu na poniższym przykładzie, bywają
zmiennoprzecinkowych, przy czym wiele znanych, <strong>matematycznie równoważnych</strong> metod
równania, które są mało podatne na zaburzenia danych (a więc: dobrze
rozwiązywania takich zadań, ma <strong>diametralnie różne własności numeryczne</strong>.
uwarunkowane) oraz równania, które są szalenie wrażliwe na zaburzenia, a więc
Bardzo ważną klasą takich zadań jest rozwiązywanie układów równań liniowych
źle uwarunkowane. Jak wkrótce się przekonamy, czułość danego układu równań na
zaburzenia da się precyzyjnie scharakteryzować, a cecha ta nie tylko będzie
miała wpływ na jakość rozwiązań możliwych do uzyskania w arytmetyce skończonej
precyzji, ale także na efektywność metod iteracyjnych rozwiązywania
układów równań liniowych, w których są tysięce (lub więcej) niewiadomych.


<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<center><math>\displaystyle
<span  style="font-variant:small-caps;">Przykład: Uwarunkowanie układu dwóch równań liniowych</span>
Ax = b,
<div class="solution">
</math></center>


Rozwiązanie układu dwóch równań liniowych można przedstawić w formie graficznej:
gdzie <math>\displaystyle A</math> jest nieosobliwą macierzą <math>\displaystyle N\times N</math>, a dany wektor prawej strony <math>\displaystyle b\in R^N</math>.  
jest to punkt przecięcia się dwóch prostych wyznaczonych przez dane
wspólczynniki i wyrazy prawej strony.


[[Image:MNlinearcond.png|thumb|300px|Rozważmy pewien nieosobliwy układ dwóch równań
W
liniowych. Ma on dokładnie jedno rozwiązanie, oznaczone kolorem czerwonym. Co
praktyce spotyka się zadania z <math>\displaystyle N = 2, 3, \ldots 1000</math>. Zdarzają się także czaem
się stanie, gdy trochę zaburzymy prawą stronę takiego układu?]]
specjalne macierze o wymiarach nawet rzędu <math>\displaystyle 10^8</math>!


[[Image:MNlinearcond1.png|thumb|300px|Wykresy zaburzonych prostych mogą zająć jedną z
Rozwiązywanie układów równań liniowych jest sercem wielu innych algorytmów
zaznaczonych łososiowym kolorem pozycji.]]
numerycznych, dlatego nie dziwi, że szacuje się, że około 75 procent czasu
obliczeniowego superkomputerów jest wykorzystywanych właśnie na rozwiązywanie
takich zadań.


[[Image:MNlinearcond2.png|thumb|300px|Obszar, gdzie mogą znaleźć się rozwiązania zaburzonego
Okazuje się, że kilka znanych w matematyce sposobów rozwiązywania układów równań
układu, zaznaczyliśmy na czerwono. Jest on, kolokwialnie rzecz ujmując, z
liniowych, takie jak:
grubsza tak
* metoda wyznacznikowa (wzory Cramera)
wielki jak wielkie były zaburzenia, co zgodne jest z typową intuicją "człowieka
* obliczenie macierzy <math>\displaystyle A^{-1}</math> i następnie <math>\displaystyle x = A^{-1}b</math>
z zewnątrz". ]]
 
<strong>nie nadają się</strong> do numerycznego rozwiązywania takich zadań.
[[Image:MNlinearcond3.png|thumb|300px|Jednak bywają
równania, wrażliwe jak mimoza na nawet delikatne zaburzenia danych. Takie
równanie własnie widzimy na rysunku: jego cechą szczególną jest to, że tym razem
proste, choć wciąż przecinają się dokładnie w jednym punkcie, są ''prawie''
równoległe.]]


[[Image:MNlinearcond4.png|thumb|300px|Bierzemy zaburzenia takie same jak poprzednio. Wykresy zaburzonych prostych mogą zająć jedną z
O tym, jak <strong>skutecznie</strong> rozwiązywać takie zadania, jakie jest ich
zaznaczonych łososiowym kolorem pozycji.]]
uwarunkowanie --- o tym traktują następne dwa wykłady. Okaże się, że jedną z
dobrych metod jest metoda eliminacji Gaussa.


[[Image:MNlinearcond5.png|thumb|300px|Tym razem, obszar niepewności, gdzie mogą być
==Proste układy równań==
rozwiązania naszego zaburzonego układu, jest ''gigantyczny''!]]


</div></div>
Niektóre układy równań można bardzo łatwo rozwiązać. Zgodnie z zasadą


A więc równania liniowe mogą, choć nie muszą, być bardzo podatne na zaburzenia
<blockquote  style="background-color:#fefeee"> 
danych. Gdy zamiast prawej strony, zaburzymy wyrazy macierzy układu, może nawet
Trudne zadania rozwiązujemy sprowadzając je do sekwencji łatwych zadań
okazać się, że dostaniemy układ równań sprzecznych (czy możesz podać przykład?)
</blockquote>


Aby przedstawić ogólną teorię zaburzeń dla układów równań liniowych, musimy mieć
w dalszej kolejności pokażemy, jak dowolny układ równań sprowadzić do sekwencji
narzędzia do pomiaru błędu rozwiązań, a także zaburzeń danych zadania: czyli
dwóch (czasem trzech) łatwych do rozwiązania układów równań. Ale... jakie układy
macierzy i wektora prawej strony. Temu będą służyć normy.
równań są "łatwe"?


===Normy wektorowe i macierzowe===
====Układy z macierzą trójkątną====


Aby badać odległość między rozwiązaniem dokładnym układu równań, a jego
Rozważmy układ z macierzą
wartością przybliżoną uzyskaną np. algorytmem eliminacji Gaussa, będziemy
trójkątną <math>\displaystyle A</math>. Będą nas szczególnie interesować macierze
posługiwać się normami wektorów
<strong>trójkątne górne</strong>, dla których <math>\displaystyle a_{i,j}=0</math> gdy <math>\displaystyle i>j</math>, oraz
<math>\displaystyle x = (x_j)_{j=1}^n\inR^n</math>  
macierze <strong>trójkątne dolne</strong> z jedynkami na przekątnej, tzn.
i macierzy <math>\displaystyle A = (a_{i,j})_{i,j=1}^n \in R^{n\times n}</math>.  
<math>\displaystyle a_{i,j}=0</math>, <math>\displaystyle i<j</math>, oraz <math>\displaystyle a_{i,i}=1</math>. Macierze pierwszego rodzaju
Najczęściej używanymi normami wektorowymi będą
będziemy oznaczać przez <math>\displaystyle U</math>, a drugiego rodzaju przez <math>\displaystyle L</math>.
normy <math>\displaystyle p</math>-te,


<center><math>\displaystyle \| x\|\,=\,\| x\|_p\,=\,
<center><math>\displaystyle L = \begin{pmatrix}
  \left(\sum_{j=1}^n |x_j|^p\right)^{1/p},
1 &  &  &        &  &  \\
  \qquad 1\le p< +\infty,
* & 1 &  &        &  &  \\
* & * & 1 &        &  &  \\
* & * & * & 1 &  &        \\
\vdots  & \vdots  & \vdots  & \ddots  & \ddots &  \\
*  &  *  & * &  \cdots  &  *    & 1  
\end{pmatrix} ,  
\qquad  
U = \begin{pmatrix}
* & * & * & *      & \cdots & * \\
  & * & * & *      & \cdots & * \\
  &  & * & *      & \cdots & * \\
  &  &        & * & \ddots &  \vdots \\
  &  &  &        & \ddots & * \\
  &  &  &        &        & * \end{pmatrix}
</math></center>
</math></center>


oraz
Układ z nieosobliwą macierzą trójkątną górną


<center><math>\displaystyle \| x\|_\infty\,=\,\lim_{p\to +\infty}\| x\|_p\,=\,
<center><math>\displaystyle  
    \max_{1\le j\le n}|x_j|.
  U\, x\;=\; c,
</math></center>
</math></center>


[[Image:MNball1.png|thumb|300px|Kula jednostkowa w normie <math>\displaystyle ||\cdot||_1</math> w <math>\displaystyle R^2</math>]]
<math>\displaystyle U=(u_{i,j})</math>, <math>\displaystyle c=(c_j)</math>, można rozwiązać stosując algorytm:
[[Image:MNball2.png|thumb|300px|Kula jednostkowa w normie <math>\displaystyle ||\cdot||_2</math> w <math>\displaystyle R^2</math>]]
[[Image:MNballinf.png|thumb|300px|Kula jednostkowa w normie <math>\displaystyle ||\cdot||_\infty</math> w <math>\displaystyle R^2</math>]]


Normą macierzową jest norma euklidesowa (zwana też normą Frobeniusa)
{{algorytm|Podstawienie w tył||
<pre>


<center><math>\displaystyle \|A\|_E\,=\,\sqrt{\sum_{i,j=1}^n |a_{i,j}|^2},
<math>\displaystyle x_N^*\, =\, c_N / u_{N,N}</math>;
</math></center>
for (i = N-1; i >= 1; i--)
<math>\displaystyle x_i^*\,:=\,\left( c_i\,-\, \sum_{j=i+1}^N
u_{i,j}x_j^*\right)/u_{i,i}</math>;
</pre>}}


a także normy ''indukowane'' przez normy wektorowe (np. przez
(Algorytm ten jest wykonalny, ponieważ nieosobliwość macierzy
normy <math>\displaystyle p</math>-te)
implikuje, że <math>\displaystyle u_{i,i}\ne 0</math>, <math>\displaystyle \forall i</math>.) Podobnie, układ
<math>\displaystyle L x= c</math> rozwiązujemy algorytmem:


<center><math>\displaystyle \|A\|\,=\,\sup_{x\ne 0}\frac{\|A x\|}{\| x\|}\,=\,
{{algorytm|Podstawienie w przód||
      \sup_{\|x\|=1}\|A x\|.
<pre>
</math></center>


Jeśli norma macierzowa jest indukowana przez normę wektorową,  
<math>\displaystyle x_1 = c_1</math>;
to dla dowolnego wektora mamy
for (i=2; i <= N; i++)
<math>\displaystyle x_i = c_i\,-\,\sum_{j=1}^{i-1} l_{i,j} x_j^*</math>;
</pre>}}


<center><math>\displaystyle \|A x\|\,\le\,\|A\|\| x\|. 
Oba algorytmy wymagają rzędu <math>\displaystyle N^2/2</math> mnożeń lub dzieleń i
</math></center>
<math>\displaystyle N^2/2</math> dodawań lub odejmowań, a więc łącznie <math>\displaystyle O(N^2)</math>
działań arytmetycznych.


Przypomnijmy, że w przestrzeniach liniowych skończenie wymiarowych
====Układy z macierzą ortogonalną====
(a więc także w <math>\displaystyle R^n</math> i w przestrzeni macierzy wymiaru <math>\displaystyle n\times n</math>)
każde dwie normy są równoważne. To znaczy, że jeśli mamy dwie
normy <math>\displaystyle \|\cdot\|</math> i <math>\displaystyle \|\cdot\|'</math> w przestrzeni skończenie wymiarowej
<math>\displaystyle X</math>, to istnieją stałe <math>\displaystyle 0<K_1\le K_2<\infty</math> takie, że


<center><math>\displaystyle K_1\,\|x\|\,\le\,\|x\|'\,\le\,K_2\,\|x\|,\qquad\forall x\in X.
Równie tanio można rozwiązać układ równań
</math></center>
 
W szczególności dla <math>\displaystyle  x\inR^n</math> mamy
 
<center><math>\displaystyle \aligned \| x\|_\infty &\le & \| x\|_1\,\le\,
        n\,\| x\|_\infty, \\
  \| x\|_\infty &\le & \| x\|_2\,\le\,
        \sqrt{n}\,\| x\|_\infty,\\
  \frac 1{\sqrt n}\,\| x\|_1 &\le & \| x\|_2\,\le\,
        \| x\|_1,
\endaligned</math></center>
 
a dla <math>\displaystyle A=(a_{i,j})_{i,j=1}^n</math> mamy


<center><math>\displaystyle  
<center><math>\displaystyle  
  \|A\|_2\, \le\, \|\,|A|\,\|_2 \,\le\, \|A\|_E
Q x =  b,
    \,\le\, \sqrt n\, \|A\|_2,
</math></center>
</math></center>


gdzie <math>\displaystyle |A|=(|a_{i,j}|)_{i,j=1}^n</math>.
gdy <math>\displaystyle Q</math> jest macierzą ortogonalną, to znaczy <math>\displaystyle Q^TQ = I</math>. Rzeczywiście, z
ortogonalności mamy natychmiast, że


Dla macierzy
<center><math>\displaystyle  
<math>\displaystyle A=(a_{i,j})_{i.j=1}^n\inR^{n\times n}</math> mamy
x = Q^T  b
 
<center><math>\displaystyle \|A\|_\infty \,=\, \max_{1\le i\le n}\sum_{j=1}^n |a_{i,j}|
</math></center>
</math></center>


oraz
i w konsekwencji <math>\displaystyle x</math> można wyznaczyć kosztem takim jak koszt mnożenia macierzy
przez wektor, czyli <math>\displaystyle O(N^2)</math> operacji.


<center><math>\displaystyle \|A\|_1 \,=\, \|A^T\|_\infty \,=\,
Podobnie, gdy <math>\displaystyle Q\in C^{N\times N}</math> jest unitarna, to znaczy <math>\displaystyle Q^HQ = I</math>,
        \max_{1\le j\le n}\sum_{i=1}^n |a_{i,j}|.
rozwiązaniem układu równań jest
</math></center>


Dowód tego faktu zostawiamy jako ćwiczenie.
<center><math>\displaystyle  
 
  x = Q^H b.
===Uwarunkowanie===
 
Wyprowadzimy teraz wynik świadczący o tym, jak zaburzenie względne danych
przenosi się na błąd względny wyniku rozwiązania układu równań liniowych <math>\displaystyle Ax=b</math>.
 
{{twierdzenie|O uwarunkowaniu układu równań||
 
Niech <math>\displaystyle E</math> i <math>\displaystyle  e</math> będą zaburzeniami
odpowiednio macierzy <math>\displaystyle A</math> i wektora <math>\displaystyle b</math> takimi, że
 
<center><math>\displaystyle \|E\|\,\le\,\epsilon\|A\|\qquad \mbox{i} \qquad
  \| e\|\,\le\,\epsilon\| b\|,
</math></center>
</math></center>


Jeśli
==Metoda eliminacji Gaussa==
 
<center><math>\displaystyle \epsilon\cdot \mbox{cond} (A)\,<\,1
</math></center>


to układ zaburzony <math>\displaystyle (A+E) x=( b+ e)</math> ma jednoznaczne
[[grafika:Gauss.jpg|thumb|right||Carl Friedrich Gauss<br[[Biografia Gauss|Zobacz biografię]]]]
rozwiązanie <math>\displaystyle z^*</math> spełniające


<center><math>\displaystyle \| z^*- x^*\|\;\le\;
W przypadku dowolnych macierzy, bardzo dobrym algorytmem numerycznym
  \mbox{Const} \cdot\epsilon\cdot\frac{ \mbox{cond} (A)}{1-\epsilon \mbox{cond} (A)}
rozwiązywania układu równań
  \| x^*\|,
</math></center>


gdzie definiujemy współczynnik uwarunkowania układu
<center><math>\displaystyle Ax=b</math></center>


<center><math>\displaystyle \mbox{cond} (A) = ||A||\cdot ||A^{-1}||.
okazuje się popularna
eliminacja Gaussa. Jednak z powodów, które będą dla nas później jasne, algorytm
ten wyrazimy w języku tzw. <strong>rozkładu LU</strong> macierzy, to znaczy,
sprowadzającego zadanie do znalezienia
macierzy trójkątnej dolnej <math>\displaystyle L</math> (z jedynkami na diagonali) oraz trójkątnej górnej
<math>\displaystyle U</math> takich, że
<center><math>\displaystyle
A = LU,
</math></center>
</math></center>


}}
a następnie rozwiązania sekwencji dwóch układów równań z macierzami trójkątnymi:


Zauważmy najpierw, że zachodzi
{{algorytm|Rozwiązanie układu z wykorzystaniem rozkładu LU||
<pre>


{{lemat|von Neumanna o otwartości zbioru macierzy odwracalnych||
Znajdź rozkład <math>\displaystyle A=LU</math>;
Rozwiąż <math>\displaystyle Ly = b</math> przez podstawienie w przód;
Rozwiąż <math>\displaystyle Ux = y</math> przez podstawienie w tył;
</pre>}}


Jeśli <math>\displaystyle F</math> jest macierzą
Przypuśćmy, że taki rozkład <math>\displaystyle A=LU</math> istnieje. Wówczas, zapisując macierze w postaci
taką, że <math>\displaystyle \|F\|<1</math> to macierz <math>\displaystyle (I-F)</math> jest nieosobliwa oraz
blokowej, eksponując pierwszy wiersz i pierwszą kolumnę zaangażowanych macierzy,
mamy


<center><math>\displaystyle \| (I-F)^{-1} \|\,\le\,\frac{1}{1-\|F\|}.
<center><math>\displaystyle  
\begin{pmatrix}
a_{11} & a_{12}^T\\
a_{21} & A_{22}
\end{pmatrix}
=
\begin{pmatrix}
1 & 0^T\\
l_{21} & L_{22}
\end{pmatrix}
\begin{pmatrix}
u_{11} & u_{12}^T\\
0 & U_{22},
\end{pmatrix}  
</math></center>
</math></center>


}}
skąd (mnożąc blokowo macierz <math>\displaystyle L</math> przez <math>\displaystyle U</math>) wynika, że
* <math>\displaystyle u_{11} = a_{11}</math> oraz <math>\displaystyle u_{12} = a_{12}</math>, więc pierwszy wiersz <math>\displaystyle U</math> jest
kopią pierwszego wiersza <math>\displaystyle A</math>,
* <math>\displaystyle l_{21} = a_{21}/u_{11}</math>, więc pierwsza kolumna <math>\displaystyle L</math> powstaje przez
podzielenie wszystkich elementów wektora <math>\displaystyle a_{21}</math> przez element na diagonali
<math>\displaystyle a_{11}</math>,
* <math>\displaystyle A_{22} - l_{21}u_{12}^T = L_{22}U_{22}</math>, a więc znalezienie podmacierzy
<math>\displaystyle L_{22}</math> oraz <math>\displaystyle U_{22}</math> sprowadza się do znalezienia rozkładu LU zmodyfikowanego
bloku <math>\displaystyle A_{22}</math> macierzy <math>\displaystyle A</math>,
wymiaru <math>\displaystyle (N-1)\times (N-1)</math>.
Dostajemy więc algorytm rekurencyjny, jednak ze względu na to, że wywołanie
rekurencji następuje na końcu każdej iteracji, można rozwinąć korzystająć z
klasycznych pętli. Jest to ważne w praktyce numerycznej, gdyż rekurencja
kosztuje: zarówno pamięć, jak i czas.


{{dowod|||
Ponadto zauważmy, że opisany algorytm możemy wykonać w miejscu, nadpisując
Rzeczywiście, gdyby <math>\displaystyle (I-F)</math> była osobliwa to istniałby niezerowy
elementy <math>\displaystyle A</math> elementami macierzy <math>\displaystyle U</math> i <math>\displaystyle L</math> (jedynek z diagonali <math>\displaystyle L</math> nie musimy
wektor <math>\displaystyle x</math> taki, że <math>\displaystyle (I-F) x=0</math>, co implikuje
pamiętać, bo wiemy ''a priori'', że tam są).
<math>\displaystyle \|F x\|/\| x\|=1</math> i w konsekwencji <math>\displaystyle \|F\|\ge 1</math>. Aby
pokazać oszacowanie normy macierzy <math>\displaystyle (I-F)^{-1}</math> zauważmy, że  


<center><math>\displaystyle \aligned 1 &= \|I\|\,=\,\|(I-F)(I-F)^{-1}\| \\ &\ge &
{{algorytm|Rozkład LU metodą eliminacji Gaussa||
    \|(I-F)^{-1}\|\,-\,\|F\|\,\|(I-F)^{-1}\| \\
<pre>
    &= (1-\|F\|)\,\|(I-F)^{-1}\|,
\endaligned</math></center>


skąd już wynika dowodzona nierówność.
for k=1:N-1
}}
if <math>\displaystyle a_{kk}</math> == 0
STOP;
end
for i=k+1:N /* wyznaczenie <math>\displaystyle k</math>-tej kolumny <math>\displaystyle L</math> */
<math>\displaystyle a_{ik}</math> = <math>\displaystyle a_{ik}/a_{ii}</math>;
end
for j=k+1:N /* modyfikacja podmacierzy <math>\displaystyle A_{22} = A_{22} - l_{21}u_{12}^T</math> */
for i=k+1:N
<math>\displaystyle a_{ij}</math> -= <math>\displaystyle a_{ik}a_{kj}</math>;
end
end
end
</pre>}}


{{dowod|twierdzenia o uwarunkowaniu||
Łatwo przekonać się, że <math>\displaystyle k</math>-ty obrót zewnętrznej pętli (tzn. <math>\displaystyle k</math>-ty krok
algorytmu rozkładu LU) kosztuje rzędu <math>\displaystyle 2(N-k)^2</math> operacji arytmetycznych, skąd łączny koszt tego
algorytmu rozkładu LU wynosi około <math>\displaystyle \frac{4}{3}N^3</math>.


Po podstawieniu <math>\displaystyle F=-A^{-1}E</math> mamy teraz
Jeśli więc wykorzystać rozkład LU do rozwiązywania układu równań <math>\displaystyle Ax=b</math>, to mamy
 
następujące zestawienie kosztów:
<center><math>\displaystyle \|F\|\,\le\,\|A^{-1}\|\,\|E\|\,\le\,\epsilon\|A\|\,\|A^{-1}\|\,<\,1,
* Koszt znalezienia rozkładu <math>\displaystyle A=LU</math>: <math>\displaystyle O(N^3)</math>;
</math></center>
* Koszt rozwiązania układu <math>\displaystyle Ly=b</math>: <math>\displaystyle O(N^2)</math>;
 
* Koszt rozwiązania układu <math>\displaystyle Ux=y</math>: <math>\displaystyle O(N^2)</math>.
co wobec równości <math>\displaystyle A+E=A(I+A^{-1}E)</math> daje, że macierz <math>\displaystyle (A+E)</math>  
jest nieosobliwa i układ zaburzony ma jednoznaczne rozwiązanie
Tak więc, gdy znany już jest rozkład LU macierzy, koszt rozwiązania równania
<math>\displaystyle z^*</math>. Przedstawmy to rozwiązanie w postaci
wynosi już tylko <math>\displaystyle O(N^2)</math>.
<math>\displaystyle z^*= x^*+( z^*- x^*)</math>. Rozpisując układ
zaburzony i wykorzystując równość <math>\displaystyle A x^*= b</math> otrzymujemy,  
że <math>\displaystyle (A+E)( z^*- x^*)= e\,-\,E x^*</math>, czyli 


<center><math>\displaystyle z^*- x^* \,=\, (I+A^{-1}E)^{-1}A^{-1}( e-E x^*),
{{uwaga|Złożoność obliczeniowa zadania rozwiązania układu równań liniowych||
</math></center>


a stąd
Z powyższego wynika, że łączny koszt rozwiązania równania liniowego wynosi
<math>\displaystyle O(N^3)</math>. Można zastanawiać się, jaka jest <strong>najmniejsza możliwa</strong> liczba
operacji zmiennoprzecinkowych potrzebnych do rozwiązania układu równań
liniowych.


<center><math>\displaystyle \aligned \| z^*- x^*\| &\le & \|(I+A^{-1}E)^{-1}\|\,\|A^{-1}\| \,
Można pokazać,  że minimalny koszt rozwiązania układu <math>\displaystyle N</math> równań
      (\| e\|+\|E\|\,\| x^*\| \\
liniowych nie może być wyższego rzędu niż minimalny koszt mnożenia dwóch
  &\le & \frac{\|A^{-1}\|}{1-\epsilon\|A\|\,\|A^{-1}\|}
macierzy <math>\displaystyle N\times N</math>. Tymczasem znany jest całkiem prosty algorytm rekurencyjny,
      \epsilon\left(\| b\|+\|A\|\,\| x^*\|\right) \\
wyznaczający iloczyn dwóch macierzy kosztem <math>\displaystyle 4.7\cdot N^{log_27} \approx 4.7
  &\le & \frac{\|A\|\,\|A^{-1}\|}{1-\epsilon\|A\|\,\|A^{-1}\|}
\cdot N^{2.807}</math> (algorytm Strassena). Bardziej skomplikowany (i praktycznie
      2\epsilon\cdot\| x^*\|,
nieimplementowalny) algorytm Coppersmitha i Winograda daje nawet koszt
\endaligned</math></center>
<math>\displaystyle O(N^{2.376})</math>.  Tak więc równania liniowe daje się (teoretycznie) rozwiązać
kosztem <math>\displaystyle O(N^{2.376})</math>.


co kończy dowód.  
Jednak w praktyce nawet prosty algorytm Strassena zazwyczaj nie jest stosowany.
Wynika to stąd, że ma trochę gorsze własności numeryczne oraz, co istotniejsze, wymaga dużo
dodatkowej pamięci na przechowywanie pośrednich wyników.
}}
}}


Gdy więc np. <math>\displaystyle \epsilon  \mbox{cond} (A) \leq \frac{1}{2}</math>, powyższe oszacowanie możemy
==Wybór elementu głównego==
zastąpić czytelniejszym (choć mniej precyzyjnym)
 
<center><math>\displaystyle \frac{\| z^*- x^*\|}{\| x^*\|} \leq 4  \mbox{cond} (A)\epsilon.
</math></center>
 
Octave i MATLAB mają wbudowane funkcje wyznaczające normy wektorów i macierzy
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
N <nowiki>=</nowiki> 3;
x <nowiki>=</nowiki> [1:N]'
A <nowiki>=</nowiki> pascal(N)
norm(A,1)
norm(x,2)
norm(A,Inf)
</pre></div>
a także funkcje wyznaczające uwarunkowanie macierzy, przy czym Octave liczy
tylko uwarunkowanie w normie <math>\displaystyle ||\cdot||_2</math>:
 
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
cond(A)
</pre></div>
W LAPACKu służy do tego funkcja <code>DGECON</code>.
 
W praktyce obliczeniowej trafiają się zarówno układy dobrze uwarunkowane, jak i
macierze, których uwarunkowanie może być patologicznie duże (np. takie macierze
są chlebem powszednim osób rozwiązujących równania różniczkowe). Przykładem takiej
macierzy o uwarunkowaniu bardzo szybko rosnącym z wymiarem jest m.in.


<div style="margin-top:1em; padding-top,padding-bottom:1em;">
Opisany powyżej algorytm rozkładu LU niestety czasem może się załamać: gdy
<span  style="font-variant:small-caps;">Przykład: Macierz Hilberta</span>
napotka w czasie działania zerowy element na diagonali zmodyfikowanej
<div class="solution">
podmacierzy, np. chociaż macierz


Niech <math>\displaystyle H_N = (h_{ij})_{i,j=1}^N</math>, gdzie
<center><math>\displaystyle  
<center><math>\displaystyle  
h_{ij} = \frac{1}{i+j-1},
A = \begin{pmatrix} 0 & 1\\ 1 & 0
\end{pmatrix}  
</math></center>
</math></center>


[[Image:MNhilbertmatrix.png|thumb|300px|Macierz Hilberta wymiaru 25]]
jest ewidentnie nieosobliwa, to nasz algorytm nawet nie ruszy z miejsca, bo od
razu zetknie się z dzieleniem przez <math>\displaystyle a_{11}=0</math>. Ale wystarczy zamienić ze sobą
kolejnością wiersze macierzy <math>\displaystyle A</math> (to znaczy, w układzie równań, zamienić ze sobą
miejscami równania), a dostajemy macierz, dla której algorytm przejdzie bez
problemu.


Taką macierz możemy wygenerować w Octave komendą <code>hilb(N)</code>.
W praktyce obliczeniowej, aby uzyskać algorytm o [[|Dodaj link: możliwie dobrych własnościach
Wtedy <math>\displaystyle \mbox{cond} (H_N) \approx  O(e^{3.5N})</math> , np.
numerycznych]], wykorzystujemy tzw. strategię <strong>wyboru elementu głównego w
 
kolumnie</strong>.
<div class="output" style="background-color:#e0e8e8; padding:1em"><pre>
Polega to na tym, że zanim wykonamy <math>\displaystyle k</math>-ty krok algorytmu rozkładu LU,
* szukamy w pierwszej kolumnie podmacierzy <math>\displaystyle A(k:N,k:N)</math> szukamy elementu o
octave:2> cond(hilb(5))
największym module (taki element, na mocy założenia nieosobliwości macierzy,
ans <nowiki>=</nowiki> 4.7661e+05
jest niezerowy) --- to jest właśnie element główny
octave:3> cond(hilb(10))
* zamieniamy ze sobą wiersz <math>\displaystyle A(k,1:N)</math> z wierszem, w którym
ans <nowiki>=</nowiki>  1.6025e+13
znajduje się element główny
octave:4> cond(hilb(15))
* zapamiętujemy dokonaną permutację, bo potem --- gdy już przyjdzie do
ans <nowiki>=</nowiki> 3.7689e+17
rozwiązywania układu równań --- będziemy musieli dokonać
octave:5> cond(hilb(20))
analogicznej permutacji wektora prawej strony
ans <nowiki>=</nowiki>  7.1209e+19
</pre></div>
   
   
Jest to więc bardzo wdzięczna macierz do prowadzenia testów...
Wynikiem takiego algorytmu jest więc rozkład
</div></div>


Zadanie wyznaczania uwarunkowania macierzy jest zadaniem bardzo intensywnym
<center><math>\displaystyle PA = LU,
numerycznie, a problem, czy da się je wyznaczyć z dobrą dokładnością kosztem
</math></center>
niższym niż wyznaczenie macierzy odwrotnej i jej normy, jest wciąż otwarty.


===Numeryczna poprawność eliminacji Gaussa===
gdzie <math>\displaystyle P</math> jest pewną (zerojedynkową) macierzą permutacji (tzn. macierzą
identyczności z przepermutowanymi wierszami).


Przedstawimy bez dowodu klasyczne twierdzenie o "praktycznej numerycznej
Oprócz wyboru elementu głównego w kolumnie, stosuje się czasem inne strategie,
poprawności" eliminacji Gaussa z wyborem w kolumnie.
m.in. wybór w kolumnie oraz tzw. <strong>wybór pełny</strong>, gdy elementu głównego szukamy w
<strong>całej</strong> podmacierzy <math>\displaystyle A(k:N,k:N)</math>, co znacznie zwiększa liczbę porównań
niezbędnych do wskazania elementu głównego, ale też trochę poprawia własności
numeryczne takiego algorytmu.


{{twierdzenie|Wilkinsona||
W praktyce całą informację o wykonanych permutacjach przechowujemy nie w
zerojedynkowej macierzy j.w. ale w jednym wektorze.


Algorytm eliminacji Gaussa z wyborem elementu głównego w kolumnie, zrealizowany
{{algorytm|Rozkład LU z wyborem elementu głównego w kolumnie||
w arytmetyce <math>\displaystyle fl_\nu</math>, wyznacza
<pre>
<math>\displaystyle \widetilde{x}</math>  taki, że  <math>\displaystyle \widetilde{x}</math> jest ''dokładnym'' rozwiązaniem
zadania zaburzonego


<center><math>\displaystyle \widetilde{A}\widetilde{x} = b,
P = 1:N; /* tu zapamiętujemy wykonane permutacje */
</math></center>
for k=1:N-1
w wektorze A(k:N,k) znajdź element główny <math>\displaystyle a_{pk}</math>;
zamień ze sobą wiersze A(k,1:N) i A(p,1:N);
P(k) = p; P(p) = k;
if <math>\displaystyle a_{kk}</math>
STOP: macierz osobliwa!
end
/* kontunuuj tak jak w algorytmie bez wyboru */
for i=k+1:N /* wyznaczenie <math>\displaystyle k</math>-tej kolumny <math>\displaystyle L</math> */
<math>\displaystyle a_{ik}</math> = <math>\displaystyle a_{ik}/a_{ii}</math>;
end
for j=k+1:N /* modyfikacja podmacierzy <math>\displaystyle A_{22} = A_{22} - l_{21}u_{12}^T</math> */
for i=k+1:N
<math>\displaystyle a_{ij}</math> -= <math>\displaystyle a_{ik}a_{kj}</math>;
end
end
end
</pre>}}


gdzie
<div class="thumb tright"><div><flash>file=Macierz.swf</flash><div.thumbcaption>Eliminacja Gaussa z wyborem elementu głównego</div></div></div>


<center><math>\displaystyle ||A-\widetilde{A}||_\infty \leq  \mbox{Const}  N^3 \rho_N \cdot
Poniżej zapisujemy algorytm rozwiązania układu równań, gdy znany jest
||A||_\infty\nu,
już rozkład LU wykonany z wyborem w kolumnie.
</math></center>


dla pewnej niedużej stałej <math>\displaystyle  \mbox{Const}  = O(1)</math>, a <math>\displaystyle \widetilde{L}</math> i <math>\displaystyle \widetilde{U}</math> są
{{algorytm|Rozwiązywanie układu równań metodą eliminacji Gaussa z wyborem elementu głównego w kolumnie||
numerycznie wyznaczonymi czynnikami rozkładu PA<nowiki>=</nowiki>LU,
<pre>
natomiast <math>\displaystyle \rho_N = \frac{\max_{i,j}|\widetilde{u}_{ij}|}{\max_{i,j} |a_{ij}|}</math>.
}}


Jak widzimy, kluczowe dla numerycznej poprawności jest oszacowanie ''wskaźnika wzrostu'' <math>\displaystyle \rho_N</math>. Okazuje się, co wiedział już Wilkinson, że
znajdź rozkład <math>\displaystyle PA = LU</math>;
* w najgorszym przypadku, <math>\displaystyle \rho_N \leq 2^{N-1}</math> i jest osiągane dla macierzy
rozwiąż względem <math>\displaystyle y</math> układ z macierzą górną trójkątną <math>\displaystyle Uy = Pb</math>;
rozwiąż względem <math>\displaystyle x</math> układ z macierzą dolną trójkątną <math>\displaystyle Lx = y</math>;
</pre>}}


<center><math>\displaystyle W = \begin{pmatrix}
Dla niektórych ważnych klas macierzy wiadomo, że rozkład LU jest wykonalny <strong>bez wyznaczania elementu głównego</strong>, co istotnie może zmniejszyć całkowity czas
1 & & & 1 \\
działania algorytmu. Jest tak m.in. dla macierzy
-1 & \ddots & & \vdots\\
* symetrycznych, dodatnio określonych: <math>\displaystyle A=A^T</math> oraz <math>\displaystyle x^TAx > 0</math>, <math>\displaystyle \forall x
\vdots &  & \ddots  & \vdots\\
\neq 0</math>,
-1 & \cdots & -1 & 1\\
* silnie diagonalnie dominujących: macierz <math>\displaystyle A</math> (lub <math>\displaystyle A^T</math>) spełnia


\end{pmatrix}  
<center><math>\displaystyle |a_{ii}| > \sum_{j\neq i} |a_{ij}|, \qquad \forall i.
</math></center>
</math></center>
* dla macierzy trójdiagonalnych lub diagonalnie dominujących, lub dla
macierzy symetrycznych dodatnio określonych,  <math>\displaystyle \rho_N \leq 2</math>
* w średnim przypadku, obserwuje się <math>\displaystyle \rho_N \leq N^{2/3}</math>, to znaczy macierze
spotykane w praktyce obliczeniowej mają mały wskaźnik wzrostu.
Konkluzja jest więc taka, że algorytm eliminacji Gaussa z wyborem w kolumnie
jest ''praktycznie numerycznie poprawny''. Z drugiej strony, dla bardzo dużych
<math>\displaystyle N</math> i niezbyt dobrze uwarunkowanych macierzy, może okazać się, że arytmetyka
pojedynczej precyzji może okazać się niewystarczająca dla uzyskania godnego
wyniku.
Algorytm eliminacji Gaussa z pełnym wyborem elementu głównego jest już w pełni
numerycznie poprawny, ze wskaźnikiem wzrostu <math>\displaystyle \rho_N \leq \sqrt{n\cdot 2 \cdot
3^{1/2}\cdot 4^{1/3}\cdots N^{1/(N-1)}}</math>, a w praktyce grubo poniżej <math>\displaystyle \sqrt{N}</math>.

Wersja z 18:09, 1 wrz 2006

Układy równań liniowych

Czasem zadania obliczeniowe wymagają wykonania naprawdę wielkiej liczby obliczeń zmiennoprzecinkowych, przy czym wiele znanych, matematycznie równoważnych metod rozwiązywania takich zadań, ma diametralnie różne własności numeryczne. Bardzo ważną klasą takich zadań jest rozwiązywanie układów równań liniowych

Ax=b,

gdzie A jest nieosobliwą macierzą N×N, a dany wektor prawej strony bRN.

W praktyce spotyka się zadania z N=2,3,1000. Zdarzają się także czaem specjalne macierze o wymiarach nawet rzędu 108!

Rozwiązywanie układów równań liniowych jest sercem wielu innych algorytmów numerycznych, dlatego nie dziwi, że szacuje się, że około 75 procent czasu obliczeniowego superkomputerów jest wykorzystywanych właśnie na rozwiązywanie takich zadań.

Okazuje się, że kilka znanych w matematyce sposobów rozwiązywania układów równań liniowych, takie jak:

  • metoda wyznacznikowa (wzory Cramera)
  • obliczenie macierzy A1 i następnie x=A1b

nie nadają się do numerycznego rozwiązywania takich zadań.

O tym, jak skutecznie rozwiązywać takie zadania, jakie jest ich uwarunkowanie --- o tym traktują następne dwa wykłady. Okaże się, że jedną z dobrych metod jest metoda eliminacji Gaussa.

Proste układy równań

Niektóre układy równań można bardzo łatwo rozwiązać. Zgodnie z zasadą

Trudne zadania rozwiązujemy sprowadzając je do sekwencji łatwych zadań

w dalszej kolejności pokażemy, jak dowolny układ równań sprowadzić do sekwencji dwóch (czasem trzech) łatwych do rozwiązania układów równań. Ale... jakie układy równań są "łatwe"?

Układy z macierzą trójkątną

Rozważmy układ z macierzą trójkątną A. Będą nas szczególnie interesować macierze trójkątne górne, dla których ai,j=0 gdy i>j, oraz macierze trójkątne dolne z jedynkami na przekątnej, tzn. ai,j=0, i<j, oraz ai,i=1. Macierze pierwszego rodzaju będziemy oznaczać przez U, a drugiego rodzaju przez L.

L=(1*1**1***1****1),U=(***************)

Układ z nieosobliwą macierzą trójkątną górną

Ux=c,

U=(ui,j), c=(cj), można rozwiązać stosując algorytm:

Algorytm Podstawienie w tył



<math>\displaystyle x_N^*\, =\, c_N / u_{N,N}</math>;
for (i = N-1; i >= 1; i--)
	<math>\displaystyle x_i^*\,:=\,\left( c_i\,-\, \sum_{j=i+1}^N
	u_{i,j}x_j^*\right)/u_{i,i}</math>;

(Algorytm ten jest wykonalny, ponieważ nieosobliwość macierzy implikuje, że ui,i0, i.) Podobnie, układ Lx=c rozwiązujemy algorytmem:

Algorytm Podstawienie w przód



<math>\displaystyle x_1 = c_1</math>;
for (i=2; i <= N; i++)
	<math>\displaystyle x_i = c_i\,-\,\sum_{j=1}^{i-1} l_{i,j} x_j^*</math>;

Oba algorytmy wymagają rzędu N2/2 mnożeń lub dzieleń i N2/2 dodawań lub odejmowań, a więc łącznie O(N2) działań arytmetycznych.

Układy z macierzą ortogonalną

Równie tanio można rozwiązać układ równań

Qx=b,

gdy Q jest macierzą ortogonalną, to znaczy QTQ=I. Rzeczywiście, z ortogonalności mamy natychmiast, że

x=QTb

i w konsekwencji x można wyznaczyć kosztem takim jak koszt mnożenia macierzy przez wektor, czyli O(N2) operacji.

Podobnie, gdy QCN×N jest unitarna, to znaczy QHQ=I, rozwiązaniem układu równań jest

x=QHb.

Metoda eliminacji Gaussa

Carl Friedrich Gauss
Zobacz biografię

W przypadku dowolnych macierzy, bardzo dobrym algorytmem numerycznym rozwiązywania układu równań

Ax=b

okazuje się popularna eliminacja Gaussa. Jednak z powodów, które będą dla nas później jasne, algorytm ten wyrazimy w języku tzw. rozkładu LU macierzy, to znaczy, sprowadzającego zadanie do znalezienia macierzy trójkątnej dolnej L (z jedynkami na diagonali) oraz trójkątnej górnej U takich, że

A=LU,

a następnie rozwiązania sekwencji dwóch układów równań z macierzami trójkątnymi:

Algorytm Rozwiązanie układu z wykorzystaniem rozkładu LU



Znajdź rozkład <math>\displaystyle A=LU</math>;
Rozwiąż <math>\displaystyle Ly = b</math> przez podstawienie w przód;
Rozwiąż <math>\displaystyle Ux = y</math> przez podstawienie w tył;

Przypuśćmy, że taki rozkład A=LU istnieje. Wówczas, zapisując macierze w postaci blokowej, eksponując pierwszy wiersz i pierwszą kolumnę zaangażowanych macierzy, mamy

(a11a12Ta21A22)=(10Tl21L22)(u11u12T0U22,)

skąd (mnożąc blokowo macierz L przez U) wynika, że

  • u11=a11 oraz u12=a12, więc pierwszy wiersz U jest

kopią pierwszego wiersza A,

  • l21=a21/u11, więc pierwsza kolumna L powstaje przez

podzielenie wszystkich elementów wektora a21 przez element na diagonali a11,

  • A22l21u12T=L22U22, a więc znalezienie podmacierzy

L22 oraz U22 sprowadza się do znalezienia rozkładu LU zmodyfikowanego bloku A22 macierzy A, wymiaru (N1)×(N1).

Dostajemy więc algorytm rekurencyjny, jednak ze względu na to, że wywołanie rekurencji następuje na końcu każdej iteracji, można rozwinąć korzystająć z klasycznych pętli. Jest to ważne w praktyce numerycznej, gdyż rekurencja kosztuje: zarówno pamięć, jak i czas.

Ponadto zauważmy, że opisany algorytm możemy wykonać w miejscu, nadpisując elementy A elementami macierzy U i L (jedynek z diagonali L nie musimy pamiętać, bo wiemy a priori, że tam są).

Algorytm Rozkład LU metodą eliminacji Gaussa



for k=1:N-1
	if <math>\displaystyle a_{kk}</math> == 0 
		STOP;
	end
	for i=k+1:N /* wyznaczenie <math>\displaystyle k</math>-tej kolumny <math>\displaystyle L</math> */
		<math>\displaystyle a_{ik}</math> = <math>\displaystyle a_{ik}/a_{ii}</math>;
	end
	for j=k+1:N /* modyfikacja podmacierzy <math>\displaystyle A_{22} = A_{22} - l_{21}u_{12}^T</math> */
		for i=k+1:N 
			<math>\displaystyle a_{ij}</math> -= <math>\displaystyle a_{ik}a_{kj}</math>;
		end
	end
end

Łatwo przekonać się, że k-ty obrót zewnętrznej pętli (tzn. k-ty krok algorytmu rozkładu LU) kosztuje rzędu 2(Nk)2 operacji arytmetycznych, skąd łączny koszt tego algorytmu rozkładu LU wynosi około 43N3.

Jeśli więc wykorzystać rozkład LU do rozwiązywania układu równań Ax=b, to mamy następujące zestawienie kosztów:

  • Koszt znalezienia rozkładu A=LU: O(N3);
  • Koszt rozwiązania układu Ly=b: O(N2);
  • Koszt rozwiązania układu Ux=y: O(N2).

Tak więc, gdy znany już jest rozkład LU macierzy, koszt rozwiązania równania wynosi już tylko O(N2).

Uwaga Złożoność obliczeniowa zadania rozwiązania układu równań liniowych

Z powyższego wynika, że łączny koszt rozwiązania równania liniowego wynosi O(N3). Można zastanawiać się, jaka jest najmniejsza możliwa liczba operacji zmiennoprzecinkowych potrzebnych do rozwiązania układu równań liniowych.

Można pokazać, że minimalny koszt rozwiązania układu N równań liniowych nie może być wyższego rzędu niż minimalny koszt mnożenia dwóch macierzy N×N. Tymczasem znany jest całkiem prosty algorytm rekurencyjny, wyznaczający iloczyn dwóch macierzy kosztem 4.7Nlog274.7N2.807 (algorytm Strassena). Bardziej skomplikowany (i praktycznie nieimplementowalny) algorytm Coppersmitha i Winograda daje nawet koszt O(N2.376). Tak więc równania liniowe daje się (teoretycznie) rozwiązać kosztem O(N2.376).

Jednak w praktyce nawet prosty algorytm Strassena zazwyczaj nie jest stosowany. Wynika to stąd, że ma trochę gorsze własności numeryczne oraz, co istotniejsze, wymaga dużo dodatkowej pamięci na przechowywanie pośrednich wyników.

Wybór elementu głównego

Opisany powyżej algorytm rozkładu LU niestety czasem może się załamać: gdy napotka w czasie działania zerowy element na diagonali zmodyfikowanej podmacierzy, np. chociaż macierz

A=(0110)

jest ewidentnie nieosobliwa, to nasz algorytm nawet nie ruszy z miejsca, bo od razu zetknie się z dzieleniem przez a11=0. Ale wystarczy zamienić ze sobą kolejnością wiersze macierzy A (to znaczy, w układzie równań, zamienić ze sobą miejscami równania), a dostajemy macierz, dla której algorytm przejdzie bez problemu.

W praktyce obliczeniowej, aby uzyskać algorytm o [[|Dodaj link: możliwie dobrych własnościach numerycznych]], wykorzystujemy tzw. strategię wyboru elementu głównego w kolumnie. Polega to na tym, że zanim wykonamy k-ty krok algorytmu rozkładu LU,

  • szukamy w pierwszej kolumnie podmacierzy A(k:N,k:N) szukamy elementu o

największym module (taki element, na mocy założenia nieosobliwości macierzy, jest niezerowy) --- to jest właśnie element główny

  • zamieniamy ze sobą wiersz A(k,1:N) z wierszem, w którym

znajduje się element główny

  • zapamiętujemy dokonaną permutację, bo potem --- gdy już przyjdzie do

rozwiązywania układu równań --- będziemy musieli dokonać analogicznej permutacji wektora prawej strony

Wynikiem takiego algorytmu jest więc rozkład

PA=LU,

gdzie P jest pewną (zerojedynkową) macierzą permutacji (tzn. macierzą identyczności z przepermutowanymi wierszami).

Oprócz wyboru elementu głównego w kolumnie, stosuje się czasem inne strategie, m.in. wybór w kolumnie oraz tzw. wybór pełny, gdy elementu głównego szukamy w całej podmacierzy A(k:N,k:N), co znacznie zwiększa liczbę porównań niezbędnych do wskazania elementu głównego, ale też trochę poprawia własności numeryczne takiego algorytmu.

W praktyce całą informację o wykonanych permutacjach przechowujemy nie w zerojedynkowej macierzy j.w. ale w jednym wektorze.

Algorytm Rozkład LU z wyborem elementu głównego w kolumnie



P = 1:N; /* tu zapamiętujemy wykonane permutacje */
for k=1:N-1
	
	w wektorze A(k:N,k) znajdź element główny <math>\displaystyle a_{pk}</math>;
	zamień ze sobą wiersze A(k,1:N) i A(p,1:N);
	P(k) = p; P(p) = k;
	if <math>\displaystyle a_{kk}</math>
		STOP: macierz osobliwa!
	end
	
	/* kontunuuj tak jak w algorytmie bez wyboru */
	
	for i=k+1:N /* wyznaczenie <math>\displaystyle k</math>-tej kolumny <math>\displaystyle L</math> */
		<math>\displaystyle a_{ik}</math> = <math>\displaystyle a_{ik}/a_{ii}</math>;
	end
	for j=k+1:N /* modyfikacja podmacierzy <math>\displaystyle A_{22} = A_{22} - l_{21}u_{12}^T</math> */
		for i=k+1:N 
			<math>\displaystyle a_{ij}</math> -= <math>\displaystyle a_{ik}a_{kj}</math>;
		end
	end
end
<flash>file=Macierz.swf</flash><div.thumbcaption>Eliminacja Gaussa z wyborem elementu głównego

Poniżej zapisujemy algorytm rozwiązania układu równań, gdy znany jest już rozkład LU wykonany z wyborem w kolumnie.

Algorytm Rozwiązywanie układu równań metodą eliminacji Gaussa z wyborem elementu głównego w kolumnie



znajdź rozkład <math>\displaystyle PA = LU</math>;
rozwiąż względem <math>\displaystyle y</math> układ z macierzą górną trójkątną <math>\displaystyle Uy = Pb</math>;
rozwiąż względem <math>\displaystyle x</math> układ z macierzą dolną trójkątną <math>\displaystyle Lx = y</math>;

Dla niektórych ważnych klas macierzy wiadomo, że rozkład LU jest wykonalny bez wyznaczania elementu głównego, co istotnie może zmniejszyć całkowity czas działania algorytmu. Jest tak m.in. dla macierzy

  • symetrycznych, dodatnio określonych: A=AT oraz xTAx>0, x0,
  • silnie diagonalnie dominujących: macierz A (lub AT) spełnia
|aii|>ji|aij|,i.