MN08LAB: 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:


==Ćwiczenia: FFT==
<!--
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;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">


Udowodnij, że faktycznie macierz <math>\displaystyle U_N = \frac{1}{\sqrt{N}}F_N</math> jest macierzą unitarną,
Jedną z najprostszych klasycznych metod iteracyjnych dla równania <math>\displaystyle Ax=b</math> jest metoda Richardsona, zadana
to znaczy <math>\displaystyle U_N^* = U_N^{-1}</math>.
wzorem
</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"> 
<center><math>\displaystyle x_{k+1} = x_k + \tau (b- Ax_k),
Należy przeliczyć, korzystając ze struktury macierzy <math>\displaystyle F_N</math> i jej symetrii, że
<center><math>\displaystyle  
w_j^T w_k = \begincases  N, \qquad  \mbox{gdy } j = k\\
0,   \qquad  \mbox{w przeciwnym przypadku,}
\endcases
</math></center>
</math></center>


gdzie <math>\displaystyle w_j</math> oznacza <math>\displaystyle j</math>-ty wiersz (kolumnę) macierzy <math>\displaystyle F_N</math>. Dowód tego faktu to
gdzie <math>\displaystyle \tau</math> jest pewnym parametrem. Gdy <math>\displaystyle \tau=1</math>, mamy do czynienia ze zwykłą
prosty wniosek ze wzoru na sumę <math>\displaystyle N</math> wyrazów ciągu geometrycznego.
metodą iteracji prostej, która najczęściej nie będzie zbieżna, dlatego wybór
</div></div></div>
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">


Jak zastosować FFT do szybkiego wymnożenia ''dwóch, rzeczywistych'' wektorów
Zaimplementuj operacje:
długości <math>\displaystyle N</math> przez macierz DFT?
* 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">   
Niech dane wektory to <math>\displaystyle f,g\in R^N</math>. Oczywiście możemy przyłożyć DFT do ''zespolonego'' wektora <math>\displaystyle f+i\cdot g</math>,  
Dodawanie nowego elementu w formacie AIJ jest bardzo łatwe, w przeciwieństwie do
<center><math>\displaystyle
pozostałych, bo w nich trzeba zacowywać uporządkowanie. Mnożenie przez wektor
w = F_N(f + i\, g).
najwygodniejsze jest w CSR. Wyłuskanie wartości jest najmniej efektywne w
</math></center>
formacie AIJ.
Zob. [http://www-users.cs.umn.edu/&nbsp;saad/books.html  Y. Saad, Iterative methods for sparse linear systems]
Po dłuższych rachunkach, stwierdzamy, że
 
<center><math>\displaystyle \aligned F_N f &= \frac{1}{2} \left( Re(w + T_N w) + i\, Im(w- T_Nw)\right)\\
F_N g &= \frac{1}{2} \left( Im(w + T_N w) - i\, Re(w- T_Nw)\right),
\endaligned</math></center>
 
gdzie <math>\displaystyle T_N</math> jest operatorem, który odwraca kolejność wszystkich (oprócz
pierwszej) współrzędnych wektora, tzn. <math>\displaystyle T_Nw =
[w_0,w_{N-1},w_{N-2},\ldots,w_1]^T</math>.
 
</div></div></div>
</div></div></div>


Linia 52: Linia 59:
<div class="exercise">
<div class="exercise">


Jak zastosować FFT do szybkiego wymnożenia ''jednego rzeczywistego'' wektora
Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn.
długości <math>\displaystyle 2N</math> przez macierz <math>\displaystyle F_{2N}</math>?
<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"> Sprowadź zadanie do poprzedniego! </div>
<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">


Podaj algorytm wyznaczania <math>\displaystyle f = F_N^{-1}c</math>, gdzie <math>\displaystyle c\in C^N</math> jest zadanym
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]],
wektorem, a <math>\displaystyle F_N</math> jest macierzą DFT.
 
<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"> Sprowadź zadanie do zadania mnożenia przez macierz DFT! </div>
<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">   
Ponieważ
Nietrudno sprawdzić, że dla normy spektralnej macierzy,
<center><math>\displaystyle  
 
F_N^{-1}f = \frac{1}{N}F_N^*f = \frac{1}{N}\bar{F_N^T}f =
<center><math>\displaystyle \mbox{cond} (A^TA) = ( \mbox{cond} (A))^2,
\frac{1}{N}\bar{F_N\bar{f}},
</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 stąd implementacja w Octave (przypomnijmy, że w Octave operator <code>'</code> oznacza
to jednak znacznie lepiej stosować metody opracowane specjalnie dla maicerzy niesymetrycznych, np. GMRES (też z dobrym prekondycjonerem...).
hermitowskie sprzężenie) mógłby wyglądać tak:


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>
   
   
f <nowiki>=</nowiki> (fft(c'))'/N;
...
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>
<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>
<div class="exercise">
Sprawdź eksperymentalnie, że mnożenie przez cykliczną macierz
Toeplitza rzeczywiście daje się wykonać przy użyciu FFT. Czy przy okazji można
coś powiedzieć o wartościach własnych i wektorach własnych takiej macierzy?
</div></div>
<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>
<div class="exercise">
Zaimplementuj FFT i porównaj wyniki (zwłaszcza: czas wykonania) z wynikami
procedury z Octave oraz z FFTW, a także z procedurą opartą na mnożeniu wprost przez
macierz <math>\displaystyle F_N</math>.
</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 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?

Ć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

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