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 9 wersji utworzonych przez 3 użytkowników)
Linia 1: Linia 1:
<!--
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php.
Niezb�dne rozszerzenia i modyfikacje oryginalnego latex2mediawiki
wprowadzi� przykry@mimuw.edu.pl
-->
=Układy liniowe z macierzami rzadkimi=


==Ćwiczenia: FFT==
{{powrot |Metody numeryczne | do strony głównej
przedmiotu <strong>Metody numeryczne</strong>}}
 
<div class="mw-collapsible mw-made=collapsible mw-collapsed">
Oglądaj wskazówki i rozwiązania __SHOWALL__<br>
Ukryj wskazówki i rozwiązania __HIDEALL__
</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: 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>Ax=b</math> jest metoda Richardsona, zadana
to znaczy <math>\displaystyle U_N^* = U_N^{-1}</math>.
wzorem
 
<center><math>x_{k+1} = x_k + \tau (b- Ax_k)</math>,</center>
 
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
parametru <math>\tau</math> jest kluczowy dla skuteczności metody.
 
Dla <math>A</math> symetrycznej, dodatnio określonej sprawdź, przy jakich założeniach o
<math>\tau</math> metoda będzie zbieżna do rozwiązania <math>x^*</math> z dowolnego wektora startowego
<math>x_0</math> i oceń szybkość tej zbieżności.
 
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 style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Zadanie można rozwiązać przez analogię do opisywanego w wykładzie przypadku zastosowania [[MN08#Metoda Jacobiego|metody Jacobiego]] do macierzy jednowymiarowego laplasjanu: wystarczy uogólnić! </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">   
<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">   
Należy przeliczyć, korzystając ze struktury macierzy <math>\displaystyle F_N</math> i jej symetrii, że
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?).
<center><math>\displaystyle
 
w_j^T w_k = \begincases  N, \qquad  \mbox{gdy } j = k\\
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
0,  \qquad  \mbox{w przeciwnym przypadku,}
 
\endcases
<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>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>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)
/*
Mnożenie wektora przez macierz 1-wym laplasjanu L wymiaru N
 
Wejście:
x - wektor, który mnożymy przez L
N - jego długość
Wyjście:
y - wynik: y = Lx
*/
{
int i;
 
for (i = 1; i < N-1; i++)
y[i] = -x[i-1] + 2.0*x[i] - x[i+1];


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
y[0] = 2.0*x[0] - x[1];
prosty wniosek ze wzoru na sumę <math>\displaystyle N</math> wyrazów ciągu geometrycznego.
y[N-1] = -x[N-2] + 2.0*x[N-1];
}
</pre></div>
</div></div></div>
</div></div></div>


Linia 26: Linia 79:
<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>A</math> przez wektor <math>x</math>,
* wyłuskania wartości elementu <math>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, w których trzeba zachowywać uporządkowanie. Mnożenie przez wektor
w = F_N(f + i\, g).
najwygodniejsze jest w CSR, bo dodatkowo narzuca zasadę lokalności w przestrzeni. Wyłuskanie wartości jest najmniej efektywne w
</math></center>
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/~saad/books.html  Iterative methods for sparse linear systems]</cite>, PWS, 1996.
Po dłuższych rachunkach, stwierdzamy, że
 
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>


<center><math>\displaystyle \aligned F_N f &= \frac{1}{2} \left( Re(w + T_N w) + i\, Im(w- T_Nw)\right)\\
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
F_N g &= \frac{1}{2} \left( Im(w + T_N w) - i\, Re(w- T_Nw)\right),
<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: Konwersja formatu macierzy rzadkiej</span>  
\endaligned</math></center>
<div class="exercise">


gdzie <math>\displaystyle T_N</math> jest operatorem, który odwraca kolejność wszystkich (oprócz
Napisz procedurę <code>aij2csr</code>, konwertującą macierz w formacie AIJ do CSR i <code>csr2aij</code>, działającą w drugą stronę.
pierwszej) współrzędnych wektora, tzn. <math>\displaystyle T_Nw =
</div></div>
[w_0,w_{N-1},w_{N-2},\ldots,w_1]^T</math>.


<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/~saad/software/SPARSKIT/sparskit.html  SPARSKIT].
</div></div></div>
</div></div></div>
<!--


<div style="margin-top:1em; padding-top,padding-bottom:1em;">
<div style="margin-top:1em; padding-top,padding-bottom:1em;">
Linia 52: Linia 122:
<div class="exercise">
<div class="exercise">


