Im Folgenden werde ich Ihnen keine strukturierte "Einführung in die Programmiersprache Python" geben, sondern es werden nur ganz spezielle Themen der Programmiersprache Python vorstellt, die wir zur Visualisierung der mittels unserer C++ Programme erstellten Daten und zum Verständnis der Vorlesung Einführung in die Programmierung für Studierende der Physik benötigen. Strukturierte Einführungen in die Programmiersprache Python finden Sie z.B. unter den folgenden Links:
Im Speziellen werden wir in diesem Jupyter Notebook das folgende Python-Skript (Python-Skript: PythonPlot_While_4.py) näher betrachten, welches im Unterpunkt Anwendungsbeispiel: Folgen und Reihen zur Datenvisualisierung verwendet wurde.
# Python Programm zum Plotten der berechneten Daten von (While_4.cpp) import matplotlib.pyplot as plt # Python Bibliothek zum Plotten (siehe https://matplotlib.org/ ) import numpy as np # Python Bibliothek fuer Mathematisches (siehe https://numpy.org/ ) data = np.genfromtxt("./While_4.dat") # Einlesen der berechneten Daten von While_4.cpp plt.title(r'Approximation der Eulerschen Zahl e mittels ihrer Folgendefinition') # Titel der Abbildung plt.ylabel(r'$e_{approx}$') # Beschriftung y-Achse plt.xlabel('Index n') # Beschriftung x-Achse plt.plot(data[:,0],data[:,1], marker='+', color="blue") # Plotten der Daten plt.plot([data[0,0],data[-1,0]],[np.e,np.e], color="red") # Horizontale Linie, die den exakten Wert von e markiert plt.savefig("PythonPlot_While_4.png", bbox_inches="tight") # Speichern der Abbildung als Bild plt.show() # Zusaetzliches Darstellen der Abbildung in einem separaten Fenster
Möchte man eine Gleichung in einem C++ Programm implementieren, muss man zunächst die in ihr enthaltenen Variablen im C++ Programm deklarieren (näheres siehe Datentypen und Variablen). Ähnlich, wie bei einer präzisen mathematischen Definition, deklariert man die Variablen in einem C++ Programm auch anhand ihrer Zahlenmengen-Zugehörigkeit. Die Programmiersprache C++ stellt hierbei eine Vielzahl von Datentypen bereit (z.B. int, double, ...).
Dies ist in der Programmiersprache Python nicht nötig und beim Initialisierungsprozess einer Variable wird, ähnlich dem C++ auto-Befehl, automatisch der Typ festgelegt.
zeichen = "Hallo"
zahl_1 = 3
zahl_2 = 2.45688586
Den Datentyp einer definierten Variable erhält man mit:
type(zeichen)
type(zahl_1)
type(zahl_2)
Der Wert einer Variable ist unter ihrem Variablennamen gespeichert:
zahl_2
Bei der Visualisierung von Daten, die mit unseren C++ Programmen berechnet wurden, lesen wir die Dateien dieser Datenlisten zunächst ein und visualisieren Sie danach. Eine Zahlenliste in Python wird z.B. wie folgt definiert:
meine_liste = [0,1,4,9,16]
type(meine_liste)
Die Werte der definierten Liste sind unter ihrem Variablennamen gespeichert.
meine_liste
Möchte man z.B. den dritten Eintrag der Liste ausgeben lassen, schreibt man
meine_liste[2]
$[2]$, da der Index der Liste beginnend von Null gezählt wird. Möchte man sich einen speziellen Bereich der Listeneinträge ausgeben lassen (z.B. von 1 bis 3) schreibt man
meine_liste[1:4]
Unsere Daten bestehen aber oft aus mehreren Einträgen, eine Art von Matrizen oder Listen von Listen. Wir lesen uns nun die ausgegebenen Daten 'While_4.dat' des C++ Programms While_4.cpp ein. Hierbei benutzen wir das Python-Modul numpy, welches wir zunächst einlesen (importieren) müssen. Falls Sie das NumPy Modul das erste Mal verwenden, müssen Sie es zunächst in Ihrer Python 3 Umgebung installieren (z.B. in einem Linux Terminal mit "pip3 install numpy"). Beim Importieren benennen wir das eingelesene Modul in "np" um, sodass wir bei der Verwendung von NumPy-Befehlen stets ein "np." vor den jeweiligen Befehl schreiben müssen.
NumPy ist ein Akronym für "Numerisches Python" und es stellt ein Erweiterungsmodul für Python dar, welches zum größten Teil in der Programmiersprache C geschrieben ist. NumPy ermöglicht das effiziente Rechnen mit großen Arrays und Matrizen und zusätzlich sind viele mathematische Funktionen dort definiert.
Wir lesen nun die Daten ein und speichern diese unter der Variable 'data', wobei Sie bei der unten benutzten verwendeten Angabe der Datei darauf achten müssen, dass sich die Datei 'While_4.dat' in dem selben Verzeichnis befindet, wie dieses Jupyter Notebook.
import numpy as np
data = np.genfromtxt("./While_4.dat")
Betrachten wir zunächst den Datentyp der Datenvariable 'data':
type(data)
Es handelt sich um ein sogenanntes "NumPy ndarray", eine mehrdimensionales Array von Zahleneinträgen mit folgender Struktur (die Deklaration und Initialisierung von C++ Arrays werden wir in der Vorlesung erst später kennenlernen):
data
Der Zugriff auf einzelne Zahlenelemente ist ähnlich der von Listen, jedoch gibt es kleine Unterschiede. Wir bezeichnen im Folgenden die ersten Einträge als x-Werte und die zweiten als y-Werte.
Die x-Werte erhält man mit
data[:,0]
, die y-Werte mit
data[:,1]
, wobei der Doppelpunkt bedeuted, das alle y-Werte ausgegeben werden sollen. Möchte man sich z.B. den dritten y-Wert ausgeben lassen, schreibt man
data[2,1]
Man kann ein NumPy-Array mit dem Befehl "list(...)" in eine Liste umwandeln. Z.B. erhält man die Liste der ersten fünf y-Werte mit:
list(data[0:5,1])
Nun möchten wir die eingelesenen Datenpunkte in einem x-y-Diagramm visualisieren. Hierbei benutzen wir das Python-Modul "matplotlib" (siehe Matplotlib: Visualization with Python), welches wir zunächst einlesen (importieren) müssen. Falls Sie das Matplotlib Modul das erste Mal verwenden, müssen Sie es zunächst in Ihrer Python 3 Umgebung installieren (z.B. in einem Linux Terminal mit "pip3 install matplotlib").
import matplotlib.pyplot as plt
Wir stellen die Datenpunkte mittels des Befehls 'plt.plot(...)' dar (näheres siehe matplotlib.pyplot.plot und Pyplot tutorial).
plt.plot(data[:,0],data[:,1], marker='+', color="blue");
Um ein schöneres Erscheinungsbild des Bildes zu erhalten und eine Titel-Überschrift, eine Beschreibungen der x- und y-Achsen zu erhalten, die Bildgröße festzulegen gibt man z.B. das Folgende ein:
import matplotlib
params = {
'figure.figsize' : [10,8],
'axes.titlesize' : 16,
'axes.labelsize' : 18,
'xtick.labelsize' : 14,
'ytick.labelsize' : 14
}
matplotlib.rcParams.update(params)
plt.title(r'Approximation der Eulerschen Zahl e mittels ihrer Folgendefinition')
plt.ylabel(r'$e_{approx}$')
plt.xlabel('Index n')
plt.plot(data[:,0],data[:,1], marker='+', color="blue");
plt.plot([data[0,0],data[-1,0]],[np.e,np.e], color="red");
Zusätzlich wurde in dem oberen Diagramm noch eine horizontale rote Linie eingezeichnet, die den exakten Wert von e markiert. Bei dieser roten Linie erkennt man gut die unterliegende Struktur der plot(...)-Funktion. Es wird hierbei eine Linie durch die folgenden x- und y-Werte gezeichnet
[data[0,0],data[-1,0]],[np.e,np.e]
was ja gerade eine horizontale Linie im x-Bereich von 0 bis 20 mit einem y-Wert von 2.718281828459045 ergibt.
Das erzeugte Bild kann man schließlich mittels des folgenden Befehls speichern:
plt.savefig("PythonPlot_While_4.png", bbox_inches="tight")