Praktikum zur Vorlesung Numerik partieller Differentialgleichungen I

Mario Ohlberger, Felix Schindler

Blatt 04, 04.12.2019

  • Aktivieren Sie wie gewohnt ihre Arbeitsumgebung und starten Sie den Jupyter Notebook server, siehe zB Blatt 1, Aufgabe 0).
  • Laden Sie dieses Blatt von der Homepage herunter und speichern Sie es unter ~/NPDGL1/notebooks/blatt_04.ipynb.
  • Importieren Sie numpy und pymor.basic und machen Sie matplotlib für das Notebook nutzbar.
In [ ]:
%autosave 0
%matplotlib notebook
import numpy as np
from pymor.basic import *
from matplotlib import pyplot as plt

Aufgabe 1: Programmteile wiederverwendbar machen

  1. Machen Sie Teile von Blatt 2 wiederverwedbar, indem Sie

    • eine Datei interpolations.py erstellen und darin
      • eine Funktion interpolate_lagrange_p1(grid, f) erstellen, welche die Interpolation im Sinne von Blatt 2, Aufgabe 1 berechnet und zurück gibt, und
    • eine Datei visualizations.py erstellen und darin
      • eine Funktion visualize_lagrange_p1(grid, f_h, name, title) erstellen, welche eine beliebige Menge von diskreten Funktionen im Sinne von Blatt 2, Aufgabe 2 visualisiert.
  1. Testen Sie diese Funktionen für ein Gitter des Gebiets $\Omega = (0, 1)$ mit 4 Elementen, indem Sie die Funktionen aus den beiden Dateien importieren und aufrufen.

Hinweis: Nennen Sie das Gebiet omega, das Gitter coarse_grid, die Funktion f und ihre Interpolierte f_H.

In [ ]:
 
  1. Machen Sie Teile von Blatt 3 wiederverwedbar, indem Sie

    • eine Datei grid_tools.py erstellen und darin
      • eine Funktion F(grid, T, x_hat) erstellen, welche die Auswertung der Referenzabbildung im Sinne von Blatt 3, Aufgabe 1 berechnet und zurück gibt, und
      • eine Funktion F_inv(grid, T, x) erstellen, welche die Auswertung der inversen Referenzabbildung im Sinne von Blatt 3, Aufgabe 1 berechnet und zurück gibt und
    • eine Datei shape_functions.py erstellen und darin
      • eine Funktion lagrangian_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.

Aufgabe 2: Integration

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:

  • Lokalisieren Sie das Integral bezüglich der Elemente des Gitters
  • Nutzen Sie die Referenzabbildung
  • Nutzen Sie eine Quadratur
  • Nutzen Sie die Basisdarstellung

Hinweis:

  • Sie erhalten die Quadraturpunkte und Gewichte mit Hilfe von quadrature von einem Referenzelement.
  • Sie erhalten die aus dem Transformationssatz resultierende Skalierung mit Hilfe von integration_elements vom Gitter
In [ ]:
 

Aufgabe 3: Prolongation diskreter Funktionen

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.

  • Schreiben Sie dazu analog zu Ihrer interpolate_lagrange_p1 Funktion eine Interpolation bezüglich des feinen Gitters.
  • Suchen sie an jedem Interpolationspunkt des feinen Gitters das Element des groben Gitters, welches das feine Element enthält.
  • Nutzen Sie die Basisdarstellung der diskreten Funktion auf dem groben Gitter, um diese an diesem Punkt auszuwerten.
In [ ]:
 

Aufgabe 4: Interpolationsfehler

Bestimmen Sie den Interpolationsfehler, indem Sie zuerst

  • ein feines Referenzgitter mit 256 Elementen erstellen,
  • die Interpolation von $f$ auf diesem Gitter als Referenzlösung berechnen,

und dann für Gitter der Feinheit 4, 8, 16, 32 jeweils

  • die Interpolation von $f$ auf das Gitter berechnen,
  • die Interpolation auf das Referenzgitter prolongieren
  • die $L^2$-Norm der Differenz zur Referenzlösung berechnen.

Visualisieren Sie die Differenzen in einem Plot.

In [ ]:
 

Aufgabe 5: Interpolationsgüte

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.

In [ ]: