Praktimatika
Praktimatika ist ein Python-Programm, welches bei der Erstellung der Ausarbeitungen für die Anfängerpraktika der Physik helfen soll. So kann man beispielsweise Daten bequem aus Tabellen importieren, Funktionen auf ganze Spalten anwenden und gewichtete Mittelwerte berechnen lassen. Zudem können Funktionen an Daten gefittet werden und danach weiter benutzt werden (z.B. ableiten). Ermöglicht wird das durch Kombination der Python-Bibliotheken numpy, scipy und sympy. Das Programm ist vor allem nützlich, wenn man sowieso Python für die Berechnungen nutzen möchte. Das Programm hat ein Terminal-User-Interface, wodurch man nicht Python können muss. Das User-Interface ist komplett getrennt von der mathematischen Funktionalität, man kann also einfach die Mathe-Tools in sein Skript importieren und nutzen. Das User-Interface ist noch nicht ganz ausgereift, daher wird hier hauptsächlich auf die Mathe-Tools für den Import in Skripten eingegangen.
Die Mathe-Tools ermöglichen:
- Einfache Anfertigung von Plots, auch mit mehreren Datensätzen in einem Plot
- Einfaches Curve-Fitting
- Import von vielen Konstanten
- Schnelle Berechnung von (gewichteten) Mittelwerten
- Schnelle Berechnung der Gaußschen Fehlerfortpflanzung
- "Schlauer Import" von Daten aus Tabellen in numpy-arrays
Folgende Python-Libraries wurden verwendet und müssen gegebenfalls installiert werden:
- numpy: numerische Mathematik
- scipy: curve-fitting
- sympy: symbolische Mathematik
- matplotlib: plotten von Daten
- pandas: Import aus Excel und .ods Dateien
- npyscreen: Terminal-User-Interface
Die Methoden in den Tools sollten in den Python-Dateien selbst ausreichend dokumentiert sein, dennoch wird hier noch die grundlegende Nutzung erläutert
Installation und Import
Das Programm und die Tools können direkt aus dem GitHub-Repository heruntergeladen werden.
Um das Programm mit Terminal-User-Interface zu starten, in einem Terminal python pfad-zur-datei/Praktimatika.py
eingeben.
Die für Skripte relevanten Python-Module befinden sich in den Ordnern "tools" und "maths". Um eine Datei daraus in einem beliebigen Skript zu importieren, muss der Pfad zum Modul zum path hinzugefügt werden. Am Anfang des Skripts sollte also folgendes stehen:
import sys
sys.path.append(pfad-zum-praktimatika-ordner)
from tools import name-des-moduls
Smart-Import von Daten aus Tabellen
Das Modul für die Import-Funktionen heißt tools/sheet_read.py. Mit der Funktion read_table(tabellenpfad) lässt sich eine Tabelle einlesen. Aus der erhaltenen Liste bekommt man von der Funktion get_arrays(liste) ein Dictionary, welches den Variablenname als Key und die Werte als numpy-array enthält. Die Werte müssen in der Tabelle wie folgt gespeichert werden: In einer Zelle steht der Variablenname und darunter stehen alle Werte die zu dieser Variable gehören sollen. Kommt eine leere Zelle oder ein weiterer Name wird dies als Ende des Arrays gewertet. Hat man beispielsweise jeweils 10 Werte für die Zeit t und die Distanz x, schreibt man alle t- und alle x-Werte jeweils in eine Spalte und darüber t bzw. x. Das Dictionary enthält dann zu den Keys x und t jeweils ein numpy-array mit den 10 Werten.
Gaußsche Fehlerfortpflanzung
Mit der Methode error_propagation aus dem Module maths/error.py bekommt man aus einer Sympy-Funktion und den Unsicherheiten der Variablen die Fehlerfortpflanzung. Die Sympy-Funktion erhält man durch f = sympy.sympify("cos(x**2) + exp(z-3/(y**(7/6)))")
. In der erhaltenen Fehler-Funktion ist der Name der Unsicherheits-Variable immer der Variablenname mit einem kleinen "u" am Anfang. Ein Fehler lässt sich dann explizit mit der Funktion calculate aus dem Modul maths/calc.py berechnen, dazu muss man ein Dictionary wie aus dem Smart-Import erhalten übergeben. Ein Beispiel:
values = {"x": [3 4.5 7], "y": [0.4 -0.3 22], "ux": 0.4, "uy": 5}
result ist dann ein numpy-array der Länge 3, mit der jeweiligen Unsicherheit.
f = sympify("cos(x) + y**3")
err = error.error_propagation(f, ["x", "y"])
result = calc.calculate(err, values)
Erstellung von Latex Tabellen
Mit der Funktion latex_table aus dem Modul tools/latex.py lässt sich aus dem Dictionary mit den Werten direkt eine Latex Tabelle erstellen. Dazu erstellt man einen "Formstring", welcher bestimmt welcher Wert in welcher Spalte steht. Unsicherheiten können direkt zu den Werten dazu geschrieben werden, sodass man in Latex ein "x \pm ux" erhält. Ein Beispiel: Man hat die numpy-arrays für n, t, u(t), x und u(x). Dann erstellt man eine Tabelle mit den Spalten n,t,x wie folgt:
formstring = "n & t pm ut & x pm ux"
Notiz: Die Werte müssen in Latex noch auf die richtige signifikante Stellenzahl gekürzt werden. Das ist allerdigns deutlich weniger aufwendig als alles einzeln zu kopieren. Eventuell wird ein "auf x Stellen zuschneiden" Feature in der Zukunft hinzugefügt.
table = latex.latex_table(formstring, dictionary, box=True, decimal_sep=",")
print(table)
Beispiel-Skript
Eine gute Anwendungsmöglichkeit für die Tools ist Aufgabe 12 des Röntgenstrahlungsversuchs im Teil 3. Man muss sechs Datensätze extrapolieren und plotten. Zudem müssen Fehler mit der Fehlerfortpflanzung sowie gewichtete Mittelwerte berechnet werden. Um die Aufgabe zu bearbeiten habe ich ein 85-Zeilen Pyhton Skript geschrieben, dass die Tabelle mit den Messdaten einliest und alles ausrechnet und plottet. Auch eine (fast-) fertige Latex-Tabelle wird ausgegeben. Im Skript muss noch der Pfad zum Praktimatika-Ordner angegeben werden, dann kann man es ausführen. Skript und Messdaten-Tabelle stehen hier zum download zur Verfügung.
Download: xst_12.zip