Lista nr 5
Transkrypt
Lista nr 5
Obliczenia naukowe – Paweł Zieliński 1 Obliczenia naukowe Lista nr 5 (laboratorium) Jednostka badawcza dużej firmy działającej w branży chemicznej prowadzi intensywne badania. Wynikiem tych badań są modele pewnych zjawisk chemii kwantowej. Rozwiązanie tych modeli, w pewnym szczególnym przypadku, sprowadza się do rozwiązania układu równań liniowych Ax = b . dla danej macierzy współczynników A ∈ Rn×n i wektora prawych stron b ∈ Rn . Macierz A jest rzadką, tj. mającą dużą elementów zerowych, i blokową o następującej strukturze: A1 C 1 0 0 0 ··· 0 B 2 A2 C 2 0 0 ··· 0 0 B 3 A3 C 0 · · · 0 3 .. .. .. .. .. .. A = ... (1) , . . . . . . 0 · · · 0 B v−2 A v−2 C v−2 0 0 ··· 0 0 B v−1 A v−1 C v−1 0 ··· 0 0 0 Bv Av v = n/ℓ, zakładając, że n jest podzielne przez ℓ, gdzie ℓ jest rozmiarem wszystkich kwadratowych macierzy wewnętrznych (bloków): A k , B k i C k . Mianowicie, A k ∈ Rℓ×ℓ , k = 1, . . . , v jest macierzą gęstą, 0 jest kwadratową macierzą zerową stopnia ℓ, macierz B k ∈ Rℓ×ℓ , k = 2, . . . , v jest następującej postaci: 0 · · · 0 bk1 0 · · · 0 bk2 Bk = . .. .. , .. . . 0 · · · 0 bkℓ B k ma tylko jedną, ostatnią, kolumnę niezerową. Natomiast C k ∈ Rℓ×ℓ , k = 1, . . . , v − 1 jest macierzą diagonalną: k 0 0 ··· 0 c1 0 ck2 0 ··· 0 .. . . .. . .. .. Ck = . . . . . 0 ··· 0 ckℓ−1 0 0 ··· 0 0 ckℓ Firma napotkała problem z efektywnym rozwiązaniem problemu Ax = b , gdzie A jest postaci (1). Chodzi przede wszystkim o wymagania czasowe i pamięciowe, które wynikają z bardzo dużego rozmiaru macierzy (n jest bardzo duże). W konsekwencji wyklucza to pamiętanie macierzy A jako tablicę n × n oraz użycie standardowych (bibliotecznych) algorytmów dla macierzy gęstych (tj. takich, gdzie nie zakłada się dużej liczby elementów zerowych). Zatem jedynym podejściem do rozwiązania tego problemu jest specjalna struktura pamiętająca efektywnie macierz A , która pamięta tylko elementy niezerowe i adaptacja standardowych algorytmów tak, aby uwzględniały postać macierzy (1), tj. jej rzadkość, regularność występowania elementów zerowych i niezerowych (jeżeli ℓ jest stałą, to czas O(n3 ) można zredukować do O(n)) 1. Napisać funkcję rozwiązującą układ Ax = b metodą eliminacji Gaussa uwzględniającą specyficzną postać (1) macierzy A dla dwóch wariantów: (a) bez wyboru elementu głównego, (b) z częściowym wyborem elementu głównego. Obliczenia naukowe – Paweł Zieliński 2 2. Napisać funkcję wyznaczającą rozkład LU macierzy A metodą eliminacji Gaussa uwzględniającą specyficzną postać (1) macierzy A dla dwóch wariantów: (a) bez wyboru elementu głównego, (b) z częściowym wyborem elementu głównego. Rozkład LU musi być efektywne pamiętany! 3. Napisać funkcję rozwiązującą układ równań Ax = b (uwzględniającą specyficzną postać (1) macierzy A ) jeśli wcześniej został już wyznaczony rozkład LU przez funkcję z punktu 2. Powyższe funkcje powinny być zaprogramowane w języku Julia umieszczone w module o nazwie blocksys. Aby efektywnie pamiętać macierze rzadkie należy się zapoznać z rozdziałem o Sparse Matrices (zob. [1]). Niewolno używać x=A\b i lufact. Wymagania dotyczące programów: Programy powinny umożliwiać • czytanie danej macierzy A i wektora prawych stron b z plików tekstowych, których format jest następujący (przykładowe dane umieszczone są na stronie kursu), dla macierzy A , gdzie zadane są tylko elementy niezerowe: n l i1 j1 i2 j2 i3 j3 ... ... EOF <--- rozmiar macierzy A, rozmiar macierzy Ak, Bk, Ck A[i1,j1] <--- indeksy i1,j1 i niezerowy element a[i1,j1] macierzy A A[i2,j2] <--- indeksy i2,j2 i niezerowy element a[i2,j2] macierzy A A[i3,j3] <--- indeksy i3,j3 i niezerowy element a[i3,j3] macierzy A dla wektora prawych stron b : n b[1] b[2] ... ... b[n] <--- rozmiar wektora b <--- skladowa nr 1 wektora b <--- skladowa nr 2 wektora b <--- skladowa nr n wektora b • czytanie danej macierzy A z pliku tekstowego (format opisany wyżej) oraz obliczanie wektora prawych stron b na podstawie wektora x (jak na liście nr 2), tj. b = Ax, gdzie x = (1, . . . , 1)T . Mnożenie macierzy przez wektor, Ax powinno uwzględniać postać (1) (macierz jest rzadka), x do pliku tekstowego, jeśli macierz A i wektor prawych • drukowanie obliczonego rozwiązania x̂ stron b były czytane z plików, x[1] <--- skladowa nr 1 wektora x x[2] <--- skladowa nr 2 wektora x ... ... x[n] <--- skladowa nr n wektora x x do pliku tekstowego, jeśli macierz A była czytana z pliku • drukowanie obliczonego rozwiązania x̂ a wektor prawych stron b był obliczany Obliczenia naukowe – Paweł Zieliński blad x[1] x[2] ... ... x[n] 3 <--- blad wzgledny <--- skladowa nr 1 wektora x <--- skladowa nr 2 wektora x <--- skladowa nr n wektora x • testowanie rozwiązywania Ax = b (funkcja z punktu 1 w dwóch wariantach wyboru elementu głównego), • testowanie rozwiązywania Ax = b dwuetapowo (funkcja z punktu 2 w dwóch wariantach wyboru elementu głównego i funkcja z punktu 3), tj. A = LU (funkcja z punktu 2 w dwóch wariantach wyboru elementu głównego), następnie LU x = b (funkcja z punktu 3). Dane testowe Przykład danych testowych znajduje się na stronie kursu (macierze są dobrze uwarunkowane). Macierze A o postaci (1) zapisywanej do pliku tekstowego, zgodnego z formatem opisanym wyżej, można generować za pomocą funkcji blockmat z modułu matrixgen.jl umieszczonego na stronie kursu. Wyniki eksperymentów Wyniki przedstawić w sprawozdaniu, plik pdf + wydruk, które powinno zawierać: 1. opis algorytmów - opis implementacji z analizą złożoności, 2. wyniki eksperymentów porównujących zaimplementowane algorytmy dla danych testowych (tabele, wykresy) oraz ich interpretację. 3. wnioski. Do sprawozdania należy dołączyć pliki z kodem (*.jl). Pliki powinny być skomentowane: imię i nazwisko autora (anonimy nie będą sprawdzane), komentarze zmiennych, Spakowane pliki wraz ze sprawozdaniem (*.zip) należy przesłać e-mailem prowadzącemu. Natomiast wydruk sprawozdania należy oddać prowadzącemu na laboratorium. Uwaga: Ostateczną wersję proszę programów przekompilować i przetestować pod linuksem. Na ocenę co najwyżej dobrą nie trzeba implementować punktu 2 i punktu 3 oraz testowania dwuetapowego. Literatura [1] J. Bezanson, S. Karpinski, V. Shah, A. Edelman, et al., Julia Language Documentation [2] A. Kiełbasiński, H. Schwetlick, Numeryczna algebra liniowa. Wprowadzenie do obliczeń zautomatyzowanych, wyd. 2, WNT, Warszawa 1994.