Funktionsplots

Die grafische Darstellung von mathematischen Funktionen ist ein wichtiges Hilfsmittel für die Veranschaulichung mathematischer Zusamenhänge. Sowohl Python als auch Julia ermöglichen Funktionsplots für 2D- und 3D-Darstellungen.

Matplotlib Grundlagen

Das Modul matplotlib verfügt über eine fast unübersichtliche Vielzahl von Möglichkeiten physikalische Zusammenhänge im 2D- oder 3D-Raum zu visualisieren. Neben den üblichen statischen Darstellungen von mathematischen Funktionen in x-y-Koordinaten sind auch Animationen und interaktive Anwendungen implementierbar.

Figure und Axes

Figure Axes

Ein Figure-Objekt legt den gesamten Zeichenbereich fest, in dem ein Funktionsplot eingefügt werden soll.

Ein Axes-Objekt ist zuständig für die Gestaltung des Koordinatensystems: Beschriftung der x,y-Achsen, Einfügen von beliebigen Text und Formeln mit der Latex-Notation usw.. In einem Figure-Objekt können mehrere Axes-Objekte eingebettet werden.

Mit der Axes-Methode axis([x1,x2,y1,y2]) kann man den Wertebereich des Koordinatensystems festlegen.

Die Matplotlib-Methode plot(x,y, ...) stellt mathematische Funktionen y = f(x) in einem 2D-Koordinatensystem dar.

Julia Grundlagen

Die Julia-Funktion plot(x,y, ...) stellt mathematische Funktionen y = f(x) in einem 2D-Koordinatensystem dar. Dazu muss das Paket Plot mit
using Pkg; Pkg.add("Plots")
installiert werden.

Darstellungen einer Wechselspannung

Das erste Beispiel zeigt, wie ein typischer Funktionsplot für eine 50 Hz-Wechselspannung erstellt werden kann.

\[u=\widehat{u} \cdot sin\left( 2\pi \cdot f\cdot t\right) \]

Lösung mit Python

Mit den Terminal-Befehlen
pip3 install numpy
und
pip3 install matplotlib
müssen die Python-Module installiert werden.

Ein Matplotlib-Programm besteht aus drei Teilen:

#plot_wechselspannung.py
import numpy as np
import matplotlib.pyplot as plt
#Funktionsdefinitionen
Ueff=[230,230] #Daten für Effektivwert
def u(t):
    return 325*np.sin(2*np.pi*50*t/1e3)
#Grafikbereich
t=np.arange(0,20,0.001)
fig,ax=plt.subplots() #Objekte erzeugen
ax.plot(t,u(t),'b',lw=2,label="Momentanwert: u(t)")
ax.plot([0,20],Ueff,'r--',label="Effektivwert: 230V")
ax.plot(5,325,'ro',label="Spitzenwert:325V")
ax.set_title("50 Hz Wechselspannung")
ax.set_ylabel("$u(t)$ in V")
ax.set_xlabel("$t$ in ms")
ax.legend(loc='best')
ax.grid(color='g',ls='dashed',lw='0.5')
fig.savefig("wechselspannung.svg")
plt.show() #Plot anzeigen

Ausgabe

50 hz wechselspannung

Analyse

Mit der Methode plot(x,y,...) werden die x-y-Koordinaten der Funktion berechnet und intern im Arbeitsspeicher (RAM) abgespeichert. Die Methode show() bewirkt, dass der Funktionsplot auf dem Monitor angezeigt wird. Mit der Methode savefig(...) kann der Plot in einem gewünschten Bildformat auf der Festplatte gespeichert werden.

Lösung mit Julia

Die Befehlszeile im Julia-Terminal wird als REPL (englisch read-evaluate-print-loop) bezeichnet. Geben Sie in die REPL folgende Befehle ein:
using Pkg
Pkg.add("Plots")
Pkg.add("LaTeXStrings")

Der Julia-Quelltext ist kompakter als der Python-Quelltext.

#plot_wechselspannung.jl
using Plots,LaTeXStrings
fn=50   #Netzfrequenz in Hz
Um=230.  #Effektivwert der Wechselspannung in Volt
u(t) = sqrt(2)*Um*sin.(2*pi*fn*t*1e-3)
Urms(t) = Um
#Grafikbereich
t = 0:1e-2:20 #ms
plot(t,u,lw=2,label=L" \ \textnormal{Momentanwert} \ u\left( t \right)",
xlabel=L"t \ \textnormal{in \ ms}",
ylabel=L"u(t) \ \textnormal{in \ V}",
title="50 Hz Wechselspannung",lc=:blue)
plot!(t,Urms,lw=2,ls=:dash,label=L"\ \textnormal{Effektivwert} \ U_{eff}",lc=:red)
scatter!(5:5,325:325,ms=4,label=L"\ \textnormal{Spitzenwert \ 325 V}",color=:red)
#savefig("jl_wechselspannung.svg")

Ausgabe

50 Hz Wechselspannung

3D-Funktionsplots

Die Funktion

\[p=f\left( T,V\right) =\frac{n\cdot R\cdot T}{V} \]

soll in eine 3D-Koordinatensystem dargestellt werden.

Lösung mit Python

Mit der Anweisung fig.add_subplot(projection='3d') können 3D-Funktionsplots erstellt werden.

#3d_funktionsplot.py
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
#p=n*R*T/V
def p(V,T):
    T=T+273.15 #Umwandlung in K
    n=1        #mol ideales Gas
    R=8.314    #Gaskonstante J/(mol*K)
    return 10*n*R*T/V
#Grafikbereich
fig = plt.figure(figsize=(6,6))
ax = fig.add_subplot(projection='3d') #1
V=np.linspace(10,50,100) #Volumen in dm^3, dann p in hPas
T=np.linspace(0,200,100)
V,T=np.meshgrid(V,T) #2
#x,y,z
ax.plot_wireframe(V, T, p(V,T), rstride=10, cstride=10) #3
#Standardbedingungen Liter, °C, mbar
ax.plot(22.41, 0, 1013,'ro') #roten Punkt zeichen
ax.set(xlabel='V in Liter',ylabel='T in °C',zlabel='p in mbar')
plt.show()

Ausgabe

Zustandsfläche

Analyse

#1: Das ax-Objekt enthält alle Eigenschaften, um einen 3D-Funktionsplot zu zeichnen.

#2: Die NumPy-Funktion meshgrid(...) erzeugt ein Gitternetz von 100×100=10000 Punkten für die x-y-Ebene.

#3: Die Matplotlib-Methode plot_wireframe(...) zeichnet die Funktion p=f(T,V).

Lösung mit Julia

Die Julia-Funktion wireframe(x,y,z, ...) stellt mathematische Funktionen in einem 3D-Koordinatensystem dar.

#3d_funktionsplot.jl
using Plots
#p=n*R*T/V
function druck(V,T)
    T=T+273.15 #Umwandlung in K
    n=1        #mol ideales Gas
    R=8.314    #Gaskonstante J/(mol*K)
    return 10*n*R*T/V
end
#Grafikbereich
V=10:2:50
T=0:20:200
wireframe(V,T,druck,xlabel="V in Liter",ylabel="T in °C",zlabel="p in mbar")
scatter!(22.41:22.41, 0:0, 1013:1013,ms=4,color=:red,label=false)
#savefig("jl_zustandsflaeche.svg")   

Ausgabe

Zustandsfläche

Besuchen Sie die Seite von Matplotlib.

Besuchen Sie die Seite von Julia.


Startseite | Matrizen | Differenzieren | Integrieren | Differenzialgleichungen | Animationen | Literaturverzeichnis | Impressum