MN05LAB: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Przykry (dyskusja | edycje)
Nie podano opisu zmian
m Zastępowanie tekstu – „,↵</math>” na „</math>,”
 
(Nie pokazano 5 wersji utworzonych przez 2 użytkowników)
Linia 1: Linia 1:
<!--  
<!--  
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php.
Konwertowane  z pliku LaTeX przez latex2mediawiki, zob. http://www.ii.uj.edu.pl/&nbsp;pawlik1/latex2mediawiki.php.
Linia 31: Linia 30:
Są to macierze spełniające warunki:
Są to macierze spełniające warunki:


<center><math>\displaystyle A=A^T \qquad  \mbox{oraz}  \qquad x^T A x\,>\,0,\quad\forall x\ne 0.
<center><math>A=A^T \qquad  \mbox{oraz}  \qquad x^T A x\,>\,0,\quad\forall x\ne 0</math></center>
</math></center>


Dla takich macierzy można nieco zmniejszyć koszt kombinatoryczny  
Dla takich macierzy można nieco zmniejszyć koszt kombinatoryczny  
Linia 39: Linia 37:
rozkład   
rozkład   


<center><math>\displaystyle A\,=\,L\, D\, L^T
<center><math>A\,=\,L\, D\, L^T
</math></center>
</math></center>


zamiast <math>\displaystyle PA=LU</math>, przy czym <math>\displaystyle L</math> jest tu jak zwykle macierzą  
zamiast <math>PA=LU</math>, przy czym <math>L</math> jest tu jak zwykle macierzą  
trójkątną dolną z jedynkami na przekątnej, a <math>\displaystyle D</math> jest macierzą  
trójkątną dolną z jedynkami na przekątnej, a <math>D</math> jest macierzą  
diagonalną z dodatnimi elementami na diagonali. Opracuj taki algorytm. W jego
diagonalną z dodatnimi elementami na diagonali. Opracuj taki algorytm. W jego
implementacji możesz porównywać się z procedurą LAPACKa <code style="color: #903">DPOSV</code>.
implementacji możesz porównywać się z procedurą LAPACKa <code style="color: #903">DPOSV</code>.
Inny wariant tego samego
Inny wariant tego samego
rozkładu to tak zwany rozkład <strong>Cholesky'ego--Banachiewicza</strong>, w którym, przy tych
rozkładu to tak zwany rozkład <strong>Cholesky'ego--Banachiewicza</strong>, w którym, przy tych
samych założeniach na <math>\displaystyle A</math>, szukamy rozkładu wykorzystującego tylko jedną macierz
samych założeniach na <math>A</math>, szukamy rozkładu wykorzystującego tylko jedną macierz
trójkątną dolną:
trójkątną dolną:


<center><math>\displaystyle A\,=\,\widetilde{L}\, \widetilde{L}^T,
<center><math>A\,=\,\widetilde{L}\, \widetilde{L}^T</math>,</center>
</math></center>


