© Der/die Autor(en), exklusiv lizenziert an Springer Fachmedien Wiesbaden GmbH, ein Teil von Springer Nature 2022
L. ClassenMit Jupyter durchs Physikpraktikumessentialshttps://doi.org/10.1007/978-3-658-37723-6_5

5. Messunsicherheiten

Lew Classen1  
(1)
Institut für Kernphysik, WWU Münster, Münster, Deutschland
 
 
Lew Classen

In diesem Kapitel erfahren Sie ...

  • wie man Unsicherheiten bei Berechnungen berücksichtigt,

  • wie Sie mit dem Paket uncertainties die Fortpflanzung von Unsicherheiten automatisieren können.

Im Praktikum werden Sie sehr früh das Konzept der (Mess-)Unsicherheit kennen lernen. An dieser Stelle werden wir einige für das Grundverständnis wichtige Punkte aus diesem Gebiet kurz ansprechen. Weiterführende Informationen zum Umgang mit Messunsicherheiten finden Sie z. B. in Thomas Bornath, Günter Walter: Messunsicherheiten – Grundlagen, Springer Essentials (2020) und Thomas Bornath, Günter Walter: Messunsicherheiten – Anwendungen, Springer Essentials (2020). Der Schwerpunkt des Kapitels wird auf der Umsetzung der Unsicherheitsbetrachtung in Python liegen.

5.1 Grundideen

Auf den ersten Blick liefert ein Messgerät einfach einen Wert. Wenn wir die Messung aber oft genug wiederholen, wird die zugrundeliegende Verteilung sichtbar. In diese Verteilung fließen alle Fluktuationen des Messprozesses, wie Ihre Reaktionszeit, die Sensorgenauigkeit, usw., ein. Aus der Verteilung einer Messgröße lassen sich ein Wert (auch Bestwert genannt) und ein Unsicherheitsbereich extrahieren. Aber auch Einzelmessungen, wie das einmalige Ablesen eines Lineals oder einer Digitalanzeige, lassen sich mit Unsicherheiten versehen.

Kurz gesagt, ergeben Werte also erst zusammen mit ihren Unsicherheiten wirklich Sinn. Die Angabe von beiden kann beispielsweise so aussehen:
$$ \mathrm {{Ergebnis} = {Wert} \pm {Unsicherheit}} $$
Häufig folgen Messgrößen der Normalverteilung (Gaußverteilung). Hier ist der Bestwert der Messgröße der Mittelwert $$\mu $$. Die Unsicherheit auf diesen Mittelwert ist durch die Standardunsicherheit $$\sigma _n$$ (in der Literatur auch als Standardfehler bezeichnet). Die Standardunsicherheit erhält man aus der Standardabweichung $$\sigma $$ des Datensatzes und der Anzahl der darin enthaltenen Messwerte n durch $$\sigma _n = \sigma / \sqrt{n}$$. Das Resultat einer solchen Messung lässt sich dann so angeben:
$$ \textrm{Ergebnis} = \mu \pm \sigma _{n} $$
Abb. 5.1

Berechnung von Mittelwert und Standardfehler der Magnetfeldmessung mit numpy-Funktionen

Wenden wir dieses Verfahren beispielsweise, wie in Abb. 5.1 dargestellt, auf die Magnetfeldmessung aus Abschn. 3.​1 an, so erhalten wir
In der Praxis beutet diese Angabe: „Mit einer Wahrscheinlichkeit von $${\sim } 68\,\%$$ liegt der tatsächliche Mittelwert der Verteilung innerhalb des angegebenen Intervalls um den Bestwert.“ Die Angabe von $$1\,\sigma $$-Unsicherheiten ist dabei Konvention und sollte im Paper oder Bericht erwähnt werden. Man kann die Wahrscheinlichkeit dafür, dass der tatsächliche Mittelwert innerhalb des Intervalls liegt, erhöhen: Die Wahrscheinlichkeit bei $$2\,\sigma $$-Intervallen liegt schon bei $${\sim } 95\,\%$$ und bei $$3\,\sigma $$ bei über $$99\,\%$$. Der Preis dafür ist eine Vergrößerung des angegebenen Bereichs.

