MN08LAB: Różnice pomiędzy wersjami
mNie podano opisu zmian |
m Zastępowanie tekstu – „,↵</math>” na „</math>,” |
||
(Nie pokazano 4 wersji utworzonych przez 2 użytkowników) | |||
Linia 19: | Linia 19: | ||
<div class="exercise"> | <div class="exercise"> | ||
Jedną z najprostszych klasycznych metod iteracyjnych dla równania <math> | Jedną z najprostszych klasycznych metod iteracyjnych dla równania <math>Ax=b</math> jest metoda Richardsona, zadana | ||
wzorem | wzorem | ||
<center><math> | <center><math>x_{k+1} = x_k + \tau (b- Ax_k)</math>,</center> | ||
</math></center> | |||
gdzie <math> | gdzie <math>\tau</math> jest pewnym parametrem. Gdy <math>\tau=1</math>, mamy do czynienia ze zwykłą | ||
metodą iteracji prostej, która najczęściej nie będzie zbieżna, dlatego wybór | metodą iteracji prostej, która najczęściej nie będzie zbieżna, dlatego wybór | ||
parametru <math> | parametru <math>\tau</math> jest kluczowy dla skuteczności metody. | ||
Dla <math> | Dla <math>A</math> symetrycznej, dodatnio określonej sprawdź, przy jakich założeniach o | ||
<math> | <math>\tau</math> metoda będzie zbieżna do rozwiązania <math>x^*</math> z dowolnego wektora startowego | ||
<math> | <math>x_0</math> i oceń szybkość tej zbieżności. | ||
Testuj na macierzy jednowymiarowego laplasjanu <math> | Testuj na macierzy jednowymiarowego laplasjanu <math>L</math> różnych wymiarów. Jak najefektywniej zaimplementować mnożenie przez <math>L</math>? | ||
<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"> | ||
Linia 42: | Linia 41: | ||
<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"> | ||
Niech ekstremalnymi wartościami własnymi macierzy <math> | Niech ekstremalnymi wartościami własnymi macierzy <math>A</math> będą <math>0 < \lambda_{\min} \leq \lambda_{\max}</math>. Ponieważ macierz iteracji metody Richardsona <math>B= I - \tau A</math>, to jej wartości własne muszą leżeć w przedziale <math>[1-\tau \lambda_{\max}, 1 - \tau \lambda_{\min}]</math> i --- oczywiście --- aby iteracja miała sens, <math>\tau > 0</math> (dlaczego?). | ||
Co więcej, <math> | Co więcej, <math>||B||_2 < 1</math> wtedy i tylko wtedy, gdy <math>0 < \tau < \frac{2}{\lambda_{\max}}</math>, a najmniejszą normę spektralną macierzy <math>B</math> uzyskamy, gdy <math>\tau = \frac{2}{\lambda_{\max} + \lambda_{\min}}</math> i wówczas | ||
<center><math> | <center><math>||x_k-x||_2 \leq \frac{\lambda_{\max} - \lambda_{\min}}{\lambda_{\max} + \lambda_{\min}}||x_{k-1}-x||_2</math></center> | ||
</math></center> | |||
(Przy okazji zauważ, że gdyby macierz <math> | (Przy okazji zauważ, że gdyby macierz <math>A</math> nie była określona, tzn. miałaby zarówno dodatnie, jak i ujemne wartości własne, to metoda Richardsona mogłaby w ogóle nie być zbieżna (dla pewnych wektorów startowych)) | ||
Jeśli chodzi o mnożenie przez macierz jednowymiarowego laplasjanu, to najprościej wcale nie używać struktury macierzy! Rzeczywiście, jedyne, czego potrzebujemy to operacja <strong>mnożenia wektora przez macierz</strong> <math> | Jeśli chodzi o mnożenie przez macierz jednowymiarowego laplasjanu, to najprościej wcale nie używać struktury macierzy! Rzeczywiście, jedyne, czego potrzebujemy to operacja <strong>mnożenia wektora przez macierz</strong> <math>L</math>, a to realizuje pętla: | ||
<div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>void LapMult(double *x, int N, double *y) | <div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>void LapMult(double *x, int N, double *y) | ||
Linia 82: | Linia 80: | ||
Zaimplementuj operacje: | Zaimplementuj operacje: | ||
* mnożenia macierzy <math> | * mnożenia macierzy <math>A</math> przez wektor <math>x</math>, | ||
* wyłuskania wartości elementu <math> | * wyłuskania wartości elementu <math>A_{ij}</math>, | ||
* zmiany wartości pewnego zerowego wyrazu macierzy na niezerową, | * zmiany wartości pewnego zerowego wyrazu macierzy na niezerową, | ||
Linia 101: | Linia 99: | ||
najwygodniejsze jest w CSR, bo dodatkowo narzuca zasadę lokalności w przestrzeni. Wyłuskanie wartości jest najmniej efektywne w | najwygodniejsze jest w CSR, bo dodatkowo narzuca zasadę lokalności w przestrzeni. Wyłuskanie wartości jest najmniej efektywne w | ||
formacie AIJ. Szczegóły opisane są w rozdziale 3.5 książki | formacie AIJ. Szczegóły opisane są w rozdziale 3.5 książki | ||
* <span style="font-variant:small-caps">Y. Saad</span>, <cite> [http://www-users.cs.umn.edu/ | * <span style="font-variant:small-caps">Y. Saad</span>, <cite> [http://www-users.cs.umn.edu/~saad/books.html Iterative methods for sparse linear systems]</cite>, PWS, 1996. | ||
Zobacz także implementacje w Fortranie, w pakiecie [http://www-users.cs.umn.edu/ | Zobacz także implementacje w Fortranie, w pakiecie [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/sparskit.html SPARSKIT], będącym czymś w rodzaju odpowiednika BLAS dla macierzy rozrzedzonych. | ||
</div></div></div> | </div></div></div> | ||
Linia 115: | Linia 113: | ||
<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"> | ||
Zobacz, jak to zrobiono w pakiecie [http://www-users.cs.umn.edu/ | Zobacz, jak to zrobiono w pakiecie [http://www-users.cs.umn.edu/~saad/software/SPARSKIT/sparskit.html SPARSKIT]. | ||
</div></div></div> | </div></div></div> | ||
Linia 161: | Linia 159: | ||
Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn. | Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn. | ||
<center><math> | <center><math> | ||
A = | A = | ||
\begin{pmatrix} | \begin{pmatrix} | ||
Linia 186: | Linia 184: | ||
Gdyby pominąć ostatni wiersz i kolumnę, macierz byłaby trójdiagonalna, a my już wiemy, co z nią zrobić... Jak więc sprytnie pozbyć się ostatniej niewiadomej i ostatniego równania? W naszej macierzy wyróżnijmy ostatni wiersz i kolumnę: | Gdyby pominąć ostatni wiersz i kolumnę, macierz byłaby trójdiagonalna, a my już wiemy, co z nią zrobić... Jak więc sprytnie pozbyć się ostatniej niewiadomej i ostatniego równania? W naszej macierzy wyróżnijmy ostatni wiersz i kolumnę: | ||
<center><math> | <center><math>A = | ||
\begin{pmatrix} | \begin{pmatrix} | ||
T & v\\ | T & v\\ | ||
w^T & a_N | w^T & a_N | ||
\end{pmatrix} | \end{pmatrix} </math>,</center> | ||
</math></center> | |||
gdzie <math> | gdzie <math>T</math> jest <math>N-1</math> podmacierzą główną <math>A</math>, | ||
<center><math> | <center><math>T = | ||
\begin{pmatrix} | \begin{pmatrix} | ||
a_1 & c_1 & & & \\ | a_1 & c_1 & & & \\ | ||
Linia 202: | Linia 199: | ||
& & \ddots & \ddots & c_{N-2}\\ | & & \ddots & \ddots & c_{N-2}\\ | ||
& & & b_{N-1} & a_{N-1} | & & & b_{N-1} & a_{N-1} | ||
\end{pmatrix} | \end{pmatrix} </math>,</center> | ||
</math></center> | |||
natomiast <math> | natomiast <math>w^T = [c_N, 0, \ldots, 0, b_N]</math>, <math>v = [b_1, 0, \ldots, 0, | ||
c_{N-1}]^T</math>. | c_{N-1}]^T</math>. | ||
Mając rozkład <math> | Mając rozkład <math>T=LU</math>, łatwo stąd wygenerować rozkład <math>A</math>, gdyż | ||
<center><math> | <center><math>\begin{pmatrix} | ||
T & v\\ | T & v\\ | ||
w^T & a_N | w^T & a_N | ||
Linia 220: | Linia 216: | ||
U & u\\ | U & u\\ | ||
& u_N | & u_N | ||
\end{pmatrix} | \end{pmatrix} </math>,</center> | ||
</math></center> | |||
gdzie spełnione są zależności | gdzie spełnione są zależności | ||
* <math> | * <math>T = LU</math> (rozkład LU macierzy trójdiagonalnej <math>T</math>) | ||
* <math> | * <math>Ul = w</math> (rozwiązanie układu równań z macierzą dwudiagonalną) | ||
* <math> | * <math>Lu = v</math> (jw.) | ||
* <math> | * <math>l^Tu + u_N = a_N</math>. | ||
</div></div></div> | </div></div></div> | ||
Linia 235: | Linia 230: | ||
<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> | Ktoś mógłby sugerować, że skoro CG działa tylko dla macierzy symetrycznych, to dowolny układ <math>Ax=b</math> z macierzą nieosobliwą można transformować do równoważnego mu układu [[MN12#Układ równań normalnych|równań normalnych]] | ||
<center><math> | <center><math>A^TAx = A^T b</math>,</center> | ||
</math></center> | |||
którego macierz <math> | którego macierz <math>A^TA</math> jest już oczywiście macierzą symetryczną i dodatnio określoną. | ||
Wskaż potencjalne wady tej metody i podaj sposób jej implementacji. | 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:#f9fff9; padding: 1em"> Jakie jest uwarunkowanie macierzy <math> | <div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Jakie jest uwarunkowanie macierzy <math>A^TA</math>? </div> | ||
</div></div> | </div></div> | ||
Linia 253: | Linia 247: | ||
Nietrudno sprawdzić, że dla normy spektralnej macierzy, | Nietrudno sprawdzić, że dla normy spektralnej macierzy, | ||
<center><math> | <center><math>\mbox{cond} (A^TA) = ( \mbox{cond} (A))^2</math>,</center> | ||
</math></center> | |||
a więc w przypadku macierzy źle uwarunkowanych należy spodziewać się patologicznie dużej liczby iteracji. Chociaż dobre (symetryczne, dodatnio określone) imadło <math> | a więc w przypadku macierzy źle uwarunkowanych należy spodziewać się patologicznie dużej liczby iteracji. Chociaż dobre (symetryczne, dodatnio określone) imadło <math>M</math> mogłoby pomóc, np. | ||
<center><math> | <center><math>MA^TMAx = MA^T Mb</math>,</center> | ||
</math></center> | |||
to jednak znacznie lepiej stosować metody opracowane specjalnie dla macierzy niesymetrycznych, np. GMRES (oczywiście z nieodzownym ściskaniem macierzy, gdy jest źle uwarunkowana...). | to jednak znacznie lepiej stosować metody opracowane specjalnie dla macierzy niesymetrycznych, np. GMRES (oczywiście z nieodzownym ściskaniem macierzy, gdy jest źle uwarunkowana...). | ||
Implementacja metody iteracyjnej to tylko decyzja, jak realizować mnożenie przez <math> | Implementacja metody iteracyjnej to tylko decyzja, jak realizować mnożenie przez <math>A^TA</math>. Niedobra metoda to | ||
<div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>B = <math> | <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>B = <math>A^TA</math>; | ||
... | ... | ||
while ... | while ... | ||
Linia 271: | Linia 263: | ||
</pre></div> | </pre></div> | ||
gdyż <math> | gdyż <math>B</math> będzie bardziej wypełniona niż A. Znacznie lepiej | ||
<div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>... | <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>... | ||
while ... | while ... | ||
Linia 279: | Linia 271: | ||
</pre></div> | </pre></div> | ||
co realizuje się kosztem równym dwukrotnemu mnożeniu przez macierz <math> | co realizuje się kosztem równym dwukrotnemu mnożeniu przez macierz <math>A</math> (w formacie AIJ) i nie wymaga dodatkowej pamięci. | ||
</div></div></div> | </div></div></div> |
Aktualna wersja na dzień 21:49, 11 wrz 2023
Układy liniowe z macierzami rzadkimi
<<< Powrót do strony głównej przedmiotu Metody numeryczne
Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__
Ć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: Konwersja formatu macierzy rzadkiej
Napisz procedurę aij2csr
, konwertującą macierz w formacie AIJ do CSR i csr2aij
, działającą w drugą stronę.
Ć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.