(oczywiście tym razem nie żądamy, aby <math>\displaystyle \widetilde{L}</math> miała na diagonali jedynki).
(oczywiście tym razem nie żądamy, aby <math>\widetilde{L}</math> miała na diagonali jedynki).
Jaka jest relacja między rozkładem <math>\displaystyle LDL^T</math> a <math>\displaystyle \widetilde{L}\widetilde{L}^T</math>?
Jaka jest relacja między rozkładem <math>LDL^T</math> a <math>\widetilde{L}\widetilde{L}^T</math>?
</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">   
Bez zmniejszenia ogólności rozpatrzymy  
Bez zmniejszenia ogólności rozpatrzymy  
tylko pierwszy krok rozkładu <math>\displaystyle LDL^T</math>. W tym celu zauważmy najpierw, że  
tylko pierwszy krok rozkładu <math>LDL^T</math>. W tym celu zauważmy najpierw, że  
<math>\displaystyle a_{1,1}= e_1^TA e_1>0</math> (gdzie <math>\displaystyle  e_1</math> jest pierwszym  
<math>a_{1,1}= e_1^TA e_1>0</math> (gdzie <math>e_1</math> jest pierwszym  
wersorem), a więc nie musimy przestawiać wierszy,  
wersorem), a więc nie musimy przestawiać wierszy,  
bo element na diagonali jest niezerowy. W pierwszym kroku mnożymy  
bo element na diagonali jest niezerowy. W pierwszym kroku mnożymy  
macierz <math>\displaystyle A</math> z lewej strony przez odpowiednią macierz <math>\displaystyle L_1</math>, a potem  
macierz <math>A</math> z lewej strony przez odpowiednią macierz <math>L_1</math>, a potem  
z prawej przez <math>\displaystyle L_1^T</math>. Kluczem do zrozumienia algorytmu jest uwaga,  
z prawej przez <math>L_1^T</math>. Kluczem do zrozumienia algorytmu jest uwaga,  
że efektem mnożenia macierzy <math>\displaystyle L_1 A</math> z prawej strony przez <math>\displaystyle L_1^T</math>  
że efektem mnożenia macierzy <math>L_1 A</math> z prawej strony przez <math>L_1^T</math>  
jest wyzerowanie elementów pierwszego wiersza poza <math>\displaystyle a_{1,1}</math>  
jest wyzerowanie elementów pierwszego wiersza poza <math>a_{1,1}</math>  
i pozostawienie niezmienionych pozostałych elementów. Ponadto  
i pozostawienie niezmienionych pozostałych elementów. Ponadto  
macierz <math>\displaystyle A^{(1)}=L_1 AL_1^T</math> jest symetryczna i dodatnio określona.  
macierz <math>A^{(1)}=L_1 AL_1^T</math> jest symetryczna i dodatnio określona.  
Rzeczywiście,  
Rzeczywiście,  


<center><math>\displaystyle \Big(A^{(1)}\Big)^T\,=\,(L_1AL_1^T)^T
<center><math>\Big(A^{(1)}\Big)^T\,=\,(L_1AL_1^T)^T
     \,=\,(L_1^T)^TA^TL_1^T\,=\,L_1AL_1^T,  
     \,=\,(L_1^T)^TA^TL_1^T\,=\,L_1AL_1^T,  
</math></center>
</math></center>


oraz dla <math>\displaystyle  x\ne 0</math>
oraz dla <math>x\ne 0</math>


<center><math>\displaystyle x^T A^{(1)} x\,=\, x^T L_1 A L_1^T  x
<center><math>x^T A^{(1)} x\,=\, x^T L_1 A L_1^T  x
     \,=\,(L_1^T x)^T A(L_1^T x)\,>\,0,
     \,=\,(L_1^T x)^T A(L_1^T x)\,>\,0</math>,</center>
</math></center>


bo <math>\displaystyle  x\ne 0</math> implikuje <math>\displaystyle L_1^T x\ne 0</math>. Stąd  
bo <math>x\ne 0</math> implikuje <math>L_1^T x\ne 0</math>. Stąd  
<math>\displaystyle a^{(1)}_{2,2}= e_2^TA^{(1)} e_2>0</math>. Postępując tak  
<math>a^{(1)}_{2,2}= e_2^TA^{(1)} e_2>0</math>. Postępując tak  
dalej otrzymujemy  
dalej otrzymujemy  


<center><math>\displaystyle L_{n-1}L_{n-2}\cdots L_2L_1AL_1^TL_2^T\cdots L_{n-2}^TL_{n-1}^T
<center><math>L_{n-1}L_{n-2}\cdots L_2L_1AL_1^TL_2^T\cdots L_{n-2}^TL_{n-1}^T
     \,=\,D,
     \,=\,D</math>,</center>
</math></center>


przy czym macierz <math>\displaystyle D</math> jest diagonalna i dodatnio określona,  
przy czym macierz <math>D</math> jest diagonalna i dodatnio określona,  
a więc wyrazy na diagonali są dodatnie. Oznaczając  
a więc wyrazy na diagonali są dodatnie. Oznaczając  


