Czasem zadania obliczeniowe wymagają wykonania naprawdę wielkiej liczby obliczeń zmiennoprzecinkowych, przy czym wiele znanych, matematycznie równoważnych metod rozwiązywania takich zadań, ma diametralnie różne własności numeryczne. Bardzo ważną klasą takich intensywnych obliczeniowo zadań jest rozwiązywanie układów równań liniowych
W praktyce spotyka się zadania z
Okazuje się, że kilka znanych w matematyce sposobów rozwiązywania układów równań liniowych, takich jak:
- metoda wyznacznikowa (wzory Cramera)
- obliczenie macierzy
i następnie
Proste układy równań
Niektóre układy równań można bardzo łatwo rozwiązać. Zgodnie z zasadą, żetrudne zadania rozwiązujemy sprowadzając je do sekwencji łatwych zadań,w dalszej kolejności pokażemy, jak dowolny układ równań sprowadzić do sekwencji dwóch (czasem trzech) łatwych do rozwiązania układów równań. Ale... jakie układy równań są "łatwe"?
Układy z macierzą trójkątną
Rozważmy układ z macierzą trójkątnąUkłady z macierzą ortogonalną
Równie tanio można rozwiązać układ równańPodobnie, gdy
Metoda eliminacji Gaussa
W ogólnym przypadku, bardzo dobrym algorytmem numerycznego rozwiązywania układu równańPrzypuśćmy, że taki rozkład
-
oraz
, więc pierwszy wiersz
jest kopią pierwszego wiersza
,
-
, więc pierwsza kolumna
powstaje przez podzielenie wszystkich elementów wektora
przez element na diagonali
,
-
, a więc znalezienie podmacierzy
oraz
sprowadza się do znalezienia rozkładu LU zmodyfikowanego bloku
macierzy
, wymiaru
. Macierz
nazywamy uzupełnieniem Schura.
Ponadto zauważmy, że opisany algorytm możemy wykonać in situ (w miejscu), nadpisując elementy
Łatwo przekonać się, że
Jeśli więc do rozwiązywania układu równań
- Koszt znalezienia rozkładu
:
;
- Koszt rozwiązania układu
:
;
- Koszt rozwiązania układu
:
.
Wybór elementu głównego
Opisany powyżej algorytm rozkładu LU czasem może się niestety załamać: mianowicie wtedy, gdy napotka w czasie działania zerowy element w lewym górnym rogu zmodyfikowanej podmacierzy. Na przykład, macierzW praktyce obliczeniowej, aby uzyskać algorytm o możliwie dobrych własnościach numerycznych, wykorzystujemy tzw. strategię wyboru elementu głównego w kolumnie. Polega to na tym, że zanim wykonamy
- w pierwszej kolumnie podmacierzy
szukamy elementu o największym module (taki element, na mocy założenia nieosobliwości macierzy, jest niezerowy) --- to jest właśnie element główny
- zamieniamy ze sobą wiersz
z wierszem, w którym znajduje się element główny
- zapamiętujemy dokonaną permutację, bo potem --- gdy już przyjdzie do rozwiązywania układu równań --- będziemy musieli dokonać analogicznej permutacji wektora prawej strony
gdzie
jest pewną (zerojedynkową) macierzą permutacji (tzn. macierzą
identyczności z przepermutowanymi wierszami).
Oprócz wyboru elementu głównego w kolumnie, stosuje się czasem inne strategie, m.in. wybór w wierszu (analogicznie) oraz tzw. wybór pełny, gdy elementu głównego szukamy w całej podmacierzy
,
co znacznie zwiększa liczbę porównań niezbędnych do wskazania elementu
głównego, ale też trochę poprawia własności numeryczne takiego
algorytmu.
W praktyce, do przechowywania całej informacji o wykonanych permutacjach wystarcza pojedynczy wektor.
Oprócz wyboru elementu głównego w kolumnie, stosuje się czasem inne strategie, m.in. wybór w wierszu (analogicznie) oraz tzw. wybór pełny, gdy elementu głównego szukamy w całej podmacierzy
W praktyce, do przechowywania całej informacji o wykonanych permutacjach wystarcza pojedynczy wektor.
Złożoność obliczeniowa zadania rozwiązania układu równań liniowych
Z powyższego wynika, że łączny koszt rozwiązania równania liniowego poprzez rozkład LU wynosi
. Można zastanawiać się, jaka jest najmniejsza możliwa liczba operacji zmiennoprzecinkowych potrzebnych do rozwiązania układu równań liniowych.
Można pokazać, że minimalny koszt rozwiązania układu
równań
liniowych nie może być wyższego rzędu niż minimalny koszt mnożenia dwóch
macierzy
. Tymczasem znany jest całkiem prosty algorytm rekurencyjny,
wyznaczający iloczyn dwóch macierzy kosztem
(algorytm Strassena). Bardziej skomplikowany (i praktycznie
nieimplementowalny) algorytm Coppersmitha i Winograda daje nawet koszt
. Równania liniowe daje się więc (teoretycznie) rozwiązać
kosztem
.
Jednak w praktyce nawet prosty algorytm Strassena zazwyczaj nie
jest stosowany.
Wynika to stąd, że ma trochę gorsze własności numeryczne oraz, co
istotniejsze, wymaga dużo dodatkowej pamięci na przechowywanie
pośrednich wyników. Są jednak podejmowane wysiłki, by zmniejszyć te
ograniczenia algorytmu Strassena.
Brak komentarzy:
Prześlij komentarz