MN08LAB: Różnice pomiędzy wersjami
mNie podano opisu zmian |
m Zastępowanie tekstu – „\displaystyle ” na „” |
||
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 42: | ||
<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 82: | ||
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 161: | Linia 161: | ||
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 186: | ||
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\\ | ||
Linia 193: | Linia 193: | ||
</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 205: | Linia 205: | ||
</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 224: | Linia 224: | ||
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 235: | ||
<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 253: | ||
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 271: | ||
</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 279: | ||
</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> |
Wersja z 08:47, 28 sie 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.