k - Wydział Chemii UJ

Transkrypt

k - Wydział Chemii UJ
Równanie postaci
a1x1 + a2x2 + ... + anxn = b
nazywamy równaniem liniowym o n niewiadomych x1, x2, ..., xn. Prawa strona równania b to
tzw. wyraz wolny.
Równanie liniowe postaci
a1x1 + a2x2 + ... + anxn = 0
nazywamy równaniem liniowym jednorodnym.
Rozpatrzmy dalej układ m równań liniowych o n niewiadomych:
a11 x1 + a12 x 2 + K + a1n x n = bn
a 21 x1 + a 22 x 2 + K + a 2 n x n = b2
K K K K K K K
a m1 x1 + a m 2 x 2 + K + a mn x n = bm
Układ taki moŜemy zapisać w postaci macierzowej:
= ,
gdzie to macierz m × n współczynników przy niewiadomych
 a11 a12 L a1n 
a
a 22 L a 2 n 
,
=  21
 M
M O M 


a m1 a m 2 L a mn 
to wektor n niewiadomych a – wektor m wyrazów wolnych (prawych stron równań):
 x1 
 b1 
x 
b 
=  2 ,
=  2.
M
M
 
 
 xn 
bm 
Jeśli = , to jest to jednorodny układ równań liniowych.
Jak widać, liczba niewiadomych nie musi być równa liczbie równań. Jeśli m > n (więcej
równań niŜ niewiadomych), to układ nazywamy nadokreślonym. Jeśli m < n, (mniej równań
niŜ niewiadomych, to układ nazywamy niedookreślonym).
Macierzą uzupełnioną macierzy nazywamy macierz m × (n+1) powstałą przez dopisanie
do macierzy kolumny wyrazów wolnych układu:
 a11 a12 L a1n b1 
a
a 22 L a 2 n b2 
21

.
=
 M
M O M M