Bei Einzelmessungen werden der Bestwert und die Unsicherheit zwar aufgrund anderer statistischer Verteilungen bestimmt, allerdings werden die Unsicherheiten üblicherweise so normiert, dass ihre Angabe ähnlichen Wahrscheinlichkeiten entsprechen.

5.2 Fehlerfortpflanzung

Nun ist es nicht immer der Fall, dass man eine gesuchte Größe direkt messen kann. Oft ist es nötig, eine Größe aus mehreren Messgrößen zu berechnen, die jeweils mit Unsicherheiten behaftet sind. Die Methode, die Unsicherheit dieser abgeleiteten Größe aus den Unsicherheiten der einzelnen Messgrößen zu bestimmen, heißt Fortpflanzung der Unsicherheiten bzw. Fehlerfortpflanzung1. Ein gängiges Verfahren im Praktikum ist die sogenannte „Gaußsche Fehlerfortpflanzung“: Für den Fall, dass eine abgeleitete Größe y sich aus mehreren, voneinander statistisch unabhängigen, Messgrößen $$x_i$$ berechnen lässt:
$$ y = f(x_1, x_2, \cdots , x_n) $$
lautet der Ausdruck für die Unsicherheit $$\Delta y$$ dieser Größe:
$$\begin{aligned} {\Delta y}= & {} \sqrt{\left( \frac{\partial y}{\partial x_1} \cdot \Delta x_1 \right) ^2 +\left( \frac{\partial y}{\partial x_2} \cdot \Delta x_2 \right) ^2 + \cdots + \left( \frac{\partial y}{\partial x_n} \cdot \Delta x_n \right) ^2}\\ {}= & {} \sqrt{\sum _{i=1}^{n} \left( \frac{\partial y}{\partial x_i} \cdot \Delta x_i \right) ^2} \end{aligned}$$
Nehmen wir der Anschaulichkeit halber ein Beispiel: Ein Größe $$\theta $$ hängt von den Messgrößen x und y ab:
$$ \theta = \arccos {\left( \frac{x}{y} \right) } $$
Wir kennen die Unsicherheiten $$\Delta x$$ und $$\Delta y$$ und möchten die resultierende Unsicherheit $$\Delta \theta $$ berechnen:
$$ {\Delta \theta }=\sqrt{\left( \frac{\partial \theta }{\partial x} \cdot \Delta x \right) ^2 +\left( \frac{\partial \theta }{\partial y} \cdot \Delta y \right) ^2} $$
Wir erhalten schließlich2 den Ausdruck
$$ \Delta \theta = \sqrt{\left( \frac{1}{y\sqrt{1 - \left( \frac{x}{y}\right) ^2}}\right) ^2 \cdot \left[ \Delta x^2 + \left( \frac{x}{y} \cdot \Delta y \right) ^2 \right] }. $$
Diese Berechnung können Sie nun in Python durchführen. Das hat den Vorteil, dass Sie den Ausdruck nicht mehrfach in Ihren Taschenrechner einzugeben brauchen und Sie in Ruhe nach eventuellen Tippfehlern suchen können. Dazu können Sie den Ausdruck mit Zahlenwerten direkt in eine Code-Zelle schreiben und ausführen. Oder Sie schreiben die Formel als Python-Funktion, um einfach Zahlenwerte auszutauschen und sie im gesamten Notebook aufrufen zu können. Dieses Vorgehen sehen Sie in Abb. 5.2.
Abb. 5.2

Berechnung des Wertes und der Unsicherheit der abgeleiteten Größe $$\theta (x,y)$$ mit numpy-Funktionen. Für die Bestimmung der Unsicherheit wird eine eigene Funktion delta_theta() definiert

Wie Sie sehen, lässt sich die Unsicherheitsfortpflanzung mit Python in wenigen Schritten umsetzen. Auch die farbliche Markierung von zusammengehörigen Klammern beim Eintippen ist dabei sehr hilfreich3. Dennoch ist sie oft eine nicht zu unterschätzende Fehlerquelle im Praktikum. Achten Sie also sorgfältig auf korrekte Implementierung der Formeln.

5.3 Behandlung von Unsicherheiten mit uncertainties

Praktischerweise können Sie diese Fehlerquelle umgehen, indem Sie mit dem Paket uncertainties4 die Fortpflanzung der Unsicherheiten automatisieren.

Installation des Pakets

