Praktikum zur Vorlesung Numerik partieller Differentialgleichungen I
Mario Ohlberger, Felix Schindler
Aktivieren Sie die virtuelle Umgebung zum Praktikum und starten Sie den Notebook server. Zur Erinnerung:
Terminal starten (super
-Taste/Windows
-Taste, terminal
eingeben, Enter
)
ins Projektverzeichnis wechseln
cd ~/NPDGL1
die virtuelle Umgebung aktivieren
source python_umgebung_NPDGL1/bin/activate
Notebook server starten
jupyter-notebook --notebook-dir=notebooks
~/NPDGL1/notebooks/blatt_01.ipynb
.numpy
und pymor.basic
und machen Sie matplotlib
für das Notebook nutzbar.set_log_levels({'pymor': 'WARN'})
%matplotlib notebook
import numpy as np
from pymor.basic import *
set_log_levels({'pymor': 'WARN'})
Wir betrachten ein stationäres Diffusionsproblem. Sei dazu
gegeben. Gesucht ist die Lösung $u: \Omega \to \mathbb{R}$, sodass
$$\begin{align} -\nabla\cdot( A \nabla u ) &= f &&\text{in } \Omega,\\ u &= g_\text{D} &&\text{auf } \Gamma_\text{D},\\ -(A \nabla u)\cdot n &= g_\text{N} &&\text{auf } \Gamma_\text{N} \end{align}$$(im schwachen Sinne, siehe Kapitel 1) erfüllt ist.
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $A = f = 1$ und $g_\text{D} = 0$. Modellieren, diskretisieren und lösen Sie dieses Problem mit Hilfe von pyMOR und visualisieren Sie die Lösung. Nehmen Sie dafür die Musterlösung zu Blatt 00 und die API Dokumentation zu Hilfe. Zur Erinnerung:
RectDomain
StationaryProblem
mit den entsprechenden Datenfunktionen andisc
abomega = RectDomain(([0, 0], [1, 1]))
problem = StationaryProblem(
domain=omega,
diffusion=ConstantFunction(1, 2),
rhs=ConstantFunction(1, 2),
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $A = 1$, $g_\text{D} = 0$ und einer Quelle, modelliert durch
$$f(x) = \begin{cases}1, &x \in [0.2, 0.4]^2\\0, &\text{sonst}\end{cases}.$$problem = StationaryProblem(
domain=omega,
diffusion=ConstantFunction(1, 2),
rhs=ExpressionFunction(
'(0.2 <= x[..., 0]) * (x[..., 0] <= 0.4) * (0.2 <= x[..., 1]) * (x[..., 1] <= 0.4) * 1.', dim_domain=2, shape_range=()),
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $A = 1$, $g_\text{D} = 0$ und je einer Quelle und Senke, modelliert durch
$$f(x) = \begin{cases}1, &x \in [0.2, 0.4]^2\\-1, &x \in [0.6, 0.8]^2\\0, &\text{sonst}\end{cases}.$$problem = StationaryProblem(
domain=omega,
diffusion=ConstantFunction(1, 2),
rhs=(ExpressionFunction('((0.2 <= x[..., 0]) * (x[..., 0] <= 0.4) * (0.2 <= x[..., 1]) * (x[..., 1] <= 0.4))*1.', dim_domain=2, shape_range=())
- ExpressionFunction('((0.6 <= x[..., 0]) * (x[..., 0] <= 0.8) * (0.6 <= x[..., 1]) * (x[..., 1] <= 0.8))*1.', dim_domain=2, shape_range=())),
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $A = f = 1$ und $g_\text{D} = 1$.
problem = StationaryProblem(
domain=omega,
diffusion=ConstantFunction(1, 2),
rhs=ConstantFunction(1, 2),
dirichlet_data=ConstantFunction(1, 2)
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $A = f = 1$ und
$$g_\text{D}(x) = \begin{cases}1, &x_0 = 0\\-1, &x_0 = 1\\0, &\text{sonst}\end{cases}.$$Modellieren, diskretisieren und lösen Sie dieses Problem mit Hilfe von pyMOR und visualisieren Sie die Lösung.
problem = StationaryProblem(
domain=omega,
diffusion=ConstantFunction(1, 2),
rhs=ConstantFunction(1, 2),
dirichlet_data=ExpressionFunction('(x[..., 0] < 1e-7)*1. + (x[..., 0] > (1 - 1e-7))*-1.', dim_domain=2, shape_range=())
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{N} = \{x \in \overline{\Omega} \;|\; x_0 = 1\}$, $\Gamma_\text{D} = \partial\Omega \backslash \Gamma_{N}$, $A = f = 1$ und $g_N = 1$. Modellieren, diskretisieren und lösen Sie dieses Problem mit Hilfe von pyMOR und visualisieren Sie die Lösung.
Beachten Sie dabei, dass die Definition der Art der Randwerte schon beim Anlegen des Gebietes erfolgen muss. Nehmen Sie im Zweifel die Dokumentation von RectDomain
und StationaryProblem
zu Hilfe.
problem = StationaryProblem(
domain=RectDomain(([0, 0], [1, 1]), right='neumann'),
diffusion=ConstantFunction(1, 2),
rhs=ConstantFunction(1, 2),
neumann_data=ConstantFunction(1, 2)
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{N} = \{x \in \overline{\Omega} \;|\; x_0 = 0 \vee x_0 = 1\}$, $\Gamma_\text{D} = \partial\Omega \backslash \Gamma_{N}$, $A = f = 1$ und
$$g_\text{N}(x) = \begin{cases}1, &x_0 = 0\\-1, &x_0 = 1\\0, &\text{sonst}\end{cases}.$$problem = StationaryProblem(
domain=RectDomain(([0, 0], [1, 1]), left='neumann', right='neumann'),
diffusion=ConstantFunction(1, 2),
rhs=ConstantFunction(1, 2),
neumann_data=ExpressionFunction('(x[..., 0] < 1e-7)*-1. + (x[..., 0] > (1 - 1e-7))*1.', dim_domain=2, shape_range=())
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $g_D = 0$ und
Modellieren, diskretisieren und lösen Sie dieses Problem mit Hilfe von pyMOR und visualisieren Sie die Lösung.
problem = StationaryProblem(
domain=omega,
diffusion= ConstantFunction(1, 2) - 0.99*ExpressionFunction('((0.45 <= x[..., 0]) * (x[..., 0] <= 0.55))*1.', dim_domain=2, shape_range=()),
rhs=ExpressionFunction('((0.2 <= x[..., 0]) * (x[..., 0] <= 0.4) * (0.2 <= x[..., 1]) * (x[..., 1] <= 0.4))*1. + ((0.6 <= x[..., 0]) * (x[..., 0] <= 0.8) * (0.6 <= x[..., 1]) * (x[..., 1] <= 0.8))*-1.', dim_domain=2, shape_range=()),
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)
Wir betrachten obiges Problem mit $d = 2$, $\Omega = [0, 1]^2$, $\Gamma_\text{D} = \partial\Omega$, $\Gamma_\text{N} = \emptyset$, $g_D = 0$ und
Modellieren, diskretisieren und lösen Sie dieses Problem mit Hilfe von pyMOR und visualisieren Sie die Lösung.
problem = StationaryProblem(
domain=omega,
diffusion=(
ConstantFunction(1, 2)
+ 100*(ExpressionFunction('((0.25 <= x[..., 0]) * (x[..., 0] <= 0.75) * (0.25 <= x[..., 1]) * (x[..., 1] <= 0.35))*1.', dim_domain=2, shape_range=())
+ ExpressionFunction('((0.65 <= x[..., 0]) * (x[..., 0] <= 0.75) * (0.35 <= x[..., 1]) * (x[..., 1] <= 0.75))*1.', dim_domain=2, shape_range=()))),
rhs=ExpressionFunction('((0.2 <= x[..., 0]) * (x[..., 0] <= 0.4) * (0.2 <= x[..., 1]) * (x[..., 1] <= 0.4))*1. + ((0.6 <= x[..., 0]) * (x[..., 0] <= 0.8) * (0.6 <= x[..., 1]) * (x[..., 1] <= 0.8))*-1.', dim_domain=2, shape_range=()),
)
disc, _ = discretize_stationary_cg(problem)
u_h = disc.solve()
disc.visualize(u_h)