a m1 a m 2 L a mn bm 
Istnienie rozwiązań układu moŜna określić badając rzędy macierzy A i U. Przypomnijmy
(wykład 1.3), Ŝe rząd macierzy jest równy liczbie liniowo niezaleŜnych kolumn (lub wierszy).
Dla praktycznego zastosowania dogodniejsze będzie równowaŜne określenie rzędu macierzy:
Podmacierzą kwadratową danej macierzy nazywamy dowolną macierz kwadratową, jaką
moŜna otrzymać wykreślając z naszej macierzy wiersze i kolumny (w szczególności macierz
kwadratowa jest swoją podmacierzą powstałą przez wykreślenie zero kolumn i zero wierszy).
Rząd macierzy jest równy stopniowi największej kwadratowej podmacierzy o niezerowym
wyznaczniku.
Prawdziwe jest następujące twierdzenie (Kroneckera-Capellego):
Niech A będzie macierzą współczynników równań układu m równań liniowych z n
niewiadomymi a U macierzą uzupełnioną tego układu.
1. Jeśli rank(A) = rank(U) = n, to istnieje dokładnie jedno rozwiązanie tego układu (układ jest
oznaczony)
2. Jeśli rank(A) = rank(U) = r < n, to układ ma nieskończenie wiele rozwiązań (jest
nieoznaczony) dających się wyrazić za pomocą n – r parametrów.
3. Jeśli rank(A) < rank(U), to układ nie ma rozwiązań (jest sprzeczny).
ZauwaŜmy, Ŝe warunek z pkt. 2 oznacza, Ŝe w układzie da się znaleźć podmacierz stopnia co
najwyŜej r o niezerowym wyznaczniku. n – r zmiennych, które nie weszły do wyznacznika (z
kolumn wykreślonych przy tworzeniu podmacierzy) moŜna potraktować jako parametry
słuŜące do określenia pozostałych r zmiennych.
Jeśli jakieś równania nie weszły do wyznacznika, z którego wyznaczono rząd A (zostały
wykreślone przy tworzeniu podmacierzy), to moŜna je pominąć (bo są liniowo zaleŜne od
pozostałych a więc wynikają z nich).
2.2 Jednorodny układ równań liniowych.
RozwaŜania dotyczące istnienia rozwiązań z pkt. 2.1 dotyczą zarówno jednorodnych jak i
niejednorodnych układów równań liniowych. PoniewaŜ układy jednorodne często pojawiają
się w problemach fizycznych, warto tu w sposób jawny wyartykułować wnioski z twierdzenia
Kroneckera-Capellego.
Jednorodny układ m równań liniowych z n niewiadomymi ma postać:
a11 x1 + a12 x 2 + K + a1n x n = 0
a 21 x1 + a 22 x 2 + K + a 2 n x n = 0
K K K K K K K
a m1 x1 + a m 2 x 2 + K + a mn x n = 0
,
czyli
Ax = 0.
ZauwaŜmy, Ŝe rank(A) = rank(U), bo dołoŜenie do macierzy kolumny z samych zer nie moŜe
zwiększyć jej rzędu. Wynika stąd wniosek, Ŝe na pewno istnieje jakieś rozwiązanie układu
niejednorodnego.
Rzeczywiście:
Jednorodny układ równań liniowych z n niewiadomymi ma zawsze rozwiązanie
x1 = x2 = ... = xn = 0.
Jest to tzw. rozwiązanie trywialne.
Jeśli rank(A) = n, to rozwiązanie trywialne jest jedynym, jeśli natomiast rank(A) < n, to
istnieją nietrywialne rozwiązania układu.
Inny waŜny wniosek dotyczy układu z kwadratową macierzą A:
Jednorodny układ n równań z n niewiadomymi ma nietrywialne rozwiązanie wtedy i tylko
wtedy, gdy det(A) = 0.
2.3 Wzory Cramera.
Zajmiemy się teraz układem n równań liniowych z n niewiadomymi:
Ax = b
(w szczególności moŜe być teŜ b = 0).
Oznaczmy
W = det(A) =
W1 =
b1
b2
a12
a 22
M
M
bn
a11
a12
L a1n
a 21
a 22
L a2n
M
a n1
M L M
a n 2 L a nn
L a1n
L a12
L
M
a n 2 L a nn
,
W2 =
a11
a 21
M
a n1
b1 L a1n
b2 L a 2 n
M
L
M
bn L a nn
,
… Wn =
a11
a 21
a12
a 22
M
M
a n1
L b1
L b2
L
M
a n 2 L bn
(czyli Wi to wyznacznik macierzy powstałej przez zastąpienie i-tej kolumny macierzy A
kolumną wyrazów wolnych.)
Jeśli W ≠ 0, to układ ma dokładnie jedno rozwiązanie, które zadane jest wzorami Cramera:
W
xi = i . (tw. Cramera)
W
Jeśli W = 0 i przynajmniej jeden z wyznaczników Wi jest róŜny od zera, to układ jest
sprzeczny.
Jeśli W = W1 = W2 = ... = Wn = 0, to równania są liniowo zaleŜne i układ moŜe być sprzeczny
lub nieoznaczony. W tym drugim przypadku eliminując równania zaleŜne liniowo od
pozostałych dostajemy układ niedookreślony.
Ze względu na koszt obliczania wyznaczników (por. 1.4) wzory Cramera nie nadają się do
praktycznego zastosowania przy rozwiązywaniu układów równań liniowych z wyjątkiem
małych wartości n.
ZauwaŜmy jeszcze, Ŝe gdy W (czyli det(A) ) ≠ 0, to istnieje A-1 i teoretycznie nasz układ
Ax = b
moŜna rozwiązać uŜywając macierzy odwrotnej do A
A-1Ax = A-1b
czyli
x = A-1b
PoniewaŜ jednak obliczenie macierzy odwrotnej z wykorzystaniem macierzy dopełnień
algebraicznych wymaga obliczania wyznaczników, takŜe i ten sposób nie nadaje się do
praktycznego zastosowania.
2.4 Eliminacja Gaussa. Rozkład LU.
Zajmijmy się niejednorodnym układem n równań liniowych z n niewiadomymi
a11 x1 + a12 x 2 + K + a1n x n = bn
a 21 x1 + a 22 x 2 + K + a 2 n x n = b2
K K K K K K K
a n1 x1 + a n 2 x 2 + K + a nn x n = bn
czyli
Ax = b.
Jego macierz uzupełniona ma postać:
 a11 a12 L a1n b1 
a
a 22 L a 2 n b2 
21

.
U=
 M
M O M M


