Partielle DGL

4.3.3. Partielle DGL#

Hide code cell source
import numpy as np
np.set_printoptions(precision=2, linewidth=65)

import matplotlib.pyplot as plt
plt.rc('figure', dpi=150)

import seaborn as sns
sns.set()
sns.set_style('ticks')
sns.set_context("notebook", font_scale=1.2, rc={"lines.linewidth": 1.2})

import scipy.integrate

Als Beispiel für die Lösung einer partiellen Differentialgleichung wird die eindimensionale Wärmeleitgleichung für T=T(x,t) genutzt.

tT(x,t)=xxT(x,t)

In dieser Darstellung wurde die häufig Verwendete verkürzte Schreibweise für partielle Ableitungen verwendet

t=txx=2x2

Zur numerischen Lösung werden die beiden Ableitungen mit finiten Differenzen angenährt. Die zeitliche Ableitung wird mit der Vorwärtsdifferenzenformel zu

T(x)n+1T(x)nΔt=xxT(x,t)

Die Ortsableitung wird mit der Differenzenformel für die zweite Ableitung angenährt. Dabei wird insgesamt wieder das explizite Euler-Verfahren verwendet, so dass die rechte Seite der Gleichung zum Zeitpunkt n ausgewertet wird. Damit ergibt sich für einen Stützpunkt i zur Zeit n

Tin+1TinΔt=Ti1n2Tin+Ti+1nΔx2

Und die Auflösung nach Tin+1 führt zu

Tin+1=Tin+ΔtTi1n2Tin+Ti+1nΔx2

Damit sind alle Bestandteile eines einfachen expliziten Lösers für die obige Wärmeleitgleichung gegeben. Die Lösung soll auf dem Intervall [0,xende]×[0,tende] erfolgen.

Als Beispiel wird der Anfangswert für die Temperatur T(x,t=0)=0 angenommen und die Randbedinungen sind T(x=0,t)=1 und T(x=xende,t)=0. Die örtliche Ausdehnung ist xende=100 und die Berechnung soll bis zum Zeitpunkt tende=5000 erfolgen, wobei 100 Stützstellen für x und 10000 für t verwendet werden sollen.

# Konstanten für das Beispiel
x_ende = 100
t_ende = 5000
nx = 100
nt = 10000
dx = x_ende / (nx-1)
dt = t_ende / (nt-1)
# Infos für die Visualisierung
x = np.linspace(0, x_ende, nx)
t = np.linspace(0, t_ende, nt)
# Array auf dem die Gesamtlösung gespeichert wird
T = np.zeros((nt, nx))
# Setzen der Anfangswerte
T[0,:] = 0

for n in range(1, nt-1):
    Tc = T[n]
    Tn = T[n+1]

    Tn[1:-1] = Tc[1:-1] + dt*(Tc[:-2] - 2*Tc[1:-1] + Tc[2:])/dx**2

    Tn[0] = 1
    Tn[-1] = 0
plt.contourf(T, levels=20, extent=[0, x_ende, 0, t_ende], cmap='jet')
plt.xlabel('Ort x')
plt.ylabel('Zeit t')
plt.colorbar(label='Temperatur T')
<matplotlib.colorbar.Colorbar at 0x7f1aab16e830>
../../../_images/56567891156d5236a2d3e4ab05768e704629c866af15f49a5dfb2f707e4c9c8d.png
for i in [nt//1000, nt//10, nt//2, -1]:
    t_label = f't={t[i]:.0f}'
    plt.plot(x, T[i], label=t_label)

plt.legend()
plt.xlabel('Zeit t')
plt.ylabel('Temperatur T');
../../../_images/56ff9c8299e4fda10af192b2a931e2a4dcfb27a04207762b101053949316e5b3.png
for i in [nx//10, nx//5, nx//2]:
    x_label = f'x={x[i]:.1f}'
    plt.plot(t, T[:,i], label=x_label)

plt.legend()
plt.xlabel('Zeit t')
plt.ylabel('Temperatur T');
../../../_images/52e8a14c2be69e5e3ea59538fb3ec59bc67d3e871d553a0f8c4726be750f3d84.png