<center><math>\displaystyle L\,=\,L_1^{-1}L_2^{-1}\cdots L_{n-1}^{-1}  
<center><math>L\,=\,L_1^{-1}L_2^{-1}\cdots L_{n-1}^{-1}  
</math></center>
</math></center>


dostajemy żądany rozkład.  
dostajemy żądany rozkład.  


Zauważmy, że przy praktycznej realizacji rozkładu <math>\displaystyle A=LDL^T</math>  
Zauważmy, że przy praktycznej realizacji rozkładu <math>A=LDL^T</math>  
wystarczy modyfikować jedynie wyrazy pod i na głównej przekątnej  
wystarczy modyfikować jedynie wyrazy pod i na głównej przekątnej  
macierzy wyjściowej ponieważ, jak zauważyliśmy, wszystkie kolejne  
macierzy wyjściowej ponieważ, jak zauważyliśmy, wszystkie kolejne  
macierze <math>\displaystyle A^{(k)}</math> są symetryczne. Pozwala to zmniejszyć --- w stosunku do
macierze <math>A^{(k)}</math> są symetryczne. Pozwala to zmniejszyć --- w stosunku do
rozkładu LU --- koszt  
rozkładu LU --- koszt  
obliczeniowy o połowę, do <math>\displaystyle 2n^3/3</math> operacji arytmetycznych i zmieścić czynniki
obliczeniowy o połowę, do <math>2n^3/3</math> operacji arytmetycznych i zmieścić czynniki
rozkładu w pamięci przeznaczonej na przechowywanie istotnych elementów <math>\displaystyle A</math>
rozkładu w pamięci przeznaczonej na przechowywanie istotnych elementów <math>A</math>
(czyli w dolnym trójkącie macierzy).  
(czyli w dolnym trójkącie macierzy).  


Oczywiście, <math>\displaystyle \widetilde{L} = L \sqrt{D}</math>.
Oczywiście, <math>\widetilde{L} = L \sqrt{D}</math>.


</div></div></div>
</div></div></div>
Linia 115: Linia 110:
<div class="exercise">
<div class="exercise">


W Octave układ równań <math>\displaystyle Ax=b</math> rozwiązujemy korzystając z "operatora
W Octave układ równań <math>Ax=b</math> rozwiązujemy korzystając z "operatora
rozwiązywania równania"
rozwiązywania równania"
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>x = A \ b;
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>x = A \ b;
Linia 130: Linia 125:


<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">   
Wyznaczenie <math>\displaystyle A^{-1}</math> praktycznie nigdy nie jest konieczne w obliczeniach, a
Wyznaczenie <math>A^{-1}</math> praktycznie nigdy nie jest konieczne w obliczeniach, a
zwłaszcza do rozwiązania układu równań. Nie dość, że jest bardziej kosztowne, to
zwłaszcza do rozwiązania układu równań. Nie dość, że jest bardziej kosztowne, to
dodatkowo nie jest numerycznie poprawne.
dodatkowo nie jest numerycznie poprawne.
Linia 158: Linia 153:
Rozwiąż prosty układ równań
Rozwiąż prosty układ równań


<center><math>\displaystyle \aligned 10^{-18} x_1 + x_2 &= 1,\\
<center><math>\begin{align} 10^{-18} x_1 + x_2 &= 1,\\
x_1 + 2x_2 &= 4,
x_1 + 2x_2 &= 4,
\endaligned</math></center>
\end{align}</math></center>


czterema sposobami:
czterema sposobami:
Linia 172: Linia 167:


<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">   
Rozwiązanie uzyskane bez wyboru elementu głównego jest bardzo mało precyzyjne: <math>\displaystyle x_1</math> jest obarczone bardzo dużym błędem! Prosta analiza pokazuje,  że winę za to ponosi bardzo wielki współczynnik w macierzy <math>\displaystyle L</math>. Tak nie jest, gdy stosujemy wybór elementu: elementy <math>\displaystyle L</math> są zawsze mniejsze od 1. Dlatego LAPACK i Octave dają w przypadku naszej macierzy rezultat będący bardzo dobrym przybliżeniem wyniku dokładnego.
Rozwiązanie uzyskane bez wyboru elementu głównego jest bardzo mało precyzyjne: <math>x_1</math> jest obarczone bardzo dużym błędem! Prosta analiza pokazuje,  że winę za to ponosi bardzo wielki współczynnik w macierzy <math>L</math>. Tak nie jest, gdy stosujemy wybór elementu: elementy <math>L</math> są zawsze mniejsze od 1. Dlatego LAPACK i Octave dają w przypadku naszej macierzy rezultat będący bardzo dobrym przybliżeniem wyniku dokładnego.
</div></div></div>
</div></div></div>


Linia 185: Linia 180:
</div></div>
</div></div>


Wykorzystaj go do napisania funkcji, która rozwiąże układ równań <math>\displaystyle Ax=b</math>.
Wykorzystaj go do napisania funkcji, która rozwiąże układ równań <math>Ax=b</math>.


Przetestuj tę funkcję na kilku macierzach i porównaj czas jego działania z czasem
Przetestuj tę funkcję na kilku macierzach i porównaj czas jego działania z czasem
Linia 208: Linia 203:
return;
return;
end
end
for i=k+1:N #wyznaczenie <math>\displaystyle k</math>-tej kolumny <math>\displaystyle L</math>
for i=k+1:N #wyznaczenie <math>k</math>-tej kolumny <math>L</math>
A(i,k) = A(i,k)/A(k,k);
A(i,k) = A(i,k)/A(k,k);
end
end
for j=k+1:N #modyfikacja podmacierzy <math>\displaystyle A_{22} = A_{22} - l_{21}u_{12}^T</math>  
for j=k+1:N #modyfikacja podmacierzy <math>A_{22} = A_{22} - l_{21}u_{12}^T</math>  
for i=k+1:N  
for i=k+1:N  
A(i,j) -= A(i,k)*A(k,j);
A(i,j) -= A(i,k)*A(k,j);
Linia 223: Linia 218:
   
   
Jednak w tej implementacji mamy do czynienia z nawet potrójnie zagnieżdżonymi
Jednak w tej implementacji mamy do czynienia z nawet potrójnie zagnieżdżonymi
pętlami, co dla nawet średnich <math>\displaystyle N</math> może być powodem sporego spowolnienia
pętlami, co dla nawet średnich <math>N</math> może być powodem sporego spowolnienia
algorytmu. Warto więc uniknąć pętli, odwołując się do instrukcji wektorowych i
algorytmu. Warto więc uniknąć pętli, odwołując się do instrukcji wektorowych i
blokowych.
blokowych.
Linia 236: Linia 231:
return;
return;
end
end
#wyznaczenie <math>\displaystyle k</math>-tej kolumny <math>\displaystyle L</math>
#wyznaczenie <math>k</math>-tej kolumny <math>L</math>
A(k+1:N,k) = A(k+1:N,k)/A(k,k);
A(k+1:N,k) = A(k+1:N,k)/A(k,k);
#modyfikacja podmacierzy <math>\displaystyle A_{22} = A_{22} - l_{21}u_{12}^T</math>  
#modyfikacja podmacierzy <math>A_{22} = A_{22} - l_{21}u_{12}^T</math>  
A(k+1:N,k+1:N) -= A(k+1:N,k)*A(k,k+1:N);
A(k+1:N,k+1:N) -= A(k+1:N,k)*A(k,k+1:N);
end
end
Linia 268: Linia 263:
</pre></div>  
</pre></div>  
   
   
Dla macierzy losowych wymiaru <math>\displaystyle N=100</math> dostaliśmy na Pentium 1.5GHz  
Dla macierzy losowych wymiaru <math>N=100</math> dostaliśmy na Pentium 1.5GHz  


{| border=1
{| border=1
Linia 277: Linia 272:
| Czas (s)  ||  4.0436e-03  ||  1.5877e+01  ||    1.0767e-01  
| Czas (s)  ||  4.0436e-03  ||  1.5877e+01  ||    1.0767e-01  
|-
|-
| Błąd <math>\displaystyle ||LU-A||_\infty</math>  ||  3.4596e-13  ||  8.0747e-13  ||  8.0747e-13
| Błąd <math>||LU-A||_\infty</math>  ||  3.4596e-13  ||  8.0747e-13  ||  8.0747e-13


|}
|}
Linia 296: Linia 291:
wykracza poza zakres naszego kursu.
wykracza poza zakres naszego kursu.