a n1 a n 2 L a nn bn 
(pionową linią dla przejrzystości oddzieliliśmy kolumnę wyrazów wolnych)
Wykonując na układzie następujące operacje:
- zamiana dwu równań miejscami
- pomnoŜenie dowolnego równania przez niezerową stałą
- dodanie do dowolnego równania innego równania pomnoŜonego przez stałą
otrzymujemy układ równowaŜny, tzn. mający to samo rozwiązanie, co wyjściowy.
Operacjom tym odpowiadają działania na wierszach macierzy uzupełnionej:
- zamiana dwu wierszy
- pomnoŜenie wiersza przez niezerową stałą
- dodanie do wiersza innego wiersza pomnoŜonego przez stałą.
MoŜemy w ten sposób próbować przekształcić nasz układ do układu równowaŜnego, dla
którego łatwiej wyznaczyć rozwiązanie.
W tym celu od drugiego równania odejmijmy pierwsze pomnoŜone przez czynnik a21/a11, od
równania trzeciego równanie pierwsze pomnoŜone przez a31/a11, itd. aŜ do równania n-tego,
od którego odejmujemy pierwsze pomnoŜone przez an1/a11. W ten sposób przy pomocy
równania pierwszego wyzerowaliśmy współczynnik przy x1 w kolejnych równaniach (czyli w
pierwszej kolumnie macierzy U mamy zera z wyjątkiem pierwszego wiersza).
Następnie przy pomocy równania drugiego zerujemy współczynniki przy zmiennej x2 w
równaniu trzecim i następnych. Procedurę tę powtarzamy dla kolejnych równań.
Współczynnik przy eliminowanej zmiennej to tzw. element główny.
W wyniku tej procedury zwanej eliminacją Gaussa sprowadzamy macierz układu równań do
postaci trójkątnej górnej, tzn. wszystkie elementy pod główną przekątną są równe zero a
niezerowe znajdują się na niej i powyŜej. (Tak będzie, gdy det(A) ≠ 0, czyli układ ma
rozwiązanie; w przeciwnym wypadku pojawi się wiersz(e) z samych zer – patrz ćwiczenia).
Dla układu równań w tej postaci łatwo juŜ znaleźć rozwiązanie: zaczynamy od ostatniego
równania, przy którym mamy niezerowy współczynnik tylko przy ostatniej zmiennej, co
pozwala łatwo ją wyznaczyć. Wartość tej zmiennej podstawiamy do równania
przedostatniego, dzięki czemu moŜemy obliczyć przedostatnią zmienną. Kontynuując
podstawienia obliczonych zmiennych wyznaczamy z kolejnych równań następne aŜ do
równania pierwszego. Proces ten nazywamy podstawieniem wstecz.
Nietrudno zauwaŜyć, Ŝe tak samo łatwo moŜna rozwiązać układ równań liniowych z macierzą
trójkątną dolną – zaczynamy wtedy od pierwszego równania (a procedura to podstawienie w
przód).
Procedura eliminacji Gaussa pozwala rozwiązać lub stwierdzić brak rozwiązań nie tylko dla
układu równań z macierzą kwadratową, ale dla dowolnego układu m równań liniowych z n
niewiadomymi (patrz ćwiczenia).
W trakcie eliminacji moŜe się okazać, Ŝe współczynnik przy zmiennej, którą chcemy w
danym kroku eliminować z kolejnych równań (czyli element główny) jest równy 0. Wtedy
odszukujemy wśród następnych równań takie, przy którym współczynnik przy interesującej
nas zmiennej jest róŜny od zera, zamieniamy równania miejscami i kontynuujemy (jeśli nie da
się takiego znaleźć, to znaczy, Ŝe det(A) = 0).
W numerycznej realizacji tego algorytmu zamianę wierszy w macierzy (czyli przestawienie
równań) wykonuje się z jeszcze innego powodu. OtóŜ analiza błędów pokazuje, Ŝe
najkorzystniej dla dokładności rozwiązania jest wybierać w kaŜdym kroku największy co do
wartości bezwzględnej element główny. Najczęściej odbywa się to właśnie przez zamianę
równań (czyli tzw. częściowy wybór elementu głównego w kolumnie), ale moŜna wybierać
element główny w wierszu (zamieniając kolumny, co odpowiada przenumerowaniu
zmiennych) albo łączyć te obie strategie (pełny wybór elementu głównego).
ZauwaŜmy jeszcze, Ŝe współczynniki, przez jakie mnoŜyliśmy równania zaleŜą tylko od
macierzy współczynników A a nie zaleŜą od wyrazów wolnych b. Oznacza to, Ŝe gdy mamy
do rozwiązania kilka układów róŜniących się jedynie prawymi stronami, to macierz A
przekształcamy tylko raz (oczywiście musimy przekształcić wektory b, ale jest to znacznie
mniej kosztowne). Eliminacja Gaussa pozwala zatem efektywnie rozwiązywać układy o
wspólnej macierzy współczynników.
Eliminacja Gaussa ściśle wiąŜe się z rozkładem macierzy na iloczyn macierzy trójkątnych.
Jeśli A jest macierzą nieosobliwą (jej wyznacznik jest róŜny od 0), to istnieje jej
jednoznaczny rozkład na czyniki:
A = LU,
gdzie L jest macierzą trójkątną dolną o elementach diagonalnych równych 1 a U jest macierzą
trójkątną górną (rozkład trójkątny). (Bez określenia elementów diagonalnych którejś macierzy
rozkład nie byłby jednoznaczny).
Rozkład taki moŜna otrzymać przez eliminację Gaussa (macierz U to macierz układu równań
po eliminacji a macierz L tworzą mnoŜniki eliminacji). ZauwaŜmy jednak, Ŝe jeśli w czasie
eliminacji zamienialiśmy wiersze, to nie otrzymaliśmy rozkładu wyjściowej macierzy A,
tylko rozkład macierzy, która w porównaniu do A ma spermutowane wiersze.
Eliminacja Gaussa prowadzi zatem do rozkładu
PA = LU,
gdzie P to macierz permutacji. Iloczyn PA daje macierz z poprzestawianymi wierszami.
(Macierz P ma w kaŜdym wierszu i w kaŜdej kolumnie dokładnie jeden element równy 1,
pozostałe są równe 0).
Jeśli znamy rozkład trójkątny macierzy A, to moŜemy wykorzystać go do rozwiązania układu
Ax = b
dzięki temu, Ŝe łatwo rozwiązać układ z macierzą trójkątną górną (podstawienie wstecz) lub
dolną (podstawienie w przód).
Mamy bowiem
PA = LU
i obliczamy
b’ = Pb
następnie wyznaczamy c rozwiązując układ
Lc = b’
(łatwe, bo L jest trójkątna dolna)
a potem x rozwiązując układ
Ux = c
(teŜ łatwe, bo U jest trójkątna górna)
Koszt eliminacji Gaussa jest rzędu n3 mnoŜeń, koszt rozwiązania układu równań przy znanym
rozkładzie trójkątnym jest rzędu n2.
ZauwaŜmy jeszcze, Ŝe operacje, które wykonywaliśmy na macierzy A mogły najwyŜej
zmienić znak jej wyznacznika (zamiana wierszy). Oznacza to, Ŝe wyznacznik iloczynu LU z
dokładnością do znaku jest taki sam, jak wyznacznik A. PoniewaŜ wyznacznik iloczynu
macierzy jest równy iloczynowi wyznaczników, wyznacznik macierzy trójkątnej jest
iloczynem jej elementów diagonalnych a L ma na diagonali same jedynki, to z dokładnością
do znaku wyznacznik A jest równy iloczynowi elementów diagonalnych macierzy U. Znak
moglibyśmy ustalić na podstawie wyznacznika macierzy P (jest on równy ±1), ale zwykle nie
tworzy się macierzy permutacji a jedynie zapamiętuje informacje o przestawieniach wierszy
(transpozycje). Wystarczy potem policzyć, czy ich liczba była parzysta, czy nieparzysta.
Eliminacja Gaussa daje zatem moŜliwość efektywnego obliczania wyznaczników macierzy.
PokaŜmy jeszcze, Ŝe rozwiązywanie układów równań liniowych (eliminacja Gaussa) daje
narzędzie do praktycznego wyznaczania macierzy odwrotnej.
RozwiąŜmy bowiem n układów równań:
Axi = bi
Wektor bi ma i-tą składową równą 1, pozostałe są równe 0. Ustawiając obok siebie wektory bi
dostaniemy zatem macierz jednostkową I. Skoro wektory xi są rozwiązaniami powyŜszego
układu równań, to ustawiając je obok siebie dostajemy macierz X, która spełnia równanie
AX = I
Ale to oznacza przecieŜ, Ŝe X = A-1. Zatem macierz odwrotną do A dostajemy ustawiając
kolumnami rozwiązania układów równań liniowych z macierzą A i prawymi stronami, w
których kolejna składowa jest równa 1 a reszta 0. Dzięki rozkładowi trójkątnemu wymaga to
rzędu n3 mnoŜeń na rozkład + n · n2 mnoŜeń na rozwiązanie n układów równań.
Zapamiętajmy zatem wniosek: w praktyce numerycznej układu równań liniowych n × n nie
rozwiązuje się obliczając wyznaczniki, ani nie wykorzystuje się do tego macierzy odwrotnej.
Przeciwnie, rozwiązywania układu równań uŜywa się do obliczenia wyznacznika lub
znalezienia odwrotności macierzy.
2.5 Rozkład Cholesky’ego.
Omówiony wyŜej rozkład LU nie jest jedynym moŜliwym. Przy znajdowaniu rozkładu
macierzy na iloczyn czynników trójkątnych często ułatwieniem bywa szczególna postać
macierzy.
Rozkład A = LU macierzy symetrycznej dodatnio określonej (patrz 1.3) moŜna przedstawić w
innej postaci wykorzystując zachodzącą równość
LT = D-1U,
gdzie D = diag(di), di > 0
Wtedy
DLT = DD-1U
DLT = U
i rozkład moŜna przedstawić w postaci symetrycznej
A = LDLT
Przyjmując
Lˆ = LD1/2 , gdzie D1/2 = diag d k
( )
mamy rozkład A = Lˆ Lˆ T (daszek ^ uŜyty tu został jedynie po to, by odróŜnić czynniki
trójkątne dolne we wzorze wyŜej).
Symetryczny rozkład macierzy symetrycznej i dodatnio określonej postaci
A = LLT
nazywamy rozkładem Cholesky’ego.
Dysponując rozkładem Cholesky’ego macierzy A moŜemy rozwiązać układ
Ax = b
wyznaczając c z trójkątnego układu
Lc = b
a następnie x rozwiązując układ trójkątny
LTx = c
Wyznacznik macierzy A moŜna obliczyć jako kwadrat iloczynu diagonalnych elementów
macierzy L
 n 
