Praktikum zur Vorlesung Numerik partieller Differentialgleichungen I
Mario Ohlberger, Felix Schindler
~/NPDGL1/notebooks/blatt_04.ipynb
.numpy
und pymor.basic
und machen Sie matplotlib
für das Notebook nutzbar.%autosave 0
%matplotlib notebook
import numpy as np
from pymor.basic import *
from matplotlib import pyplot as plt
Machen Sie Teile von Blatt 2 wiederverwedbar, indem Sie
interpolations.py
erstellen und darininterpolate_lagrange_p1(grid, f)
erstellen, welche die Interpolation im Sinne von Blatt 2, Aufgabe 1 berechnet und zurück gibt, undvisualizations.py
erstellen und darinvisualize_lagrange_p1(grid, f_h, name, title)
erstellen, welche eine beliebige Menge von diskreten Funktionen im Sinne von Blatt 2, Aufgabe 2 visualisiert.Hinweis: Nennen Sie das Gebiet omega
, das Gitter coarse_grid
, die Funktion f
und ihre Interpolierte f_H
.
Machen Sie Teile von Blatt 3 wiederverwedbar, indem Sie
grid_tools.py
erstellen und darinF(grid, T, x_hat)
erstellen, welche die Auswertung der Referenzabbildung im Sinne von Blatt 3, Aufgabe 1 berechnet und zurück gibt, undF_inv(grid, T, x)
erstellen, welche die Auswertung der inversen Referenzabbildung im Sinne von Blatt 3, Aufgabe 1 berechnet und zurück gibt undshape_functions.py
erstellen und darinlagrangian_p1_basis(T_hat, x_hat)
erstellen, welche die Auswertung der $P^1$-Basis im Sinne von Blatt 3, Aufgabe 2 berechnet und zurück gibt.Schreiben Sie eine Funktion L2_norm_lagrange_p1(grid, f_h)
, welche $\|f_h\|_{L^2(\Omega)}$ berechnet, wobei f_h
der Vektor der Freiheitsgrade zum Gitter grid
sei und testen Sie Ihre Funktion mit unten stehendem Code.
Leiten Sie dazu zuerst eine entsprechende Integrationsformel her:
Hinweis:
quadrature
von einem Referenzelement.integration_elements
vom Gitter
Schreiben Sie eine Funktion prolong_lagrange_p1(coarse_grid, coarse_DoFs, fine_grid)
, welche eine diskrete Funtion (gegeben durch den Vektor an Freiheitsgeraden coarse_DoFs
bezüglich des Gitters coarse_grid
) auf einem feinerem Gitter fehlerfrei interpoliert.
interpolate_lagrange_p1
Funktion eine Interpolation bezüglich des feinen Gitters.
Bestimmen Sie den Interpolationsfehler, indem Sie zuerst
und dann für Gitter der Feinheit 4, 8, 16, 32 jeweils
Visualisieren Sie die Differenzen in einem Plot.
Wir wissen nach Satz 2.34, dass $$ \|f - f_h\|_{L^2(\Omega)} \leq C h^k $$ für eine geeignete Konstante $C > 0$ (die nicht vom Gitter abhängt). Bestimmen Sie die Konvergenzordnung $k$ experimentell, indem Sie den EOC (experimental order of convergence) berechnen, der folgendermaßen definiert ist: $$ EOC^{(\nu)} := \frac{\ln\Big(\frac{\big\|f - f_h^{(\nu)}\big\|_{L^2(\Omega)}}{\big\|f - f_h^{(\nu - 1)}\big\|_{L^2(\Omega)}}\Big)}{\ln\Big(\frac{h^{(\nu)}}{h^{(\nu - 1)}}\Big)} $$ Dabei bezeichnet $\nu = 0, 1, 2, \dots$ das Level der Verfeinerung und $f_h^{(\nu)}$ die Interpolierte auf das jeweilige Gitter mit Gitterweite $h^{(\nu)}$.
Visualisieren Sie die Fehler geeigneter Weise.