Drukuj stronę
Problem brzegowy Dirichleta
PMiKNoM seminaria - zajęcia 5
Wstęp
- II prawo Fick'a w stanie stacjonarnym i inne przykłady problemu brzegowego.
Problem ogólny
W wielu zastosowaniach pojawiają się równania różniczkowe drugiego rzędu z warunkami polegającymi na zadaniu wartości szukanej funkcji na końcach przedziału (ewentualnie jej pochodnych lub kombinacji wartości funkcji i pochodnych). Typowy przykład takiego zagadnienia to:
$$
\left\{ \begin{array}{l}
-\alpha(x) u \text{"} (x) + \beta(x) u \text{'} (x) + \gamma(x)u(x) = f(x) \\
u(x_L)=u_L \\
u(x_R)=u_R
\end{array} \right.
$$
gdzie: `u(x)=?` jest szukaną funkcją, określoną na przedziale `[x_L,x_R]`; `\alpha,\beta,\gamma` oraz `f` to dane funkcje; `u_L` i `u_R` to stałe wartości na lewym i prawym brzegu.
Tak zdefiniowane zagadnienie nazywa się zagadnieniem brzegowym Dirichleta. Istotne jest to, że zadajemy wartości szukanej funkcji na brzegach przedziału.
Rozwiązanie problemu brzegowego Dirichleta:
Równanie ogólne:
- Dzielimy przedział `[x_L, x_R]` na `n+1` równych odcinków. Odległość, pomiędzy dwoma punktami, `x_i` oraz `x_{i+1}`, wynosi zatem `h=(x_R-x_L)/(n+1)`.
-
Zapisujemy ogólne równanie dla każdego `i`-tego dyskretnego punktu:
`-\alpha(x_i) u \text{"} (x_i) + \beta(x_i) u \text{'} (x_i) + \gamma(x_i)u(x_i) = f(x_i)`
-
Podstawiamy pierwszą i drugą pochodną, używając różnic skończonych:
` u \text{'}(x_i) = \frac{u_{i+1}-u_{i-1}}{2h} `` u \text{"}(x_i) = \frac{u_{i+1}-2u_i+u_{i-1}}{h^2} `
-
Otrzymujemy:
`-\alpha(x_i) \frac{u_{i+1}-2u_i+u_{i-1}}{h^2} + \beta(x_i) \frac{u_{i+1}-u_{i-1}}{2h} + \gamma(x_i)u(x_i) = f(x_i)`
-
Mnożymy obie strony równania przez `h^2`, a następnie przekształcamy równanie do postaci:
`u_{i-1} ( - \alpha(x_i) - \frac{h}{2} \beta(x_i) ) + u_i (2 \alpha(x_i) + h^2 \gamma(x_i)) + u_{i+1} ( - \alpha(x_i) + \frac{h}{2} \beta(x_i) ) = h^2 f(x_i)`
-
Przepisujemy powyższe równanie, podstawiając `i=1`:
`u_0 ( - \alpha(x_1) - \frac{h}{2} \beta(x_1) ) + u_1 (2 \alpha(x_1) + h^2 \gamma(x_1)) + u_2 ( - \alpha(x_1) + \frac{h}{2} \beta(x_1) ) = h^2 f(x_1)`
-
Mając dane `u_0 = u(a) = u_L`, można przenieść cały człon na prawą stronę równania, otrzymując:
`u_1 (2 \alpha(x_1) + h^2 \gamma(x_1)) + u_{2} ( - \alpha(x_1) + \frac{h}{2} \beta(x_1) ) = h^2 f(x_1) + u_L ( \alpha(x_1) + \frac{h}{2} \beta(x_1) )`
-
Wykonujemy podobne podstawienie dla punktu `i=n`, otrzymując:
`u_{n-1} ( - \alpha(x_n) - \frac{h}{2} \beta(x_n) ) + u_n (2 \alpha(x_n) + h^2 \gamma(x_n)) + u_{n+1} ( - \alpha(x_n) + \frac{h}{2} \beta(x_n) ) = h^2 f(x_n)`
-
Mając dane `u_{n+1} = u(b) = u_R`, można przenieść cały człon na prawą stronę równania, otrzymując:
`u_{n-1} ( - \alpha(x_n) - \frac{h}{2} \beta(x_n) ) + u_n (2 \alpha(x_n) + h^2 \gamma(x_n)) = h^2 f(x_n) + u_R ( \alpha(x_n) - \frac{h}{2} \beta(x_n) )`
-
Układ równań:
$$ \left\{ \begin{array}{l} u_1 (2 \alpha(x_1) + h^2 \gamma(x_1)) + u_{2} ( - \alpha(x_1) + \frac{h}{2} \beta(x_1) ) = h^2 f(x_1) + u_L ( \alpha(x_1) + \frac{h}{2} \beta(x_1) ) \\ u_{i-1} ( - \alpha(x_i) - \frac{h}{2} \beta(x_i) ) + u_i (2 \alpha(x_i) + h^2 \gamma(x_i)) + u_{i+1} ( - \alpha(x_i) + \frac{h}{2} \beta(x_i) ) = h^2 f(x_i) \text{, for } i=2..n-1 \\ u_{n-1} ( - \alpha(x_n) - \frac{h}{2} \beta(x_n) ) + u_n (2 \alpha(x_n) + h^2 \gamma(x_n)) = h^2 f(x_n) + u_R ( \alpha(x_n) - \frac{h}{2} \beta(x_n) ) \end{array} \right. $$tworzy macierz trójdiagonalną:$$ \left\{ \begin{array}{l} d_1 u_1 + c_1 u_2 = b_1 \\ a_{i-1} u_{i-1} + d_i u_i + c_i u_{i+1} = b_i \text{, for } i=2..n-1\\ a_{n-1} u_{n-1} + d_n u_n = b_n \end{array} \right. $$
- A zatem, by rozwiązać zagadnienie brzegowe Dirichleta, najpierw należy przypisać odpowiednie wartości do macierzy trójdiagonalnej, t.j. `d_1 = (2 \alpha(x_1) + h^2 \gamma(x_1))`, `c_1 = ( - \alpha(x_1) + \frac{h}{2} \beta(x_1) )`, `b_1 = h^2 f(x_1) + u_L ( \alpha(x_1) + \frac{h}{2} \beta(x_1) )`, itd.
- Rozwiązywanie macierzy trójdiagonalnej zostało pokazane na zajęciach 4.
Brzegi:
Macierz trójdiagonalna:
Problem Brzegowy Dirichleta - algorytm programu
- Zadeklaruj stałe globalne `xL = 0`, `xR = 1`, `uL = 0`, `uR = 0` oraz `n = 100`.
- Zdefiniuj funkcje: `\alpha(x)=x^2`, `\beta(x) = x`, `\gamma(x)=1` oraz `f(x)=x \cdot (x-2)`.
- Procedurę główną rozpocznij od deklaracji zmiennej `h` oraz tablic `a(1 \text{ to } n-1)`, `d(1 \text{ to } n)`, `c(1 \text{ to } n-1)`, `b(1 \text{ to } n)` oraz `x(0 \text{ to } n+1)`.
- Wylicz wartość kroku `h`.
- Przypisz wartości wszystkim punktom położenia `x(i)=i \cdot h`. (pamiętaj o punktach brzegowych)
- Przypisz wartości do tablic `a`, `b`, `c` oraz `d` (pętle 'for').
- Napisz instrukcje rozwiązujące macierz trójdiagonalną (pętla + instrukcja + pętla).
- Wyświetl wyniki.
Dodatkowe materiały:
- Skrypt: R. Filipek, K. Szyszkiewicz-Warzecha "Metody Matematyczne dla Ceramików", strony 128-147.