Jacobi-Verfahren für Randwertprobleme

Gesucht sei eine numerische Näherung einer Funktion \(u(x,y)\) für \((x, y) \in \Omega = [0,1] \times [0,1]\), für die gilt: \(u_{xx} + u_{yy} = 0\) mit der Randbedingung \(u(x,y) = g(x,y)\) für \(x, y \in \delta\Omega\). Das obige Beispiel zeigt eine numerische Lösung für die Randbedingungen \(u(x,0) = sin(\pi x)\), \(u(x,1) = sin(\pi x) e^{-\pi}\) und \(u(0, y) = u(1, y) = 0\).

Numerisch lässt sich das Problem lösen, wenn das Gebiet \(\Omega\) in ein \(N \times N\) Gitter gleichmäßig zerlegt wird. Dann lässt sich \(u(x,y)\) auf den Gitterpunkten durch eine Matrix \(A\) darstellen, wobei \(A_{i,j} = u\left(\frac{i}{N}, \frac{j}{N}\right)\) für \(i,j = 0 \dots N\):

\[ \left( \begin{array}{ccccc} A_{0,N-1} & A_{1,N-1} & \dots & A_{N-2, N-1} & A_{N-1,N-1} \\ A_{0,N-2} & A_{1,N-2} & \dots & A_{N-2, N-2} & A_{N-1,N-2} \\ \vdots & \vdots & & \vdots & \vdots \\ A_{0,1} & A_{1,1} & \dots & A_{N-2, 1} & A_{N-1, 1} \\ A_{0,0} & A_{1,0} & \dots & A_{N-2, 0} & A_{N-1, 0} \end{array} \right)\]

Hierbei lässt sich \(A\) schrittweise approximieren durch die Berechnung von \(A_0\), \(A_1 \dots\), wobei \(A_0\) am Rand die Werte von \(g(x,y)\) übernimmt und ansonsten mit Nullen gefüllt wird.

Es gibt mehrere iterative numerische Verfahren, wovon das einfachste das Jacobi-Verfahren ist mit dem sogenannten 5-Punkt-Differenzenstern:

\[ A_{{k+1}_{i,j}} = \frac{1}{4} \left( A_{k_{i-1,j}} + A_{k_{i,j-1}} + A_{k_{i,j+1}} + A_{k_{i+1,j}} \right)\]

für \(i, j \in 1 \dots N-1, k = 1, 2, \dots\). (Zur Herleitung siehe Alefeld et al, Parallele numerische Verfahren, S. 18 ff.)

Die Iteration wird solange wiederholt, bis

\[ \max_{i,j = 1 \dots N-1} \left| A_{{k+1}_{i,j}} - A_{{k}_{i,j}} \right| \le \epsilon\]

für eine vorgegebene Fehlergrenze \(\epsilon\) gilt.

Aufgabe

So lässt sich das Beispiel übersetzen und ausführen:

$shell> mpic++ -g -O3 -std=c++11 \
>    -I. -I/home/numerik/pub/hpc/session21 \
>    $(pkg-config --cflags gdk-pixbuf-2.0) \
>    -o jacobi jacobi.cpp $(pkg-config --libs gdk-pixbuf-2.0)
$shell> mpirun -np 4 jacobi
5090 iterations
$shell> 

Am Ende können Sie auch gerne Ihre Lösung wieder zu einem tar-Archiv zusammenpacken und mit submit einreichen:

submit hpc session21 session21.tar