Funkcja wykorzystująca gotowy rozkład LU do rozwiązania układu <math>\displaystyle Ax=b</math> w MATLABie miałaby postać
Funkcja wykorzystująca gotowy rozkład LU do rozwiązania układu <math>Ax=b</math> w MATLABie miałaby postać


  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>function x = sol(L,U,b)
  <div style="margin: 1em; padding:1em; color: #006; background-color:#fcfcfc;"><pre>function x = sol(L,U,b)
Linia 314: Linia 309:
<div class="exercise">
<div class="exercise">


Podaj sposób taniego wyznaczenia rozwiązania sekwencji <math>\displaystyle k<N</math> układów równań z tą
Podaj sposób taniego wyznaczenia rozwiązania sekwencji <math>k<N</math> układów równań z tą
samą macierzą <math>\displaystyle A\in R^{N\times N}</math> i różnymi prawymi stronami:
samą macierzą <math>A\in R^{N\times N}</math> i różnymi prawymi stronami:
<center><math>\displaystyle
<center><math>
Ax_i = b_i, \qquad i = 1,\ldots,k.
Ax_i = b_i, \qquad i = 1,\ldots,k</math></center>
</math></center>


Układy równań z tą samą macierzą, ale ze  zmieniającą się prawą stroną równania
Układy równań z tą samą macierzą, ale ze  zmieniającą się prawą stroną równania
Linia 324: Linia 318:


<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"> Wystarczy tylko <strong>jeden raz</strong> wyznaczyć rozkład LU macierzy <math>\displaystyle A</math> </div>
<div style="font-size:smaller; background-color:#f9fff9; padding: 1em"> Wystarczy tylko <strong>jeden raz</strong> wyznaczyć rozkład LU macierzy <math>A</math> </div>
</div></div>
</div></div>


Linia 333: Linia 327:


{{algorytm|||
{{algorytm|||
<pre>\EATWSZnajdź rozkład <math>\displaystyle PA = LU</math>;
<pre>Znajdź rozkład <math>PA = LU</math>;
Utwórz macierz <math>\displaystyle B = [b_1,\ldots,b_k]</math>;
Utwórz macierz <math>B = [b_1,\ldots,b_k]</math>;
Rozwiąż <math>\displaystyle LY = B</math>;
Rozwiąż <math>LY = B</math>;
Rozwiąż <math>\displaystyle UX = Y</math>;
Rozwiąż <math>UX = Y</math>;
</pre>}}
</pre>}}