Da uncertainties nicht Teil der Anaconda-Standardinstallation ist, müssen wir es installieren, bevor wir das Paket in unserem Notebook verwenden können. Am schnellsten lässt sich das über die Kommandozeile erledigen:
  • Unter Windows starten Sie den Anaconda Prompt.

  • Unter Linux oder macOS öffnen Sie das Terminal. Eventuell müssen Sie nun zunächst die Anaconda-Umgebung aktivieren:
  • Geben Sie nun folgenden Befehl im Anaconda Prompt bzw. dem Terminal ein:
  • Damit ist das Paket uncertainties in der Standardumgebung base installiert und kann sofort verwendet werden.

Natürlich können Sie auch die graphische Paketverwaltung des Anaconda-Navigators verwenden: Im Navigator wählen Sie in der rechten Leiste das Feld Environments aus und klicken in dem erscheinenden Fenster auf base(root). Rechts sehen sie eine Liste aller installierten Pakete. Um nach neuen Paketen zu suchen, stellen Sie nun im Drop-Down Menü die Option Not installed ein. Unter Channels müssen Sie nun mit Add... die Paketquelle conda-forge hinzufügen, indem Sie sie in das erscheinende Feld eingeben. Nachdem Sie mit Update index die Paketlisten von Anaconda aktualisiert haben, können Sie im rechten Feld nach dem Paket uncertainties suchen. Wählen Sie anschließend das Paket aus der Liste aus und drücken Sie Apply um es zu installieren.

Verwendung von uncertainties

Eine der wichtigsten Funktionen von uncertainties ist das Ablegen des Bestwerts einer Messgröße zusammen mit der dazugehörigen Unsicherheit in einer einzigen, gemeinsamen Variable abzulegen. Dazu führt das Paket einen neuen Variablentyp ein: ufloat, eine Fließkommazahl (float) mit Unsicherheit. Um mit diesen Variablen rechnen zu können, benötigen Sie außerdem noch mathematische Funktionen, die mit ufloats kompatibel sind. Diese bringt uncertainties in den Unterpaketen umath und unumpy mit. Das sind spezielle Versionen von math5 und numpy. Praktischerweise behalten sie weitgehend die Funktionsnamen ihrer Vorbilder bei, so dass sie keine neuen Konventionen zu lernen brauchen.

Mit folgenden Zeilen bereiten Sie Ihr Notebook auf das Rechnen mit automatischer Fortpflanzung von Unsicherheiten vor:

ufloat-Variablen lassen sich nun folgendermaßen anlegen:
Das erste Argument ist jeweils der Bestwert und das zweite die entsprechende Unsicherheit. Für Berechnungen mit diesen Variablen müssen wir die mathematischen Funktionen aus den Paketen umath oder unumpy verwenden. Betrachten wir nochmal das Beispiel aus Abschn. 5.2:
$$\begin{aligned} \theta = \arccos {\left( \frac{x}{y}\right) } \end{aligned}$$
(5.1)
Der entsprechende Code lautet:
Die so erzeugte neue Variable theta ist dabei eine Zahl mit automatisch berechneter Unsicherheit (siehe Abb. 5.3).
Abb. 5.3

Berechnung des Wertes und der Unsicherheit der abgeleiteten Größe $$\theta (x,y)$$ mit dem Paket uncertainties. Die Ergebnisse stimmen mit der manuellen Methode in Abb. 5.2 überein

Wenn Sie die Werte der Variablen ausgeben lassen, haben Sie zwei Möglichkeiten:
liefert die maximale Anzahl an Nachkommastellen. Während der Befehl
den dargestellten Wert und seine Unsicherheit auf eine sinnvolle Anzahl an Nachkommastellen – die sogenannten signifikanten Stellen oder gültige Ziffern – rundet. Das gilt übrigens nicht nur für Ergebnisse von Berechnungen, sondern für jede Zahl im ufloat-Format. Daneben können Sie auch explizit auf den Bestwert und die Unsicherheit einer Variable zugreifen. Den Bestwert liefert der Ausdruck

während Sie die Unsicherheit mit:

erhalten. Nachdem Sie nun das Rechnen mit Unsicherheiten kennen gelernt haben, werden wir uns im folgenden Kapitel der Modellanpassung widmen – einer Methode, bei der Unsicherheiten ebenfalls eine wichtige Rolle spielen.