det(A) =  ∏ lii 
 i =1 
2
II. WYBRANE ASPEKTY IMPLEMENTACJI ALGEBRY LINIOWEJ.
2.6 Ile operacji wymaga mnoŜenie macierzy?
Zastanówmy się, ile mnoŜeń wymaga pomnoŜenie dwu macierzy n × n. Ze wzoru
n
cij = ∑ aik bkj
(*)
k =1
wynika, Ŝe dla obliczenia pojedynczego elementu macierzy wynikowej musimy wysumować
iloczyny przechodząc przez wiersz pierwszej macierzy (kolumnę drugiej), czyli mamy n
mnoŜeń. PoniewaŜ musimy obliczyć wszystkie n2 elementów, potrzebujemy wykonać n⋅n2 =
n3 mnoŜeń. Organizacja obliczeń bezpośrednio odpowiadająca wzorowi na element macierzy
oznacza więc koszt mnoŜenia macierzy rzędu n3.
Zobaczmy to na macierzach 2 × 2:
 c11 c12   a11 a12  b11
c
=

 21 c 22  a 21 a 22  b21
Potrzeba 23 = 8 mnoŜeń.
c11 = a11b11 + a12b21
c12 = a11b12 + a12b22
c21 = a21b11 + a22b21
c22 = a21b12 + a22b22
b12 
b22 
Jak się jednak okazuje, moŜna wykonać obliczenia wykonując jedynie 7 mnoŜeń, za to
kosztem dodatkowych dodawań:
M1 = (a11 + a22)(b11+ b22)
M2 = (a21 + a22)b11
M3 = a11(b12 – b22)
M4 = a22(b21 – b11)
(**)
M5 = (a11 + a12)b22
M6 = (a21 – a11)(b11 + b12)
M7 = (a12 – a22)(b21 + b22)
wtedy
c11 = M1 + M4 – M5 + M7
c12 = M3 + M5
c21 = M2 + M4
c22 = M1 – M2 + M3 + M6
Redukcja liczby mnoŜeń o 1 nie wydaje się być warta zwiększenia liczby dodawań i
komplikacji algorytmu, ale...
ZauwaŜmy, Ŝe jeśli macierz o wymiarze 2n × 2n podzielimy na bloki o wymiarze n × n, to
wzór (*) pozostaje prawdziwy dla bloków macierzy:
C11 C12   A 11 A 12   B11 B12 
C
=

