~~NOCACHE~~ ~~REVEAL theme=simple&size=1024x800~~ ====== Lab. 11 Rozwiązywanie układów równań liniowych c. d.====== ===== Układ równań ==== Poszukujemy wektora $\mathbf{x}$ który spełnia $$\mathbf{A} \mathbf{x}=\mathbf{b}$$ $$\left[\begin{array}{cccc} a_{11} & a_{12} & \ldots & a_{1 n} \\ a_{21} & a_{22} & \ldots & a_{2 n} \\ \ldots & \ldots & \ldots & \ldots \\ a_{n 1} & a_{n 2} & \ldots & a_{n n} \end{array}\right] \cdot\left[\begin{array}{l} x_{1} \\ x_{2} \\ \ldots \\ x_{n} \end{array}\right]=\left[\begin{array}{l} b_{1} \\ b_{2} \\ \ldots \\ b_{n} \end{array}\right]$$ ===== Metody ===== * Dokładne: * wyznaczniki Cramera * Eliminacja Gaussa * Metoda Gaussa-Jordana * **Metoda Doolittle'a** (rozkład LU) * Metoda Choleskiego * Iteracyjne (przybliżone): * Metoda Jacobiego * Metoda Gausa-Seidla ===== Rozkład LU ===== Dekompozycja macierzy kwadratowej $\mathbf{A}$ na iloczyn macierzy trójkątnej dolnej $\mathbf{L}$ oraz macierzy trójkątnej górnej $\mathbf{U}$ $$ \mathbf{A}= \mathbf{L} \mathbf{U}$$ gdzie $$\mathbf{L}=\left[\begin{array}{cccc} 1 & 0 & . . & 0 \\ l_{21} & 1 & . . & 0 \\ . . & . . & . . & . . \\ l_{n 1} & l_{n 2} & . . & 1 \end{array}\right] \quad \mathbf{U}=\left[\begin{array}{cccc} u_{11} & u_{12} & . . & u_{1 n} \\ 0 & u_{22} & . . & u_{2 n} \\ . . & . . & . . & . . \\ 0 & . . & 0 & u_{n n} \end{array}\right]$$ * metoda Doolitle'a (gdy $l_{ii}=1$) * metoda Choleskiego-Banachiewicza (gdy $l_{ii}=u_{ii}$) Tadeusz Banachiewicz 1938 ===== Rozwiązanie układu równań ===== $$ \mathbf{A}\mathbf{x} = \mathbf{b}$$ po dekompozycji $$ \mathbf{LU}\mathbf{x} = \mathbf{b}$$ sprowadza się do rozwiązania dwóch prostszych problemów $$ \mathbf{L}\mathbf{y} = \mathbf{b}$$ $$ \mathbf{U}\mathbf{x} = \mathbf{y}$$ ===== Metoda Doolitle'a ===== $$\mathbf{A}=\left[\begin{array}{llll} a_{11} & a_{12} & a_{13} & a_{14} \\ a_{21} & a_{22} & a_{23} & a_{24} \\ a_{31} & a_{32} & a_{33} & a_{34} \\ a_{41} & a_{42} & a_{43} & a_{44} \end{array}\right]=\left[\begin{array}{cccc} 1 & 0 & 0 & 0 \\ l_{21} & 1 & 0 & 0 \\ l_{31} & l_{32} & 1 & 0 \\ l_{41} & l_{42} & l_{43} & 1 \end{array}\right]\left[\begin{array}{rrrr} u_{11} & u_{12} & u_{13} & u_{14} \\ 0 & u_{22} & u_{23} & u_{24} \\ 0 & 0 & u_{33} & u_{34} \\ 0 & 0 & 0 & u_{44} \end{array}\right]$$ $$=\left[\begin{array}{llll} u_{11} & u_{12} & u_{13} & u_{14} \\ l_{21} u_{11} & l_{21} u_{12}+u_{22} & l_{21} u_{13}+u_{23} & l_{21} u_{14}+u_{24} \\ l_{31} u_{11} & l_{31} u_{12}+l_{32} u_{22} & l_{31} u_{13}+l_{32} u_{23}+u_{33} & l_{31} u_{14}+l_{32} u_{24}+u_{34} \\ l_{41} u_{11} & l_{41} u_{12}+l_{42} u_{22} & l_{41} u_{13}+l_{42} u_{23}+l_{43} u_{33} & l_{41} u_{14}+l_{42} u_{24}+l_{43} u_{34}+u_{44} \end{array}\right]$$ ===== ===== {{ zajecia:mn1_2021_2:lu_step1.png?800 |}} wiersz 1 $$u_{11}=a_{11} \quad u_{12}=a_{12} \quad u_{13}=a_{13} \quad u_{14}=a_{14}$$ kolumna 1 $$l_{21}=\frac{a_{21}}{u_{11}} \quad l_{31}=\frac{a_{31}}{u_{11}} \quad l_{41}=\frac{a_{41}}{u_{11}}$$ ===== ===== {{ zajecia:mn1_2021_2:lu_step2.png?800 |}} wiersz 2 $$u_{22}=a_{22}-l_{21} u_{12} \quad u_{23}=a_{23}-l_{21} u_{13} \quad u_{24}=a_{24}-l_{21} u_{14}$$ kolumna 2 $$l_{32}=\left(a_{32}-l_{31} u_{12}\right) / u_{22} \quad l_{42}=\left(a_{42}-l_{41} u_{12}\right) / u_{22}$$ ===== ===== {{ zajecia:mn1_2021_2:lu_step3.png?800 |}} wiersz 3 $$u_{33}=a_{33}-l_{31} u_{13}-l_{32} u_{23} \quad u_{34}=a_{34}-l_{31} u_{14}-l_{32} u_{24}$$ kolumna 3 $$l_{43}=\left(a_{43}-l_{41} u_{13}-l_{42} u_{23}\right) / u_{33}$$ wiersz 4 $$u_{44}=a_{44}-l_{41} u_{14}-l_{42} u_{24}-l_{43} u_{34}$$ ===== Algorytm rozkładu LU ===== * Dla $i = 1, \ldots, n$ * $ u_{ij}=0, \, l_{ji}=0, \qquad j = 1, \ldots, i-1$ * $l_{ii} = 1 $ * $u_{ij}=a_{ij}-\sum_{k=1}^{i-1} l_{ik} u_{kj}, \qquad j = i, \ldots, n$ * $l_{ji}=\frac{a_{j i}-\sum_{k=1}^{i-1} l_{j k} u_{k i}}{u_{i i}}, \qquad j = i+1, \ldots, n$ Każdy element $a_{ij}$ wykorzystywany jest tylko raz, więc można wykorzystać miejsce w macierzy $\mathbf{A}$ do przechowania wartości $l_{ij}$ i $u_{ij}$ ===== Macierze: Przykład w C ===== #define MAX 100 typedef double matrix[MAX][MAX]; void print_matrix(matrix A, int w, int k) { printf("\nMacierz %dx%x\n", w, k); for(int i=0; i< w;i++) { for(int j=0; j< k; j++) printf(" %5.1lf", A[i][j]); printf("\n"); } } ===== Mnożenie macierzy: Przykład w C ===== $$ \mathrm{C} = \mathrm{A} \mathrm{B}$$ void mul(const matrix A, const matrix B, matrix C, int nwa, int nka, int awb, int nkb) { for (int i = 0; i < nwa; i++) { for (int j = 0; j < nkb; j++) { C[i][j] = 0.0; for (int k = 0; k < nka; k++) { C[i][j] += A[i][k] * B[k][j]; } } } } ===== Rozkład LU: Przykład w C ===== void rozklad_lu(const matrix A, matrix L, matrix U, int n) { for (int i = 0; i < n; i++) { for (int j = 0; j < i; j++) { U[i][j] = 0; L[j][i] = 0; } L[i][i] = 1.0; for (int j = i; j < n; j++) { U[i][j] = A[i][j]; for (int k = 0; k <= i-1; k++) { U[i][j] -= L[i][k] * U[k][j]; } } for (int j = i+1; j < n; j++) { L[j][i] = A[j][i]; for (int k = 0; k <= i-1; k++) { L[j][i] -= L[j][k] * U[k][i]; } L[j][i] /= U[i][i]; } } } Przykładowy kod {{zajecia:mn1_2021_2:lu.c|}} ===== Rozwiązanie układu równań ===== $$\mathbf{A}\mathbf{x} = \mathbf{b}$$ zamieniamy na $$\mathbf{L}\mathbf{U}\mathbf{x} = \mathbf{b}$$ stąd $$ \mathbf{L}\mathbf{y} = \mathbf{b}$$ $$ \mathbf{U}\mathbf{x} = \mathbf{y}$$ ===== ===== Z pierwszego układu $ \mathbf{L}\mathbf{y} = \mathbf{b}$ $$ \left[\begin{array}{cccc} 1 & 0 & . . & 0 \\ l_{21} & 1 & . . & 0 \\ . . & . . & . . & . . \\ l_{n 1} & l_{n 2} & . . & 1 \end{array}\right] \cdot\left[\begin{array}{l} y_{1} \\ y_{2} \\ \ldots \\ y_{n} \end{array}\right]=\left[\begin{array}{l} b_{1} \\ b_{2} \\ \ldots \\ b_{n} \end{array}\right]$$ otrzymujemy wektor $\mathbf{y}$ $$\left\{\begin{array}{l} y_{1}=b_{1} \\ y_{i}=b_{i}-\sum_{k=1}^{i-1} l_{i k} y_{k} \quad i=2,3, \ldots, n \end{array}\right.$$ ===== ===== Z drugiego układu $ \mathbf{U}\mathbf{x} = \mathbf{y}$ $$ \mathbf{U}=\left[\begin{array}{cccc} u_{11} & u_{12} & . . & u_{1 n} \\ 0 & u_{22} & . . & u_{2 n} \\ . . & . . & . . & . . \\ 0 & . . & 0 & u_{n n} \end{array}\right] \cdot\left[\begin{array}{l} x_{1} \\ x_{2} \\ \ldots \\ x_{n} \end{array}\right]=\left[\begin{array}{l} y_{1} \\ y_{2} \\ \ldots \\ y_{n} \end{array}\right]$$ uzyskujemy rozwiązanie $\mathbf{x}$ $$\left\{\begin{array}{l} x_{n}=\frac{y_{n}}{u_{n n}} \\ x_{i}=\frac{y_{i}-\sum_{k=i+1}^{n} u_{i k} x_{k}}{u_{i i}} \quad i=n-1, n-2, \ldots, 1 \end{array}\right.$$ ===== Zadanie 10 ===== Treść zadania znajduje się w Moodle pod adresem [[https://moodle.umk.pl/WFAIIS/mod/assign/view.php?id=4880|Zadanie 10]] ===== Dodatkowe ćwiczenia ===== **Ćw. 1** Wiedząc, że $\mathbf{A}\mathbf{A}^{-1} = \mathbf{I}$ napisz program, który wykorzystując rozkład LU wyznaczy macierz odwrotną $\mathbf{A}^{-1}$ dowolnej (podanej przez użytkownika) macierzy kwadratowej $\mathbf{A}$. Rozwiązanie zadania sprowadza się do rozwiązanie $k$ układów równań, gdzie wektorem wyrazów wolnych jest wektor posiadający $1$ na $k$-tej pozycji (kolumna macierzy jednostkowej) a rozwiązaniem jest $k$-ta kolumna macierzy odwrotnej. **Ćw. 2** Metodą rozkładu LU można uprościć obliczenia wyznacznika, gdyż $$\det{(\mathbf{A})} = \det{(\mathbf{LU})} = \det{(\mathbf{L})}\det{(\mathbf{U})} = 1 \cdot\det{(\mathbf{U})} = u_{11} \cdot u_{22} \cdot \ldots \cdot u_{nn}$$ Napisz program, który wykorzystując rozkład LU obliczy wyznacznik dowolnej macierzy kwadratowej $\mathbf{A}$. Współczynniki macierzy $\mathbf{A}$ podaje użytkownik.