MN08LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
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>\displaystyle Ax=b</math> jest metoda Richardsona, zadana
Jedną z najprostszych klasycznych metod iteracyjnych dla równania <math>Ax=b</math> jest metoda Richardsona, zadana
wzorem
wzorem


<center><math>\displaystyle x_{k+1} = x_k + \tau (b- Ax_k),
<center><math>x_{k+1} = x_k + \tau (b- Ax_k)</math>,</center>
</math></center>


gdzie <math>\displaystyle \tau</math> jest pewnym parametrem. Gdy <math>\displaystyle \tau=1</math>, mamy do czynienia ze zwykłą
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>\displaystyle \tau</math> jest kluczowy dla skuteczności metody.
parametru <math>\tau</math> jest kluczowy dla skuteczności metody.


Dla <math>\displaystyle A</math> symetrycznej, dodatnio określonej sprawdź, przy jakich założeniach o
Dla <math>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>\tau</math> metoda będzie zbieżna do rozwiązania <math>x^*</math> z dowolnego wektora startowego
<math>\displaystyle x_0</math> i oceń szybkość tej zbieżności.
<math>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>?
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>\displaystyle A</math> będą <math>\displaystyle 0 < \lambda_{\min} \leq \lambda_{\max}</math>. Ponieważ macierz iteracji metody Richardsona <math>\displaystyle B= I - \tau A</math>, to jej wartości własne muszą leżeć w przedziale <math>\displaystyle [1-\tau \lambda_{\max}, 1 - \tau \lambda_{\min}]</math> i --- oczywiście --- aby iteracja miała sens, <math>\displaystyle \tau > 0</math> (dlaczego?).
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>\displaystyle ||B||_2 < 1</math> wtedy i tylko wtedy, gdy <math>\displaystyle 0 < \tau < \frac{2}{\lambda_{\max}}</math>, a najmniejszą normę spektralną macierzy <math>\displaystyle B</math> uzyskamy, gdy <math>\displaystyle \tau = \frac{2}{\lambda_{\max} + \lambda_{\min}}</math> i wówczas
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>\displaystyle ||x_k-x||_2 \leq \frac{\lambda_{\max} - \lambda_{\min}}{\lambda_{\max} + \lambda_{\min}}||x_{k-1}-x||_2.
<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>\displaystyle 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))
(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>\displaystyle L</math>, a to realizuje pętla:
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>\displaystyle A</math> przez wektor <math>\displaystyle x</math>,
* mnożenia macierzy <math>A</math> przez wektor <math>x</math>,
* wyłuskania wartości elementu <math>\displaystyle A_{ij}</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/&nbsp;saad/books.html  Iterative methods for sparse linear systems]</cite>, PWS, 1996.
* <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/&nbsp;saad/software/SPARSKIT/sparskit.html  SPARSKIT], będącym czymś w rodzaju odpowiednika BLAS dla macierzy rozrzedzonych.
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/&nbsp;saad/software/SPARSKIT/sparskit.html  SPARSKIT].
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>\displaystyle
<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>\displaystyle A =  
<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>\displaystyle T</math> jest <math>\displaystyle N-1</math> podmacierzą główną <math>\displaystyle A</math>,
gdzie <math>T</math> jest <math>N-1</math> podmacierzą główną <math>A</math>,


<center><math>\displaystyle T =  
<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>\displaystyle w^T = [c_N, 0, \ldots, 0, b_N]</math>,  <math>\displaystyle v = [b_1, 0, \ldots, 0,
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>\displaystyle T=LU</math>, łatwo stąd wygenerować rozkład <math>\displaystyle A</math>, gdyż
Mając rozkład <math>T=LU</math>, łatwo stąd wygenerować rozkład <math>A</math>, gdyż


<center><math>\displaystyle \begin{pmatrix}  
<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>\displaystyle T = LU</math> (rozkład LU macierzy trójdiagonalnej <math>\displaystyle T</math>)
* <math>T = LU</math> (rozkład LU macierzy trójdiagonalnej <math>T</math>)
* <math>\displaystyle Ul = w</math> (rozwiązanie układu równań z macierzą dwudiagonalną)
* <math>Ul = w</math> (rozwiązanie układu równań z macierzą dwudiagonalną)
* <math>\displaystyle Lu = v</math> (jw.)
* <math>Lu = v</math> (jw.)
* <math>\displaystyle l^Tu + u_N = a_N</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>\displaystyle 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]]
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>\displaystyle A^TAx = A^T b,
<center><math>A^TAx = A^T b</math>,</center>
</math></center>


którego macierz <math>\displaystyle A^TA</math> jest już oczywiście macierzą symetryczną i dodatnio określoną.
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>\displaystyle A^TA</math>? </div>
<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>\displaystyle  \mbox{cond} (A^TA) = ( \mbox{cond} (A))^2,
<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>\displaystyle M</math> mogłoby pomóc, np.
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>\displaystyle MA^TMAx = MA^T Mb,
<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>\displaystyle A^TA</math>. Niedobra metoda to  
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>\displaystyle A^TA</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>\displaystyle B</math> będzie bardziej wypełniona niż A. Znacznie lepiej  
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>\displaystyle A</math> (w formacie AIJ) i nie wymaga dodatkowej pamięci.
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 Ax=b jest metoda Richardsona, zadana wzorem

xk+1=xk+τ(bAxk),

gdzie τ jest pewnym parametrem. Gdy τ=1, 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 A symetrycznej, dodatnio określonej sprawdź, przy jakich założeniach o τ metoda będzie zbieżna do rozwiązania x* z dowolnego wektora startowego x0 i oceń szybkość tej zbieżności.

Testuj na macierzy jednowymiarowego laplasjanu L różnych wymiarów. Jak najefektywniej zaimplementować mnożenie przez L?

Wskazówka
Rozwiązanie

Ćwiczenie

Zaimplementuj operacje:

  • mnożenia macierzy A przez wektor x,
  • wyłuskania wartości elementu Aij,
  • 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.

Rozwiązanie

Ćwiczenie: Konwersja formatu macierzy rzadkiej

Napisz procedurę aij2csr, konwertującą macierz w formacie AIJ do CSR i csr2aij, działającą w drugą stronę.

Rozwiązanie


Ćwiczenie

Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn.

A=(a1c1b1b2a2c2b3a3cN1cNbNaN)

Dla uproszczenia załóżmy, że macierz jest dodatnio określona i symetryczna.

Zaimplementuj opracowaną metodę, korzystając z BLASów i LAPACKa.

Wskazówka
Rozwiązanie

Ćwiczenie: CGNE

Ktoś mógłby sugerować, że skoro CG działa tylko dla macierzy symetrycznych, to dowolny układ Ax=b z macierzą nieosobliwą można transformować do równoważnego mu układu równań normalnych

ATAx=ATb,

którego macierz ATA jest już oczywiście macierzą symetryczną i dodatnio określoną.

Wskaż potencjalne wady tej metody i podaj sposób jej implementacji.

Wskazówka
Rozwiązanie