.
 21 C 22   A 21 A 22  B 21 B 22 
MoŜemy zatem zastosować powyŜsze wzory do bloków macierzy.
Na tym opiera się algorytm Strassena. MnoŜąc macierze kwadratowe stopnia 2n (inne
moŜemy uzupełnić kolumnami i wierszami z zer do potrzebnego rozmiaru) dzielimy je na
bloki stopnia 2n-1, dla których moŜemy zastosować wzory (**). W celu obliczenia
potrzebnych iloczynów moŜemy te bloki znowu podzielić na bloki stopnia 2n-2 i zastosować
(**). MoŜemy postępować tak rekurencyjnie, aŜ dojdziemy do mnoŜenia liczb (macierzy
1 × 1). W praktyce przy dostatecznie małych macierzach przechodzimy do klasycznego
mnoŜenia macierzy. Istota redukcji czasu obliczeń zasadza się na tym, Ŝe zyskujemy jedno
mnoŜenie z ośmiu na kaŜdym etapie. Przy dostatecznie duŜych macierzach zysk na
mnoŜeniach przewaŜa koszty dodatkowych dodawań.
Algorytm Strassena potrzebuje n log 2 7 ≈ n2.807 mnoŜeń. Widać zysk w porównaniu do
klasycznego n3.
Najszybszy znany obecnie algorytm Coppersmitha-Winograda wymaga n2.376 mnoŜeń.
2.7 Biblioteki algebry liniowej. BLAS i LAPACK.
Zagadnienia algebry liniowej powszechnie pojawiają się w zadaniach numerycznych w
naukach ścisłych, często dla bardzo duŜych zagadnień. Niezwykle waŜna jest zatem ich
efektywna implementacja w językach programowania. Tworzenie potrzebnych procedur od
podstaw przez kaŜdego uŜytkownika byłoby stratą czasu i prowadziłoby do mało wydajnych
kodów. Problem ten rozwiązują powszechnie dostępne biblioteki procedur numerycznych,
pozwalające na budowę efektywnie działających programów przy minimalnej znajomości
metod numerycznych.
Ze względów historycznych znaczna część tych bibliotek napisana jest w Fortranie (język ten
powstał do programowania obliczeń naukowych, na co wskazuje jego nazwa: FORmula
TRANslator).
Podstawowe cegiełki do rozwiązywania zagadnień algebry liniowej zawiera biblioteka BLAS
(Basic Linear Algebra Subprograms) napisana w Fortranie. Procedury biblioteki BLAS
podzielone są na 3 poziomy:
BLAS level 1: operacje wektorowe typu αx + y, takŜe obliczanie iloczynów skalarnych i
norm
BLAS level 2: operacje macierz-wektor typu αAx + βy, takŜe inne procedury, np.
rozwiązywanie układu Tx = y z trójkątną macierzą T
BLAS level 3: operacje macierz-macierz typu αAB + βC
W bibliotece BLAS stosuje się konwencję kodowania w nazwie procedury informacji o
precyzji zmiennych uŜywanych w obliczeniach, typu macierzy i wykonywanej operacji.
Operacje zdefiniowane są dla czterech dokładności (odpowiednie typy zmiennych w
Fortranie):
S – rzeczywiste, pojedyncza dokładność
D – rzeczywiste, podwójna dokładność
C – zespolone, pojedyncza dokładność
Z – zespolone, podwójna dokładność
Przykładowe typu macierzy to:
GE – ogólna
SY – symetryczna
HE – hermitowska
TR – trójkątna
Zaś przykładowe kody operacji to:
DOT – iloczyn skalarny
AXPY – suma wektorów αx + y
MV – mnoŜenie macierz-wektor Ax
SV – rozwiązanie układu macierz-wektor
MM – mnoŜenie macierzy
SM – rozwiązanie układu macierz-macierz
Przykłady:
poziom 1
SSCAL, DSCAL, CSCAL, ZSCAL obliczają αx w odpowiedniej dokładności i dla danegu
typu danych
SDOT i DDOT obliczają iloczyn skalarny dwu rzeczywistych wektorów odpowiednio w
pojedynczej lub podwójnej dokładności
DNRM2 i ZNRM2 obliczają w podwójnej dokładności normę euklidesową odpowiednio
wektora rzeczywistego i zespolonego
poziom 2
SGEMV, DGEMV obliczają iloczyn Ax dla ogólnej macierzy A
CHEMV, ZHEMV obliczają iloczyn macierz –wektor dla macierzy hermitowskiej
STRSV, DTRSV rozwiązują dla liczb rzeczywistych układ z macierzą trójkątną Tx
poziom 3
SGEMM, DGEMM, CGEMM, ZGEEM – mnoŜenie macierzy, w tym procedura mnoŜenia
macierzy rzeczywistych w podwójnej dokładności powszechnie stosowana w testach
mierzących szybkość komputerów.
STRSM, DTRSM, CTRSM, ZTRSM rozwiązywanie układu trójkątnego z wieloma prawymi
stronami
Operacja wykonywana przez procedurę moŜe być bardziej rozbudowana, niŜ moŜna by było
przypuszczać z nazwy, np. DGEMM wykonuje operację
αAB + βC
przy czym jedna z macierzy A i B lub obie moŜe być wcześniej poddana transpozycji.
Zwykłemu obliczaniu AB odpowiada wyłączenie transponowania oraz ustawienie α=1, β=0.
Kody źródłowe procedur w Fortranie 77 dostępne są na stronie Netlib
http://www.netlib.org/blas/
Tym niemniej nie naleŜy ich kompilować samodzielnie. Pod róŜnymi systemami
operacyjnymi dostępne są bowiem skompilowane wersje biblioteki zapewniające lepszą
wydajność. Oprócz bibliotek dostępnych pod większość wersji Linuxa istnieją takŜe biblioteki
zawierające BLASa zoptymalizowane przez producenta konkretnej architektury, np.
– Intel Math Kernel Library (procesory Intel)
– AMC Core Math Library (AMD)
– implementacje firm HP, SGI czy Sun
Istnieją takŜe interfejsy BLASa do języka C.
Rozwiązania podstawowych problemów algebry liniowej zawiera biblioteka LAPACK
(Linear Algebra PACKage) stworzona w języku Fortran 77. Obecnie istnieje wersja w
Fortranie 95 oraz implementacje w C i C++. Procedury LAPACKa bazują na operacjach
udostępnianych przez bibliotekę BLAS.
LAPACK stosuje podobną konwencję dotyczącą nazewnictwa, jak BLAS, tzn. pierwsza litera
nazwy podaje typ zmiennej i dokładność, dwie następne typ macierzy a trzy kolejne
wykonywaną operację.
Podprogramy biblioteki LAPACK pozwalają m.in. wykonywać faktoryzację macierzy,
rozwiązywać układy równań liniowych czy rozwiązywać zagadnienie własne.
PoniewaŜ rozwiązanie zagadnienia zwykle rozkłada się na etapy często bardzo wygodnie jest
korzystać z tzw. driver routines wywołujących odpowiednie podprogramy.
Na przykład procedura DGESV rozwiązuje w podwójnej dokładności układ równań
liniowych z ogólną macierzą wywołując w tym celu podprogram DGETRF przeprowadzający
rozkład LU a następnie uŜywającą DGETRS do rozwiązania układu trójkątnego.
Podobnie DPOSV jest driverem dla rozwiązania układu liniowego z macierzą symetryczną,
dodatnio określoną wywołującym DPOTRF dla przeprowadzenia rozkładu Cholesky’ego a
następnie DPOTRS dla rozwiązania układu z macierzą trójkątną.
Procedura DSYEV oblicza wartości i wektory własne symetrycznej, rzeczywistej macierzy
uŜywając m. in. DSYTRD do sprowadzenia jej przekształceniami ortogonalnymi do postaci
trójdiagonalnej i DSTEQR do znalezienia wartości i wektorów własnych trójdiagonalnej
macierzy symetrycznej metodą QR.
Oczywiście zamiast korzystać z driver routines moŜna uŜyć tzw. expert routines
(pozwalających określić więcej parametrów) lub budować rozwiązanie z podprogramów
rozwiązujących poszczególne etapy.
Kody źródłowe procedur LAPACKA są dostępne na stronie Netlib:
http://www.netlib.org/lapack/
jednak (podobnie jak w przypadku BLASa) najlepiej skorzystać ze skompilowanych bibliotek
dostępnych pod dany system operacyjny. Wspomniane wyŜej optymalizowane biblioteki typu
Intel MKL czy ACML zawierają takŜe procedury LAPACKa.
Procedury LAPACKA wykorzystywane są w popularnych pakietach obliczeniowych jak R,
Matlab, Octave, Scilab, itd.
Oprócz uŜycia gotowych skompilowanych bibliotek algebry liniowej istnieje moŜliwość
dopasowania pakietu w celu optymalnego wykorzystania moŜliwości konkretnego komputera,
np. przez optymalizację wykorzystania pamięci cache. Do automatycznego wygenerowania
zoptymalizowanego BLASa (i niektórych procedur LAPACKa) słuŜy ATLAS (Automatically
Tuned Linear Algebra Software):
http://math-atlas.sourceforge.net/
W zastosowaniach algebry liniowej w chemii kwantowej pojawia się często potrzeba
znalezienia kilku wybranych wartości i wektorów własnych bardzo duŜej, rzadkiej (tzn.
mającej mało niezerowych elementów) macierzy. Do takich celów tworzone są specjalne
biblioteki, np. ARPACK
http://www.caam.rice.edu/software/ARPACK/
III. RÓWNANIA NIELINIOWE.
2.8 Metoda bisekcji. Metoda Netwona. Metoda siecznych.
Zajmiemy się teraz znajdowaniem miejsc zerowych nieliniowej funkcji jednej zmiennej, czyli
rozwiązywaniem równania:
f(x) = 0.
Pierwsza z metod to metoda bisekcji (połowienia przedziału). Opiera się na fakcie, iŜ jeśli
funkcja f jest funkcją ciągłą w przedziale [a,b] i jej wartości na końcach przedziału mają
róŜne znaki, to funkcja ta musi mieć zero w przedziale (a,b). Obliczamy zatem c = 12 (a + b )
(środek przedziału) i sprawdzamy znak f(c). Wybieramy następnie ten z przedziałów [a,c]
oraz [c,b], na którego końcach wartości funkcji mają róŜne znaki. Otrzymujemy w ten sposób
przedział dwa razy krótszy od poprzedniego, zawierający zero funkcji i całą procedurę
moŜemy powtórzyć. Błąd, z jakim wyznaczamy miejsce zerowe funkcji określony jest przez
długość przedziału. Proces kontynuujemy do momentu, aŜ długość przedziału zmaleje poniŜej
pewnej dostatecznie małej wielkości, albo do chwili, gdy wartość funkcji w środku przedziału
będzie dostatecznie bliska zeru.
Oczywiście, jeśli przegapimy nieciągłość funkcji, to metoda moŜe znaleźć się w kłopotach:
[
a
]
b
Druga metoda – metoda Newtona wykorzystuje wzór Taylora. Niech r będzie szukanym
zerem funkcji, a x jego przybliŜeniem. Jeśli istnieją odpowiednie pochodne funkcji f, to mamy
0 = f(r) = f(x + h) = f(x) + hf’(x) + ...
gdzie h = r – x.
Jeśli h jest małe (czyli jesteśmy blisko zera), to moŜemy pominąć człony z wyŜszymi
potęgami h i dostajemy
f(x) + hf’(x) = 0,
skąd
f ( x)
h=−
.
f ' ( x)
Zatem z wyjściowego przybliŜenia pierwiastka x dostajemy lepsze, równe
f ( x)
x−
.
f ' ( x)
W metodzie Newtona zakładamy zatem startowe przybliŜenie miejsca zerowego x0 a
następnie rekurencyjnie obliczamy lepsze przybliŜenia:
x n +1 = x n −
f ( xn )
.
f ' ( xn )
Metoda Newtona przybliŜa badaną funkcję liniową. Graficznie oznacza to, Ŝe rysujemy
styczną do wykresu funkcji f w punkcie bliskim zeru r i znajdujemy punkt, w którym przecina
ona oś x (dający nam lepsze przybliŜenie zera funkcji).
f(x)
f(xn)
r
xn+1
xn
Dla pewnych funkcji metoda będzie miała powaŜne problemy ze zbieŜnością:
f(x)
f(x0)
x1
r
x0
x2
f(x1)
Jeśli jednak metoda działa, to zbieŜność jest szybka. Okazuje się, Ŝe jeśli r jest zerem
pojedynczym f i f” jest ciągła, to istnieje takie otoczenie punktu r, Ŝe startując z tego
otoczenia metoda zbieŜna jest do r.
Metoda Newtona wymaga obliczania pochodnej funkcji. MoŜna spróbować zastąpić
pochodną f’(x) ilorazem róŜnicowym:
f ' ( xn ) ≈
f ( x n ) − f ( x n −1 )
.
x n − x n −1
Otrzymujemy wtedy metodę siecznych:
x n − x n −1
.
f ( x n ) − f ( x n −1 )
Do startu obliczeń potrzeba dwu punktów początkowych; znalezienie kaŜdej kolejnej wartości
xn+1 wymaga obliczenia jednej nowej wartości funkcji.
Graficzna interpretacja metody siecznych róŜni się od metody Newtona zastąpieniem stycznej
sieczną.
x n +1 = x n − f ( x n )
f(x)
f(xn-1)
f(xn)
r
xn+1 xn
xn-1
2.9 Układy równań nieliniowych.
Rozwiązanie układu równań nieliniowych bazuje na zastosowaniu wzoru Taylora. Na
przykład, dla układu dwu funkcji dwu zmiennych
f1(x1,x2) = 0
f2(x1,x2) = 0
zakładamy, Ŝe para (x1,x2) jest przybliŜonym rozwiązaniem. W celu obliczenia poprawek h1 i
h2 uŜywamy rozwinięcia Taylora funkcji dwu zmiennych zatrzymując tylko człony liniowe.
Mamy stąd
∂f
∂f
0 = f 1 ( x1 + h1 , x 2 + h2 ) ≈ f1 ( x1 , x 2 ) + h1 1 + h2 1
∂x1
∂x 2
∂f
∂f
0 = f 2 ( x1 + h1 , x 2 + h2 ) ≈ f 2 ( x1 , x 2 ) + h1 2 + h2 2
∂x1
∂x 2
Pochodne cząstkowe są tu obliczane w x1, x2.
Otrzymujemy stąd układ równań liniowych
 ∂f 1 / ∂x1 ∂f1 / ∂x 2   h1 
 f1 ( x1 , x 2 ) 
