Wpisany przez Tomasz Lubiński,
08 sierpnia 2005 21:28
Metoda eliminacji Gaussa pozwala nam obliczyć układ n równań z n niewiadomymi Ax=b. Przekształcamy w niej macierz współczynników A do macierzy trójkątnej górnej R, z której następnie obliczamy ostateczne rozwiązanie - czyli wektor x. Macierz trójkątną górną R otrzymujemy w następujący sposób: (Przez macierz (A,b) rozumieć będziemy macierz współczynników A z dodaną na końcu kolumną wyrazów wolnych b)
Pełny wybór elementu podstawowego poprzez |ars|=max|aij| i=1,2,...,n j=1,2,...,n Musimy przestawić wiersz r-ty i pierwszy oraz kolumnę s-tą i pierwszą (zmiany kolumn należy zapamiętać gdyż powoduje ona zamianę niewiadowmych!).
Gdy przekształcimy już macierz współczynników A do macierzy trójkątnej górnej R, oraz wektor b do wektora c możemy już wyznaczyć ostateczne rozwiązanie ze wzoru: (i=n,n-1,...,1)
Przykład, niech będzie dana macierz A oraz wektor b, z których tworzymy macierz (A,b)
po przekształceniach:
natępnie wywołujemy procedurę rekurencyjnie dla:
po przekształceniach:
Ponieważ ostatniej macierzy nie możemy już rekurencyjnie wywołać (po odcięciu górnego wiersza i prawej kolumny zostanie wektor), zatem otrzymaliśmy szukaną macierz R i wektor c, z których wyznaczamy ostateczne rozwiązanie
x[3]=0.25 x[2]=0.75 x[1]=-1.25
- W macierzy (A,b) szukamy elementu ar1 różnego od zera i przechodzimy do następnego punktu. Jeżeli natomiast nie istnieje taki element to znaczy, że macierz jest osobliwa i nie możemy rozwiązać tego układu.
- Zamieniamy wiersz r-ty i pierwszy.
- Odejmujemy od i-tego wiersza macierzy li krotność wiersza i-tego i pierwszego. Można to przedstawić za pomocą wzorów: (i=2,3,...,n j=2,3,...,n)
a_{ij} = a_{ij} - l_i * a{1j}\\\\ b_i = b_i - l_i * b_i\\\\ \text{gdzie } l_i = \frac{a_{i1}}{a_{11}}
- Następnie wywołujemy tą procedurę od punktu pierwszego rekurncyjnie dla macierzy (A',b') - czyli macierz (A,b) pomniejszoną o pierwszą kolumnę i pierwszy wiersz.
(A,b)=\begin{vmatrix} a_{11}&\begin{matrix} a_{12}&...&a_{1n}&b_{n} \end{matrix}\\ \begin{matrix} a_{21}\\ ...\\ a_{n1} \end{matrix}&\begin{vmatrix} a_{22}&...&a_{2n}&b_{2}\\ ...&...&...&...\\ a_{n2}&...&a_{nn}&b_{n} \end{vmatrix} \end{vmatrix}
(A',b')=\begin{vmatrix} a_{22}&...&a_{2n}&b_{2}\\ ...&...&...&...\\ a_{n2}&...&a_{nn}&b_{n} \end{vmatrix}
Pełny wybór elementu podstawowego poprzez |ars|=max|aij| i=1,2,...,n j=1,2,...,n Musimy przestawić wiersz r-ty i pierwszy oraz kolumnę s-tą i pierwszą (zmiany kolumn należy zapamiętać gdyż powoduje ona zamianę niewiadowmych!).
Gdy przekształcimy już macierz współczynników A do macierzy trójkątnej górnej R, oraz wektor b do wektora c możemy już wyznaczyć ostateczne rozwiązanie ze wzoru: (i=n,n-1,...,1)
x_{i}=\frac{c_{i}-\sum_{k=i+1}^{n}{r_{ik}x_{k}}}{r_{ii}}
Przykład, niech będzie dana macierz A oraz wektor b, z których tworzymy macierz (A,b)
(A,b)=\begin{vmatrix}3&1&0&-3\\1&2&-1&0\\0&-1&3&0\end{vmatrix}
po przekształceniach:
\begin{vmatrix}3&1&0&-3\\0&\frac{5}{3}&-1&1\\0&-1&3&0\end{vmatrix}
natępnie wywołujemy procedurę rekurencyjnie dla:
\begin{vmatrix}\frac{5}{3}&-1&1\\-1&3&0\end{vmatrix}
po przekształceniach:
\begin{vmatrix}\frac{5}{3}&-1&1\\0&\frac{12}{5}&\frac{3}{5}\end{vmatrix}
Ponieważ ostatniej macierzy nie możemy już rekurencyjnie wywołać (po odcięciu górnego wiersza i prawej kolumny zostanie wektor), zatem otrzymaliśmy szukaną macierz R i wektor c, z których wyznaczamy ostateczne rozwiązanie
(R,c)=\begin{vmatrix}3&1&0&-3\\0&\frac{5}{3}&-1&1\\0&0&\frac{12}{5}&\frac{3}{5}\end{vmatrix}
x[3]=0.25 x[2]=0.75 x[1]=-1.25
Implementacje
Autor | Język programowania | Komentarz | Otwórz | Pobierz | Ocena |
Jan Wojciechowski | C/C++ | .cpp | .cpp | ***** / 21 | |
Tomasz Lubiński | Delphi/Pascal | Borland Delphi 5 | .pas | .pas | ***** / 15 |
Andrzej Borucki | Delphi/Pascal | Rozbudowany analizator | .pas | .pas | ***** / 1 |
Adrian Cimochowski | Java | .java | .java | ***** / 5 | |
slovic | Python | python 2.7 + numpy | .py | .py | ***** / 4 |
Poprawiony: 04 września 2012 13:58
Dzięki.
prostokątną macierzą główną układu przez sprowadzenie go do układu Cramera