Rozwiązanie każdego z układów <math>\displaystyle LY = B</math> i <math>\displaystyle UX = Y</math> można przyspieszyć, tworząc
Rozwiązanie każdego z układów <math>LY = B</math> i <math>UX = Y</math> można przyspieszyć, tworząc
warianty algorytmów podstawienia w przód i w tył, operujące od razu na wszystkich kolumnach macierzy <math>\displaystyle B</math>. Zaimplementowano je w [http://www.netlib.org/lapack  LAPACKu], w tandemie
warianty algorytmów podstawienia w przód i w tył, operujące od razu na wszystkich kolumnach macierzy <math>B</math>. Zaimplementowano je w [http://www.netlib.org/lapack  LAPACKu], w tandemie
funkcji <code style="color: #903">DGETRF</code> (rozkład) i <code style="color: #903">DGETRS</code> (rozwiązanie) oraz w
funkcji <code style="color: #903">DGETRF</code> (rozkład) i <code style="color: #903">DGETRS</code> (rozwiązanie) oraz w
<code style="color: #903">DGESV</code>, łączącej funkcjonalność obu.
<code style="color: #903">DGESV</code>, łączącej funkcjonalność obu.
Linia 350: Linia 344:


Bardzo rzadko w praktyce numerycznej zdarza się potrzeba obliczenia wartości
Bardzo rzadko w praktyce numerycznej zdarza się potrzeba obliczenia wartości
wyznacznika macierzy <math>\displaystyle A \in R^{N \times N}</math>. Zaproponuj metodę obliczania
wyznacznika macierzy <math>A \in R^{N \times N}</math>. Zaproponuj metodę obliczania
<math>\displaystyle  \mbox{det} (A)</math> oraz wskaż, jakiego rodzaju problemy numeryczne możesz napotkać.
<math>\mbox{det} (A)</math> oraz wskaż, jakiego rodzaju problemy numeryczne możesz napotkać.
</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">   
Wystarczy wykonać rozkład <math>\displaystyle PA=LU</math>. Wtedy  
Wystarczy wykonać rozkład <math>PA=LU</math>. Wtedy  


<center><math>\displaystyle  \mbox{det}  A\,=\,(-1)^p u_{11}u_{22}\cdots u_{nn},  
<center><math>\mbox{det}  A\,=\,(-1)^p u_{11}u_{22}\cdots u_{nn},  
</math></center>
</math></center>


gdzie <math>\displaystyle p</math> jest liczbą przestawień wierszy w eliminacji. Tak więc, koszt
gdzie <math>p</math> jest liczbą przestawień wierszy w eliminacji. Tak więc, koszt
obliczenia wyznacznika to <math>\displaystyle O(N^3)</math>.
obliczenia wyznacznika to <math>O(N^3)</math>.


Kłopoty numeryczne możemy mieć z reprezentacją samej wartości wyznacznika w
Kłopoty numeryczne możemy mieć z reprezentacją samej wartości wyznacznika w
arytmetyce zmiennoprzecinkowej. Ponieważ
arytmetyce zmiennoprzecinkowej. Ponieważ


<center><math>\displaystyle  \mbox{det}  (cA) = c^N A,
<center><math>\mbox{det}  (cA) = c^N A</math>,</center>
</math></center>


to dość łatwo będzie trafić (przy większych niż średnich wartościach <math>\displaystyle N</math>) na wartości wyznacznika, które będą albo potwornie duże, albo potwornie małe. Zresztą, zrób eksperyment:  
to dość łatwo będzie trafić (przy większych niż średnich wartościach <math>N</math>) na wartości wyznacznika, które będą albo potwornie duże, albo potwornie małe. Zresztą, zrób eksperyment:  


Najpierw z losową macierzą <math>\displaystyle 100\times 100</math> i jej krotnościami...
Najpierw z losową macierzą <math>100\times 100</math> i jej krotnościami...


<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>octave:26> A=rand(100);
<div style="font-family: monospace; white-space: pre; border-style: dashed; border-width: thin; border-color: black; margin: 1em; padding:1em; color: #444; background-color:#fdfdfd;"><nowiki>octave:26> A=rand(100);
Linia 396: Linia 389:
Można sobie z
Można sobie z
tym poradzić, szacując wpierw rząd wielkości wyznacznika, a następnie
tym poradzić, szacując wpierw rząd wielkości wyznacznika, a następnie
reprezentując jego wartość w formie cecha--mantysa, np. jako parę liczb <math>\displaystyle m,c</math>
reprezentując jego wartość w formie cecha--mantysa, np. jako parę liczb <math>m,c</math>
takich, że <math>\displaystyle  \mbox{det} (A) = m\cdot 10^c</math>, ale  
takich, że <math>\mbox{det} (A) = m\cdot 10^c</math>, ale  
dopasowując obie tak, by nie nastąpił ani nadmiar, ani niedomiar.  
dopasowując obie tak, by nie nastąpił ani nadmiar, ani niedomiar.  


</div></div></div>
</div></div></div>

Aktualna wersja na dzień 21:45, 11 wrz 2023


Rozwiązywanie układów równań liniowych

<<< Powrót do strony głównej przedmiotu Metody numeryczne

Oglądaj wskazówki i rozwiązania __SHOWALL__
Ukryj wskazówki i rozwiązania __HIDEALL__

Uwaga

Niektóre fragmenty zadań wymagają wykorzystania procedur LAPACKa; te części odłóż do momentu, gdy opanujesz następny wykład, dotyczący m.in. bibliotek algebry liniowej.

Ćwiczenie: Metoda Cholesky'ego

Ważnym przykładem macierzy szczególnej postaci są macierze symetryczne i dodatnio określone. Są to macierze spełniające warunki:

A=ATorazxTAx>0,x0

Dla takich macierzy można nieco zmniejszyć koszt kombinatoryczny i zużycie pamięci, przeprowadzając trochę inny rozkład na macierze trójkątne: tak, aby otrzymać rozkład

A=LDLT

zamiast PA=LU, przy czym L jest tu jak zwykle macierzą trójkątną dolną z jedynkami na przekątnej, a D jest macierzą diagonalną z dodatnimi elementami na diagonali. Opracuj taki algorytm. W jego implementacji możesz porównywać się z procedurą LAPACKa DPOSV. Inny wariant tego samego rozkładu to tak zwany rozkład Cholesky'ego--Banachiewicza, w którym, przy tych samych założeniach na A, szukamy rozkładu wykorzystującego tylko jedną macierz trójkątną dolną:

A=L~L~T,

(oczywiście tym razem nie żądamy, aby L~ miała na diagonali jedynki). Jaka jest relacja między rozkładem LDLT a L~L~T?

Rozwiązanie

Ćwiczenie: Mnożyć przez odwrotność to nie zawsze to samo...

W Octave układ równań Ax=b rozwiązujemy korzystając z "operatora rozwiązywania równania"

x = A \ b;

Ale w Octave jest także funkcja inv, wyznaczająca macierz odwrotną, więc niektóre (nie najlepsze, oględnie mówiąc) podręczniki zalecają

x = inv(A)*b;

Przedyskutuj, które podejście jest lepsze i dlaczego. Przeprowadź eksperymenty numeryczne weryfikujące twoją tezę.

Rozwiązanie

Ćwiczenie: Wybór elementu głównego jest naprawdę ważny!

Rozwiąż prosty układ równań

1018x1+x2=1,x1+2x2=4,

czterema sposobami:

  • na kartce papieru (dokładnie!)
  • w komputerze, w arytmetyce podwójnej precyzji, korzystając z rozkładu LU bez wyboru elementu głównego
  • jak poprzednio, ale z wyborem elementu głównego w kolumnie
  • w LAPACKu lub Octave.

Porównaj uzyskane rozwiązania i wyciągnij wnioski.

Rozwiązanie

Ćwiczenie

Zapisz w Octave algorytm rozkładu LU macierzy (bez wyboru elementu głównego) działający in situ.

Wskazówka

Wykorzystaj go do napisania funkcji, która rozwiąże układ równań Ax=b.

Przetestuj tę funkcję na kilku macierzach i porównaj czas jego działania z czasem wykonania operacji x = A\b.

Spróbuj zastosować swój algorytm do kilku specjalnych macierzy:

  • Hilberta dużego wymiaru
  • diagonalnej z jednym elementem bardzo małym (a nawet równym zero)
Rozwiązanie

Ćwiczenie: Układy równań z wieloma prawymi stronami

Podaj sposób taniego wyznaczenia rozwiązania sekwencji k<N układów równań z tą samą macierzą ARN×N i różnymi prawymi stronami:

Axi=bi,i=1,,k

Układy równań z tą samą macierzą, ale ze zmieniającą się prawą stroną równania powstają często na przykład przy rozwiązywaniu równań różniczkowych cząstkowych, gdzie prawa strona układu odpowiada zmieniającym się warunkom brzegowym.

Wskazówka
Rozwiązanie

Ćwiczenie: Obliczanie wyznacznika macierzy

Bardzo rzadko w praktyce numerycznej zdarza się potrzeba obliczenia wartości wyznacznika macierzy ARN×N. Zaproponuj metodę obliczania det(A) oraz wskaż, jakiego rodzaju problemy numeryczne możesz napotkać.

Rozwiązanie