∂f / ∂x ∂f / ∂x  h  = −  f ( x , x )
1
2
2  2 
 2
 2 1 2 
Jego macierz to jakobian J czyli macierz pochodnych cząstkowych.
Jeśli macierz J jest nieosobliwa, to moŜemy rozwiązać ten układ wyznaczając poprawki h1 i
h2 dostając lepsze przybliŜenie rozwiązania (x1 + h1, x2 + h2).
Procedurę tę stosujemy iteracyjnie:
 x1( k +1)   x1( k )  h1( k ) 
 ( k +1)  =  ( k )  +  ( k ) 
 x 2   x 2   h2 
wyznaczając poprawki jako rozwiązania układu liniowego
h ( k ) 
 f ( x (k ) , x (k ) ) 
J  1( k )  = −  1 1( k ) 2( k )  .
h2 
 f 2 ( x1 , x 2 )
Analogicznie rozwiązujemy większe układy równań. Dla układu
fi(x1, x2, ..., xn) = 0
(1 ≤ i ≤ n)
mamy
 x1( k +1)   x1( k )  h1( k ) 
 ( k +1)   ( k )   ( k ) 
 x 2  =  x 2  +  h2  ,
 M   M   M 
 ( k +1)   ( k )   ( k ) 
 x n   x n  hn 
przy czym poprawki wyznaczamy rozwiązując układ n równań liniowych
h1( k ) 
 f 1 ( x1( k ) , x 2( k ) , L , x n( k ) ) 
 (k ) 


h2 
f 2 ( x1( k ) , x 2( k ) , L , x n( k ) ) 


J
=−
 M 


M
 (k ) 

(k )
(k )
(k ) 
hn 
 f n ( x1 , x 2 , L , x n )
z macierzą jakobianu
 ∂f1 / ∂x1 ∂f1 / ∂x 2 L ∂f 1 / ∂x n 
∂f / ∂x ∂f / ∂x L ∂f / ∂x 
1
2
2
2
n
J = 2
.
 M

M
M
M


∂f n / ∂x1 ∂f n / ∂x 2 L ∂f n / ∂x n 
Pochodne cząstkowe są obliczane w ( x1( k ) , x 2( k ) ,K, x n( k ) ) .