MN08LAB: Różnice pomiędzy wersjami
mNie podano opisu zmian |
mNie podano opisu zmian |
||
Linia 1: | Linia 1: | ||
<!-- | |||
Konwertowane z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/ pawlik1/latex2mediawiki.php | |||
--> | |||
=Ćwiczenia: układy liniowe z macierzami rzadkimi= | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie</span> | <span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: Metoda Richardsona</span> | ||
<div class="exercise"> | <div class="exercise"> | ||
Jedną z najprostszych klasycznych metod iteracyjnych dla równania <math>\displaystyle Ax=b</math> jest metoda Richardsona, zadana | |||
wzorem | |||
<center><math>\displaystyle x_{k+1} = x_k + \tau (b- Ax_k), | |||
<center><math>\displaystyle | |||
</math></center> | </math></center> | ||
gdzie <math>\displaystyle | gdzie <math>\displaystyle \tau</math> jest pewnym parametrem. Gdy <math>\displaystyle \tau=1</math>, mamy do czynienia ze zwykłą | ||
metodą iteracji prostej, która najczęściej nie będzie zbieżna, dlatego wybór | |||
</ | parametru <math>\displaystyle \tau</math> jest kluczowy dla skuteczności metody. | ||
Dla <math>\displaystyle A</math> symetrycznej, dodatnio określonej, sprawdź przy jakich założeniach o | |||
<math>\displaystyle \tau</math> metoda będzie zbieżna do rozwiązania <math>\displaystyle x^*</math> z dowolnego wektora startowego | |||
<math>\displaystyle x_0</math> i oceń szybkość tej zbieżności. | |||
Testuj na macierzy jednowymiarowego laplasjanu <math>\displaystyle L</math> różnych wymiarów. Jak najefektywniej zaimplementować mnożenie przez <math>\displaystyle L</math>? | |||
</div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
Linia 26: | Linia 32: | ||
<div class="exercise"> | <div class="exercise"> | ||
Zaimplementuj operacje: | |||
* mnożenia macierzy <math>\displaystyle A</math> przez wektor <math>\displaystyle x</math>, | |||
* wyłuskania wartości elementu <math>\displaystyle A_{ij}</math>, | |||
* zmiany wartości pewnego zerowego wyrazu macierzy na niezerową, | |||
jeśli macierz jest zadana w formacie | |||
* AIJ, | |||
* CSC, | |||
* CSR. | |||
</div></div> | </div></div> | ||
Przetestuj dla kilku macierzy z kolekcji | |||
[http://math.nist.gov/MatrixMarket MatrixMarket]. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Dodawanie nowego elementu w formacie AIJ jest bardzo łatwe, w przeciwieństwie do | |||
pozostałych, bo w nich trzeba zacowywać uporządkowanie. Mnożenie przez wektor | |||
w | najwygodniejsze jest w CSR. Wyłuskanie wartości jest najmniej efektywne w | ||
formacie AIJ. | |||
Zob. [http://www-users.cs.umn.edu/ saad/books.html Y. Saad, Iterative methods for sparse linear systems] | |||
</div></div></div> | </div></div></div> | ||
Linia 52: | Linia 59: | ||
<div class="exercise"> | <div class="exercise"> | ||
Jak | Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn. | ||
<center><math>\displaystyle | |||
A = | |||
\begin{pmatrix} | |||
a_1 & c_1 & & & b_1\\ | |||
b_2 & a_2 & c_2 & & \\ | |||
& b_3 & a_3 & \ddots & \\ | |||
& & \ddots & \ddots & c_{N-1}\\ | |||
c_N & & & b_N & a_N | |||
\end{pmatrix} | |||
</math></center> | |||
Dla uproszczenia załóżmy, że macierz jest dodatnio określona i symetryczna. | |||
Zaimplementuj opracowaną metodę korzystając z BLASów i LAPACKa. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | ||
<div style="font-size:smaller; background-color:#efe"> | <div style="font-size:smaller; background-color:#efe"> Dziel i rządź! </div> | ||
</div></div> | </div></div> | ||
</div></div> | </div></div> | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | |||
Gdyby pominąć ostatni wiersz i kolumnę, macierz byłaby trójdiagonalna, a z nią | |||
już wiemy, co zrobić... Jak więc sprytnie pozbyć się ostatniej niewiadomej i | |||
ostatniego równania? | |||
W naszej macierzy wyróżnijmy ostatni wiersz i kolumnę: | |||
<center><math>\displaystyle A = | |||
\begin{pmatrix} | |||
T & v\\ | |||
w^T & a_N | |||
\end{pmatrix} , | |||
</math></center> | |||
gdzie <math>\displaystyle T</math> jest <math>\displaystyle N-1</math> podmacierzą główną <math>\displaystyle A</math>, | |||
<center><math>\displaystyle T = | |||
\begin{pmatrix} | |||
a_1 & c_1 & & & \\ | |||
b_2 & a_2 & c_2 & & \\ | |||
& b_3 & a_3 & \ddots & \\ | |||
& & \ddots & \ddots & c_{N-2}\\ | |||
& & & b_{N-1} & a_{N-1} | |||
\end{pmatrix} , | |||
</math></center> | |||
natomiast <math>\displaystyle w^T = [c_N, 0, \ldots, 0, b_N]</math>, <math>\displaystyle v = [b_1, 0, \ldots, 0, | |||
c_{N-1}]^T</math>. | |||
Mając rozkład <math>\displaystyle T=LU</math>, łatwo stąd wygenerować rozkład <math>\displaystyle A</math>, gdyż | |||
<center><math>\displaystyle \begin{pmatrix} | |||
T & v\\ | |||
w^T & a_N | |||
\end{pmatrix} = | |||
\begin{pmatrix} | |||
L & \\ | |||
l^T & 1 | |||
\end{pmatrix} \cdot \begin{pmatrix} | |||
U & u\\ | |||
& u_N | |||
\end{pmatrix} , | |||
</math></center> | |||
gdzie spełnione są zależności | |||
* <math>\displaystyle T = LU</math> (rozkład LU macierzy trójdiagonalnej <math>\displaystyle T</math>) | |||
* <math>\displaystyle Ul = w</math> (rozwiązanie układu równań z macierzą dwudiagonalną) | |||
* <math>\displaystyle Lu = v</math> (jw.) | |||
* <math>\displaystyle l^Tu + u_N = a_N</math>. | |||
</div></div></div> | |||
<div style="margin-top:1em; padding-top,padding-bottom:1em;"> | <div style="margin-top:1em; padding-top,padding-bottom:1em;"> | ||
<span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie</span> | <span style="display: block; background-color:#fefeee; border-bottom: 1px solid #E5E5E5; line-height: 1.1em; padding-bottom: 0.2em; font-variant:small-caps; color:#1A6ABF;">Ćwiczenie: CGNE</span> | ||
<div class="exercise"> | <div class="exercise"> | ||
Ktoś mógłby sugerować, że skoro CG działa tylko dla macierzy symetrycznych, to dowolny układ <math>\displaystyle Ax=b</math> z macierzą nieosobliwą można transformować do równoważnego mu układu [[Dodaj WIKIlink|równań normalnych]], | |||
<center><math>\displaystyle A^TAx = A^T b, | |||
</math></center> | |||
którego macierz <math>\displaystyle A^TA</math> jest już oczywiście macierzą symetryczną i dodatnio określoną. | |||
Wskaż potencjalne wady tej metody i podaj sposób jej implementacji. | |||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Wskazówka </span><div class="mw-collapsible-content" style="display:none"> | ||
<div style="font-size:smaller; background-color:#efe"> | <div style="font-size:smaller; background-color:#efe"> Jakie jest uwarunkowanie macierzy <math>\displaystyle A^TA</math>? </div> | ||
</div></div> | </div></div> | ||
Linia 75: | Linia 153: | ||
<div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | <div class="mw-collapsible mw-made=collapsible mw-collapsed"><span class="mw-collapsible-toogle mw-collapsible-toogle-default style="font-variant:small-caps">Rozwiązanie </span><div class="mw-collapsible-content" style="display:none"><div style="margin-left:1em"> | ||
Nietrudno sprawdzić, że dla normy spektralnej macierzy, | |||
<center><math>\displaystyle | |||
<center><math>\displaystyle \mbox{cond} (A^TA) = ( \mbox{cond} (A))^2, | |||
</math></center> | |||
a więc w przypadku macierzy źle uwarunkowanych, należy spodziewać się patologicznie dużej liczby iteracji. Chociaż dobry prekondycjoner mógłby pomóc: | |||
<center><math>\displaystyle MA^TMAx = MA^T Mb, | |||
</math></center> | </math></center> | ||
to | to jednak znacznie lepiej stosować metody opracowane specjalnie dla maicerzy niesymetrycznych, np. GMRES (też z dobrym prekondycjonerem...). | ||
Implementacja metody to tylko decyzja, jak realizować mnożenie przez <math>\displaystyle A^TA</math>. Oczywiście niedobra metoda to | |||
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre> | |||
B = A^TA; | |||
... | |||
while ... | |||
y = B*x; | |||
end | |||
</pre></div> | |||
gdyż <math>\displaystyle B</math> będzie bardziej wypełniona niż A. Znacznie lepiej | |||
<div class="code" style="background-color:#e8e8e8; padding:1em"><pre> | <div class="code" style="background-color:#e8e8e8; padding:1em"><pre> | ||
... | |||
while ... | |||
y = A*x; | |||
y = (y'*A)'; | |||
end | |||
</pre></div> | </pre></div> | ||
jest to koszt równy dwukrotnemu mnożeniu przez macierz <math>\displaystyle A</math> (w formacie AIJ). | |||
</div></div></div> | </div></div></div> | ||
Wersja z 17:16, 2 wrz 2006
Ćwiczenia: układy liniowe z macierzami rzadkimi
Ćwiczenie: Metoda Richardsona
Jedną z najprostszych klasycznych metod iteracyjnych dla równania jest metoda Richardsona, zadana wzorem
gdzie jest pewnym parametrem. Gdy , mamy do czynienia ze zwykłą metodą iteracji prostej, która najczęściej nie będzie zbieżna, dlatego wybór parametru jest kluczowy dla skuteczności metody.
Dla symetrycznej, dodatnio określonej, sprawdź przy jakich założeniach o metoda będzie zbieżna do rozwiązania z dowolnego wektora startowego i oceń szybkość tej zbieżności.
Testuj na macierzy jednowymiarowego laplasjanu różnych wymiarów. Jak najefektywniej zaimplementować mnożenie przez ?
Ćwiczenie
Zaimplementuj operacje:
- mnożenia macierzy przez wektor ,
- wyłuskania wartości elementu ,
- zmiany wartości pewnego zerowego wyrazu macierzy na niezerową,
jeśli macierz jest zadana w formacie
- AIJ,
- CSC,
- CSR.
Przetestuj dla kilku macierzy z kolekcji MatrixMarket.
Ćwiczenie
Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn.
Dla uproszczenia załóżmy, że macierz jest dodatnio określona i symetryczna.
Zaimplementuj opracowaną metodę korzystając z BLASów i LAPACKa.
Ćwiczenie: CGNE
Ktoś mógłby sugerować, że skoro CG działa tylko dla macierzy symetrycznych, to dowolny układ z macierzą nieosobliwą można transformować do równoważnego mu układu równań normalnych,
którego macierz jest już oczywiście macierzą symetryczną i dodatnio określoną.
Wskaż potencjalne wady tej metody i podaj sposób jej implementacji.