REVEAL theme=simple&size=1024×800
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]$$
$$\mathbf{x}^{(k+1)}=\mathbf{x}^{(k)}+\mathbf{D}^{-1}(\mathbf{b}- \mathbf{A} \mathbf{x}^{(k)})$$
k = 0; do { for (i = 0; i < n; i++) x_prev[i] = x[i]; for (i = 0; i < n; i++) { x[i] = b[i]; for (j = 0; j < n; j++) { if (i!=j) x[i] -= x_prev[j] * A[i][j]; } x[i] /= A[i][i]; } k = k + 1; }while(dist(x, x_prev, n) > eps && k < max_iter);
Program demo: jacobi.c
Zauważmy, że w metodzie Jacobiego wyznaczając komponent $x_i^{(k+1)}$ możemy wykorzystać wyznaczone w tym samym kroku $(k+1)$ wcześniejsze komponenty $ x_1^{(k+1)}, x_2^{(k+1)}, \ldots, x_{i-1}^{(k+1)}$
Zalety: szybsza zbieżność, do wykonania obliczeń nie trzeba przechowywać dwóch wektorów $\mathbf{x}$
Napisz program, który porówna szybkość zbieżności metod iteracyjnych Jacobiego i Gaussa-Siedla przy rozwiązywaniu układu równań
$$\left[\begin{array}{cccc}
n+1 & 1 & \cdots & 1
1 & n+1 & \cdots & 1
\vdots & \vdots & \ddots & \vdots
1 & 1 & \cdots & n+1
\end{array}\right]\left[\begin{array}{c}
x_{1}
x_{2}
\vdots
x_{n}
\end{array}\right]=\left[\begin{array}{c}
2 n
2 n
\vdots
2 n
\end{array}\right] $$
Dokładne rozwiązanie $ \mathbf{x} = [1, 1, \ldots, 1 ]$.
Program, dla podanej przez użytkownika wartości $n$, rozwiązuje układ równań za pomocą obu metod iteracyjnych w każdym przypadku starając od przybliżenia $\mathbf{x}^{(0)} = [0, 0, \ldots, 0]$ i wykonuje obliczenia aż do uzyskania wyniku o precyzji $\epsilon = 10^{-4}$.
Po skończeniu obliczeń program wypisuje dla każdej z metod informację o liczbie wykonanych iteracji.
Zakładamy, że $n$ nie będzie większe od 1000.
Ćw. 1