Lab 08 2011 2012


Informatyka I  Lab 08, r.a. 2011/2012
prow. SÅ‚awomir Czarnecki
Zadania na laboratorium nr. 8
Po utworzeniu nowego projektu, dołącz bibliotekę bibs.h.
1. Zdefiniuj funkcjÄ™ void abx double** a,double* b,double* x,int n implementujÄ…cÄ…
( )
Algorytm Gaussa znajdowania rozwiązania x " !n liniowego układu równań
a x = b (1)
gdzie a " Mn×n jest danÄ…, nieosobliwÄ… macierzÄ… rzÄ™du n ( rank a = n ), b "!n jest danym
wektorem prawej strony.
Algorytm Gaussa  szkic metody
ZakÅ‚adamy, \e a0,0 `" 0 , modyfikujemy wiersze macierzy a " Mn×n oraz skÅ‚adowe wektora
ak ,0 1 ak ,0
b "!n o numerach k =1,2,...,n -1 obliczajÄ…c a1 = ak , j - a0, j , bk = bk - b0 dla
k , j
a0,0 a0,0
j = k -1,k,..., n -1, tzn. macierz a i wektor b
a0,0 a0,1 ... a0,n-1 îÅ‚ Å‚Å‚
îÅ‚ Å‚Å‚ b0
ïÅ‚
a1,0 a1,1 ... a1,n-1 śł ïÅ‚ śł
b1
ïÅ‚ śł
ïÅ‚ śł
, (2)
ïÅ‚ śł
... ... ... ... ïÅ‚ śł
...
ïÅ‚ śł
ïÅ‚ śł
n-1,0
ðÅ‚bn-1ûÅ‚
ðÅ‚a an-1,1 ... an-1,n-1ûÅ‚
przekształcamy do macierzy a1 i wektora b1 równych odpowiednio
a0,0 a0,1 ... a0,n-1 b0
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
ïÅ‚
a1,0 a1,0 a1,0 śł ïÅ‚ a1,0 śł
ïÅ‚
a1,0 - a0,0 a1,1 - a0,1 ... a1,n-1 - a0,n-1 śł ïÅ‚ b1 - b0 śł
ïÅ‚ śł ïÅ‚ śł
a0,0 a0,0 a0,0 a0,0
, . (3)
ïÅ‚ śł ïÅ‚ śł
... ... ... ... ...
ïÅ‚ śł ïÅ‚ śł
ïÅ‚
an-1,0 an-1,0 an-1,0 śł ïÅ‚ an-1,0 śł
ïÅ‚ - a0,0 an-1,1 - a0,1 ... an-1,n-1 - a0,n-1 bn-1 - b0
śł ïÅ‚ śł
an-1,0
a0,0 a0,0 a0,0 ûÅ‚ ðÅ‚ a0,0 ûÅ‚
ïÅ‚ śł ïÅ‚ śł
ðÅ‚
Otrzymany w ten sposób, zmodyfikowany układ równań
a1 x = b1 (4)
charakteryzuje macierz a1 " Mn×n , w której wszystkie skÅ‚adowe w pierwszej kolumnie
poni\ej elementu a0,0 są równe 0:
a0,0 a0,1 ... a0,n-1
îÅ‚ Å‚Å‚ b0
îÅ‚ Å‚Å‚
ïÅ‚ 1 1 ïÅ‚ 1 śł
0 a1,1 ... a1,n-1 śł b1
ïÅ‚ śł
ïÅ‚ śł
a1 = , b1 = (5)
ïÅ‚ śł ïÅ‚ śł
... ... ... ... ...
ïÅ‚ śł
ïÅ‚ śł
1
0 a1 ... a1 ûÅ‚
n-1,1 n-1,n-1
ðÅ‚bn-1ûÅ‚
ðÅ‚
Opisane powy\ej przekształcenia, powtarzamy dla podmacierzy i wektora przedstawionych
poni\ej:
... ... ... ... ...
îÅ‚ Å‚Å‚ ...
îÅ‚ Å‚Å‚
ïÅ‚ 1 1 1
... a1,1 a1,2 ... a1,n-1 śł ïÅ‚ 1 śł
b1
ïÅ‚ śł
ïÅ‚ śł
1
ïÅ‚ śł ïÅ‚ śł
... a1 a1 ... a1 , b2 . (6)
2,1 2,2 2,n-1
ïÅ‚ śł
ïÅ‚ śł
... ... ... ... ...
...
ïÅ‚ śł
ïÅ‚ śł
1
ïÅ‚
... a1 a1 ... a1 śł ïÅ‚bn-1śł
n-1,1 n-1,2 n-1,n-1
ðÅ‚ ûÅ‚
ðÅ‚ ûÅ‚
1
ZakÅ‚adajÄ…c zatem, \e skÅ‚adowa a1,1 `" 0 , modyfikujemy wiersze macierzy a1 " Mn×n oraz
składowe wektora b1 "!n o numerach k = 2,3,...,n -1 obliczając
a1 a1
2 k ,1 1 2 1 k ,1 1
ak , j = a1 - a1, j , bk = bk - b1 dla j = k -1,k,..., n -1
k , j
1 1
a1,1 a1,1
1 1 1 1
îÅ‚ a1,1 a1,2 ... a1,n-1 Å‚Å‚ îÅ‚ b1 Å‚Å‚
ïÅ‚ śł ïÅ‚ śł
a1 a1 a1 a1
ïÅ‚ 2,1 1 2,1 1 2,1 1 1 1
2,1
a1 - a1,1 a1 - a1,2 ... a1 - a1,n-1 śł ïÅ‚ b2 - b1 śł
2,1 2,2 2,n-1
1 1 1 1
ïÅ‚
a1,1 a1,1 a1,1 śł ïÅ‚ a1,1 śł
ïÅ‚ śł ïÅ‚ śł
, . (7)
ïÅ‚ ... ... ... ... śł ïÅ‚ ... śł
ïÅ‚ śł ïÅ‚ śł
a1 a1 a1 a1
ïÅ‚a1 n-1,1 1 n-1,1 1 n-1,1 1 n-1,1 1śł
- a1,1 a1 - a1,2 ... a1 - a1,n-1śł ïÅ‚b1 - b1 śł
n-1,1 n-1,2 n-1,n-1
1 1 1 1
ïÅ‚
a1,1 a1,1 a1,1 śł ïÅ‚ n-1 a1,1 ûÅ‚
ðÅ‚ ûÅ‚ ðÅ‚
Otrzymany w ten sposób, zmodyfikowany układ równań
a2 x = b2 (8)
charakteryzuje macierz a2 " Mn×n , w której dodatkowo, oprócz wszystkich skÅ‚adowych w
pierwszej kolumnie poni\ej elementu a0,0 , wszystkie składowe w drugiej kolumnie poni\ej
1
elementu a1,1 są tak\e równe 0
a0,0 a0,1 a0,2 ... a0,n-1
îÅ‚ Å‚Å‚ b0
îÅ‚ Å‚Å‚
ïÅ‚ 1 1 1 ïÅ‚ 1 śł
0 a1,1 a1,2 ... a1,n-1 śł b1
ïÅ‚ śł
ïÅ‚ śł
2 2 2
ïÅ‚ śł ïÅ‚ śł
a2 = 0 0 a2,2 ... a2,n-1 , b2 = b2 (9)
ïÅ‚ śł
ïÅ‚ śł
... ... ... ... ...
...
ïÅ‚ śł
ïÅ‚ śł
2 2 2
ïÅ‚
ïÅ‚bn-1śł
0 0 an-1,2 ... an-1,n-1śł
ðÅ‚ ûÅ‚
ðÅ‚ ûÅ‚
Kontynuacja opisanych powy\ej obliczeń prowadzi do modyfikacji układu równań z
poczÄ…tkowej postaci a x = b do postaci
an-1 x = bn-1 (10)
(z tzw. trójkątną macierzą układu równań), gdzie
a0,0 a0,1 a0,2 ... a0,n-1
îÅ‚ Å‚Å‚ b0
îÅ‚ Å‚Å‚
ïÅ‚ 1 1 1 ïÅ‚ 1 śł
0 a1,1 a1,2 ... a1,n-1 śł b1
ïÅ‚ śł
ïÅ‚ śł
2 2 2
ïÅ‚ śł ïÅ‚ śł
an-1 = 0 0 a2,2 ... a2,n-1 , bn-1 = b2 . (11)
ïÅ‚ śł
ïÅ‚ śł
... ... ... ... ...
...
ïÅ‚ śł
ïÅ‚ śł
n-1 n-1
ïÅ‚
ïÅ‚bn-1 śł
0 0 0 ... an-1,n-1śł
ðÅ‚ ûÅ‚
ðÅ‚ ûÅ‚
1 2
W przypadku gdyby któraś ze składowych a0,0 , a1,1 , a2,2 ,& była równa 0, konieczna jest
dodatkowa zmiana lub zmiany polegajÄ…ce na odszukaniu (w najprostszym wariancie)
pierwszego wiersza k ( poni\ej wiersza i -1 ), w którym składowa ak ,0 k > 0 , a1 k > 1 ,
( ) ( )
k ,1
2
ak ,2 k > 2 ,& jest ró\na od 0 i zamianie wiersza, w którym jest zerowa składowa ze
( )
znalezionym wierszem o numerze k. W praktyce, znajdowanie odpowiednich składowych jest
nieco bardziej zło\one i wynika z konieczności zapewnienia minimalizacji błędów
numerycznych, które sukcesywnie pojawiają się w trakcie przeprowadzania opisanych
powy\ej obliczeń.
OznaczajÄ…c na nowo macierz an-1 " Mn×n jaki i wszystkie jej skÅ‚adowe ain-1
, j
i, j = 0,1,..., n -1 , a tak\e wektor bn-1 "!n jak i wszystkie jego składowe bin-1
( )
i = 0,1,..., n -1 ponownie symbolami odpowiednio a = ai, j " Mn×n oraz b = bi " !n ,
( ) ( )
( )
stwierdzamy, \e zadanie poszukiwania rozwiązania układu równań liniowych (1)
sprowadzone zostało do zadania
a x = b (12)
z trójkÄ…tnÄ… macierzÄ… a " Mn×n , gdzie
a0,0 a0,1 ... a0,n-1
îÅ‚ Å‚Å‚ b0
îÅ‚ Å‚Å‚
ïÅ‚
ïÅ‚ śł
0 a1,1 ... a1,n-1 śł b1
ïÅ‚ śł
ïÅ‚ śł
a = " Mn×n , b = " !n . (13)
ïÅ‚ śł ïÅ‚ śł
... ... ... ... ...
ïÅ‚ śł
ïÅ‚ śł
0 0 ... an-1,n-1ûÅ‚
ðÅ‚bn-1ûÅ‚
ðÅ‚
Rozwiązanie x = xi " !n układu równań (12) mo\na w bardzo prosty sposób znalezć
( )
wykorzystując trójkątną postać macierzy a. Najpierw znajdujemy ostatnią składową xn-1 z
bn-1
ostatniego równania (13), xn-1 = , a kolejne składowe obliczamy rekurencyjnie ze
an-1,n-1
n-1
bi - ai, j xj
"
j=i+1
wzoru xi = i = n
( - 2, n - 3,...,1,0 .
)
ai,i
Algorytm Gaussa (najprostsza wersja)  pseudo-kod
start
dla ka\dego wiersza i =1,2,...,n -1
{
jeśli ai-1,i-1 = 0 , to znajdz pierwszy wiersz k i d" k d" n -1 , w którym ak ,i-1 `" 0 , a
( )
następnie zamień wiersz i -1 z wierszem k aktualnej macierzy a oraz
zamień składową i -1 ze składową k aktualnego wektora b, tzn.
ai-1, j "! ak , j j = i -1,i,..., n -1 , bi-1 "! bk
( )
(mo\na ograniczyć się do zamiany składowych macierzy a jedynie od i -1 kolumny)
dla ka\dego wiersza k i d" k d" n -1
( )
{
ak ,i-1
c =
ai-1,i-1
ak ,i-1 = 0
dla ka\dej kolumny j i d" j d" n -1
( )
{
ak , j = ak , j - c ai-1, j
}
bk = bk - c bi-1
}
}
bn-1
xn-1 =
an-1,n-1
dla ka\dej składowej i = n - 2,n - 3,...,1,0
{
n-1
bi - ai, j xj
"
j=i+1
xi =
ai,i
}
koniec
2. Przetestuj działanie funkcji void abx double** a,double* b,double* x,int n dla
( )
macierzy A " M i wektora B " !N o losowo wygenerowanych składowych z przedziału
N×N
[-10,10 oraz N = 10 . Wyświetl na ekranie rozwiązanie X " !N układu równań A X = B , a
]
tak\e wygenerowaną macierz A " M oraz wektor B " !N przed i po wywołaniu funkcji
N×N
void abx ... .
( )
3. Dla wygenerowanej w zadaniu 2 macierzy A " M i wektora B " !N , wywołaj funkcję
N×N
int gauss int n,double** a,double* b,double* x z biblioteki bibs.h. Porównaj wynik z
( )
rozwiÄ…zaniem numerycznym X " !N z zadania 2.
4. Przetestuj działanie funkcji void abx double** a,double* b,double* x,int n dla
( )
nastÄ™pujÄ…co zdefiniowanej macierzy A " M2×2 i wektora B " !2 (N = 2)
µ 1 1
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
A = " !2 , (14)
ïÅ‚1 1śł " M2×2, B = ïÅ‚2śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
gdzie µ jest  bardzo maÅ‚Ä… liczbÄ… dodatniÄ…, np.: µ = 1.0Å"10-20 .
X0
îÅ‚ Å‚Å‚
Komentarz. Rozwiązanie ścisłe (dokładne) X = " !2 układu równań
ïÅ‚ śł
X1
ðÅ‚ ûÅ‚
A X = B (15)
tzn. układu
µ 1 X0 1
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
= (16)
ïÅ‚1 1śł ïÅ‚ śł ïÅ‚2śł
X1
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
jest następujące
1
îÅ‚ Å‚Å‚
2 -
ïÅ‚ śł
µ
1- X1
îÅ‚ Å‚Å‚
ïÅ‚1- 1 śł
ïÅ‚ śł
ïÅ‚ 1
1- śł
îÅ‚ Å‚Å‚
µ
X0 ïÅ‚ 1 śł ïÅ‚ µ śł ïÅ‚ 1-µ śł
îÅ‚ Å‚Å‚
ïÅ‚ śł
X = = = ... = ïÅ‚ śł = ... = . (17)
µ ïÅ‚ śł
ïÅ‚ śł -
X1 2 µ
ïÅ‚ śł
ïÅ‚ śł
ðÅ‚ ûÅ‚ ïÅ‚1- 2µ śł
1
ïÅ‚ śł
ïÅ‚ - śł
1 2 ïÅ‚ śł
ðÅ‚ 1-µ ûÅ‚
1-
ïÅ‚ śł µ
ïÅ‚ śł
ðÅ‚ µ ûÅ‚
1
ïÅ‚ śł
1-
ïÅ‚ śł
ðÅ‚ µ ûÅ‚
Algorytm Gaussa (w najprostszej postaci) doprowadza układ równań (16) do układu równań
następującego:
µ 1
îÅ‚ Å‚Å‚
X0 îÅ‚ 1 Å‚Å‚
îÅ‚ Å‚Å‚
ïÅ‚ śł ïÅ‚ śł
= , (18)
ïÅ‚ śł
ïÅ‚0 1- 1 śł ïÅ‚2 1 śł
X1 -
ðÅ‚ ûÅ‚
ðÅ‚ µ ûÅ‚ ðÅ‚ µ ûÅ‚
który ma rozwiązanie ścisłe (dokładne)
1
2 -
1- X1
µ
X1 = , X0 = . (19)
1
µ
1-
µ
Wa\ne ! Kolejność X1, X0 zapisanych w (19) składowych odpowiada kolejności w jakiej
obliczane sÄ… one w algorytmie Gaussa  patrz pseudo-kod algorytmu Gaussa wy\ej.
1 1
Dla bardzo maÅ‚ego µ > 0 , np. µ = 1.0Å"10-20 , wartoÅ›ci obu wyra\eÅ„ 2 - oraz 1- w (19)1
µ µ
1 1 1
obliczanych na komputerze są w przybli\eniu równe - , tzn. zarówno 2 - H" - jak i
µ µ µ
1 1
1- H" - . A zatem ze wzoru (19)1 otrzymamy następujący wynik numeryczny
µ µ
1 1
2 - -
µ µ
X1 = H" = 1 , (20)
1 1
1- -
µ µ
i w konsekwencji ze wzoru (19)2 obliczymy
1- X1 1-1
X0 = H" = 0 . (21)
µ µ
Jednak, po prostym przekształceniu wzorów (19) (porównaj tak\e (17)) otrzymujemy
następujące, poprawne numerycznie wartości:
1- 2µ 1
X1 = H"1, X0 = H"1. (22)
1-µ 1- µ
Otrzymane rozwiÄ…zanie numeryczne otrzymane najprostszÄ… metodÄ… Gaussa jest zatem nie do
zaakceptowania. PrzyczynÄ…, tak du\ego, numerycznego bÅ‚Ä™du jest fakt, \e skÅ‚adowa a0,0 = µ
jest  bardzo mała w porównaniu z innymi składowymi pierwszego wiersza (u nas w
porównaniu ze składową a0,1 =1), co nie mo\e być w prosty sposób poprawnie
zaimplementowane na komputerach o stałej długości słowa, w którym musi być
przechowywana reprezentacja liczb zmienno przecinkowych w postaci zarówno cechy jak i
mantysy.
Zauwa\my jednak, \e proste przestawienie kolejności równań (16)
1 1 X0 2
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
= (23)
ïÅ‚µ 1śł ïÅ‚ śł ïÅ‚1śł
X1
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
a następnie zastosowanie algorytmu eliminacji Gaussa (w najprostszej wersji) prowadzi do
równowa\nego układu równań
1 1 X0 2
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
= , (24)
ïÅ‚0 1- µ śł ïÅ‚ śł ïÅ‚1- 2µ śł
X1
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
który tym razem, ma poprawne numerycznie rozwiązanie
1- 2µ
X1 = H"1 (25)
1-µ
oraz
X0 = 2 - x1 H" 1 . (26)
Wynika stąd, \e dobry pod względem numerycznym algorytm rozwiązywania układu
równań liniowych powinien w ogólnym przypadku brać pod uwagę mo\liwość m.in.
odpowiedniego przestawienia wierszy w celu eliminacji przedstawionych wy\ej
problemów numerycznych.
5. Raz jeszcze przetestuj działanie funkcji void abx ... , ale tym razem dla następująco
( )
zdefiniowanej macierzy A " M2×2 i wektora B " !2 (N = 2)
1 1 2
îÅ‚ Å‚Å‚ îÅ‚ Å‚Å‚
A = " !2 (27)
ïÅ‚µ 1śł " M2×2, B = ïÅ‚1śł
ðÅ‚ ûÅ‚ ðÅ‚ ûÅ‚
(prosta zamiana kolejności równań (16)). Wyświetl na ekranie rozwiązanie X " !N .
Dla zdefiniowanej w (27) macierzy A " M i wektora B " !N , wywołaj raz jeszcze
N×N
funkcję int gauss int n,double** a,double* b,double* x z biblioteki bibs.h i wyświetl
( )
na ekranie rozwiązanie X " !N . Porównaj oba otrzymane wyniki z (niepoprawnym)
rozwiÄ…zaniem numerycznym (20), (21) oraz z (poprawnym) rozwiÄ…zaniem (25), (26).


Wyszukiwarka

Podobne podstrony:
Lab 11 12
Lab 11 12
Lab 11 12
Lab 11 12
Lab ME MI instrukcja 11 12 E
dach (11 12)
zjazdy 11 12
Quas primas Pius XI (11 12 1925)
Konsultacje sem letnim 11 12 I16# 12
Hydrologia cwiczenia 11 i 12
11 (12)

więcej podobnych podstron