Jak zastosować FFT do szybkiego wymnożenia ''jednego rzeczywistego'' wektora
Format AIJ można implementować na dwa sposoby: jako strukturę złożoną z trzech wektorów:
długości <math>\displaystyle 2N</math> przez macierz <math>\displaystyle F_{2N}</math>?
<div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>typedef struct {
int i[NNZ];
int j[NNZ];
double v[NNZ];
} matrix;
 
matrix A;


<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">
</pre></div>
<div style="font-size:smaller; background-color:#efe"> Sprowadź zadanie do poprzedniego! </div>
lub jako wektor struktur:
 
<div style="margin: 1em; padding:1em; color: #000; background-color:#fcfcfc;"><pre>typedef struct {
int i;
int j;
double v;
} element;
 
element B[NNZ];
</pre></div>
Przedyskutuj wady i zalety obu podejść i wskaż lepsze.
</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"> 
Korzystniejszy jest wariant z wektorem struktur: łatwiej wtedy dodawać i wyłuskiwać całe elementy, poza tym (choć, prawdę mówiąc, zysk jest marginalny) jest wtedy mniej "skakania" po pamięci: cała informacja o elemencie jest zlokalizowana w jednym obszarze pamięci, co może trochę poprawiać wykorzystanie hierarchii pamięci.
 
</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</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
Jak tanio rozwiązywać układ równań z macierzą cykliczną trójdiagonalną, tzn.
wektorem, a <math>\displaystyle F_N</math> jest macierzą DFT.
<center><math>
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 zadania mnożenia przez macierz DFT! </div>
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Dziel i rządź! (Tylko: jak?) </div>
</div></div>
</div></div>


Linia 75: Linia 181:


<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ż
<center><math>\displaystyle
F_N^{-1}f = \frac{1}{N}F_N^*f = \frac{1}{N}\bar{F_N^T}f =
\frac{1}{N}\bar{F_N\bar{f}},
</math></center>


to stąd implementacja w Octave (przypomnijmy, że w Octave operator <code>'</code> oznacza
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ę:
hermitowskie sprzężenie) mógłby wyglądać tak:
 
<center><math>A =
\begin{pmatrix}
T & v\\
w^T & a_N
\end{pmatrix} </math>,</center>
 
gdzie <math>T</math> jest <math>N-1</math> podmacierzą główną <math>A</math>,
 
<center><math>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>w^T = [c_N, 0, \ldots, 0, b_N]</math>,  <math>v = [b_1, 0, \ldots, 0,
c_{N-1}]^T</math>.
 
Mając rozkład <math>T=LU</math>, łatwo stąd wygenerować rozkład <math>A</math>, gdyż
 
<center><math>\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>


<div class="code" style="background-color:#e8e8e8; padding:1em"><pre>
gdzie spełnione są zależności
* <math>T = LU</math> (rozkład LU macierzy trójdiagonalnej <math>T</math>)
f <nowiki>=</nowiki> (fft(c'))'/N;
* <math>Ul = w</math> (rozwiązanie układu równań z macierzą dwudiagonalną)
</pre></div>
* <math>Lu = v</math> (jw.)
* <math>l^Tu + u_N = a_N</math>.
   
   
</div></div></div>
</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">


Sprawdź eksperymentalnie, że mnożenie przez cykliczną macierz
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]]
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?
<center><math>A^TAx = A^T b</math>,</center>
 
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.
 
<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>A^TA</math>? </div>
</div></div>
 
</div></div>
</div></div>


<div style="margin-top:1em; padding-top,padding-bottom: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"> 
<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>  
Nietrudno sprawdzić, że dla normy spektralnej macierzy,
<div class="exercise">
 
<center><math>\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ż dobre (symetryczne, dodatnio określone) imadło <math>M</math> mogłoby pomóc, np.
 
<center><math>MA^TMAx = MA^T Mb</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...).


Zaimplementuj FFT i porównaj wyniki (zwłaszcza: czas wykonania) z wynikami
Implementacja metody iteracyjnej to tylko decyzja, jak realizować mnożenie przez <math>A^TA</math>. Niedobra metoda to
procedury z Octave oraz z FFTW, a także z procedurą opartą na mnożeniu wprost przez
<div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>B = <math>A^TA</math>;
macierz <math>\displaystyle F_N</math>.
...
</div></div>
while ...
y = B*x;
end
</pre></div>
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>...
while ...
y = A*x;
y = (y'*A)';
end
</pre></div>
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>

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