Mastodon

Hier geht es nicht um die „Basics“, wie man cm in m umrechnet. Hier geht es darum, wie man ausrechnet, was ein Watt eigentlich ist, welches man durch die Multiplikation von Volt und Ampere erhalten hat. Gleich als kleine Vorwarnung: Das ist ziemlich abgefahren. Aber ich versuche dem Ganzen etwas die „Schärfe“ zu nehmen in dem ich zeige, wie man das alles mit Mathematica auf dem „Raspi“ ausrechnen kann.

Wir sind es gewohnt, mit Einheiten zu rechnen, in dem wir wissen, was physikalisch dahintersteckt. Wenn wir etwa eine Spannung U mit einem Strom I multiplizieren, so ergibt sich als Einheit für die resultierende Leistung P die Einheit Watt W, dir wir als Produkt von Volt und Ampere ausrechnen.

Mathematica bietet diese Möglichkeit direkt an. Es ist etwas umständlich, Werte von physikalischen Größen einzugeben. Aber danach hat man den Vorteil, dass das System auch die Einheiten gleich mit ausrechnet.

u := Quantity[3, "Volt"]
a := Quantity[2, "Ampere"]
UnitSimplify [ u a ]
> 6 W

Eine andere Möglichkeit, mit Einheiten zu rechnen ist GNU Units. Es hat den Vorteil im Prinzip auf jedem Linux-Rechner zur Verfügung zu stehen. Allerdings weiß es zwar, welche Einheiten zusammenpassen, aber da das nicht eindeutig ist, hat man sich bei diesem Tool dazu entschieden, dass der Anwender sagen muss, was er haben möchte.

$ units -t "2 pi 3.5MHz 2.7 µH" ohm
59.376101

Ampere ist dabei im SI-System eine Basiseinheit und das Volt ergibt sich zu $ kg \  m^2  /  (A \ s^3) $. Es wäre nun schön, in diesen Einheiten direkt rechnen zu können. Wenn man sich mit Vektoren etwas auskennt, könnte man auf die Idee kommen, eine Einheit als Vektor zu schreiben, bei dem die Komponenten die Basiseinheiten des SI-Systems sind. Die Werte in den Vektoren sind die Exponenten.

Ein erster Versuch (der so nicht gut funktioniert, um das gleich vorwegzunehmen):

$$
kg =   \begin{pmatrix} 1 \\ 0 \\ 0 \\ 0 \end{pmatrix}   \ \ \
m =   \begin{pmatrix} 0 \\ 1 \\ 0 \\ 0 \end{pmatrix}   \ \ \
s =   \begin{pmatrix} 0 \\ 0 \\ 1 \\ 0 \end{pmatrix}   \ \ \
A =   \begin{pmatrix} 0 \\ 0 \\ 0 \\ 1 \end{pmatrix}
$$

Wie sieht ein solches System der physikalischen Einheiten in Mathematica „unter der Motorhaube“ aus? Dazu versuchen wir es selber mathematisch so zu modellieren, dass wir es in Mathematica ausrechnen können. Wenn man physikalische Größen miteinander multipliziert, so müsste man die Werte in den Vektoren addieren. Das passt natürlich nicht zusammen. Eine Möglichkeit wäre, eine spezielle Art der Vektormultiplikation zu erfinden, die genau so definiert ist. Das Problem dabei ist, dass wir so kein normales Algebra-System als Hilfestellung nutzen könnten.

Das Ziel ist hier, die physikalischen Einheiten so zu definieren, dass sich “richtig” damit rechnen lässt. Es gibt andere Ansätze dieses Problem zu lösen. In der objektorientierten Programmierung könnte man beispielsweise die Rechenregeln in passende Objekte verpacken und käme so doch mit diesen Vektoren aus.

Wie schon so oft hilft es, die Sache scheinbar komplizierter zu machen. Wir kennen eine Operation, die eine Multiplikation in eine Addition umwandelt: Bei der Potenzrechnung ist die Multiplikation der Potenzen mit gleicher Basis die Addition der Exponenten. Wir könnten also die Vektoren der Einheit als Exponent zur Basis e schreiben.

Die Basis ist hier eigentlich egal. Diese Gesetzmäßigkeit gilt für alle Potenzen. Hier wurde e gewählt, weil Mathematica dafür eine fertige Funktion anbietet.

Es ergibt sich aber das nächste Problem, dass die Multiplikation der Einheiten nicht sinnvoll definiert wäre. Wenn man mit „Standard-Mathematik“ zwei Vektoren multipliziert, erhält man entweder einen Skalar oder einen Vektor, der senkrecht auf den beiden ersten steht. Beides macht hier keinen Sinn. Wieder stehen wir vor dem Problem, dass wir die Multiplikation selbst neu definieren müssten. Also machen wir das Ganze noch komplizierter, sodass zum einen die Potenzen der Basiseinheiten sinnvoll definiert sind und die Rechenoperationen noch kommutativ sind, so wie wir das vom Rechnen mit Einheiten gewohnt sind: Wir schreiben die Basiseinheiten als Diagonalmatrix mit genau einer 1 auf der Diagonale.

Zweiter Versuch:

$$ \begin{align}
kg =  e ^ {\begin{pmatrix} 1 & 0 & 0& 0 \\ 0 & 0& 0& 0 \\ 0& 0& 0& 0 \\ 0& 0& 0& 0 \end{pmatrix}  } \\ \\
m =  e ^ {\begin{pmatrix} 0 & 0 & 0& 0 \\ 0 & 1& 0& 0 \\ 0& 0& 0& 0 \\ 0& 0& 0& 0 \end{pmatrix}  } \\ \\
s =   e ^ {\begin{pmatrix} 0 & 0 & 0& 0 \\ 0 & 0& 0& 0 \\ 0& 0& 1& 0 \\ 0& 0& 0& 0 \end{pmatrix}  } \\ \\
A =  e ^ {\begin{pmatrix} 0 & 0 & 0& 0 \\ 0 & 0& 0& 0 \\ 0& 0& 0& 0 \\ 0& 0& 0& 1 \end{pmatrix}  }
\end{align} $$

Quadratische Diagonalmatrizen haben die von uns gewünschten Eigenschaften: Die Matrix als Exponent ergibt wieder eine Diagonalmatrix. Die Multiplikation zweier solcher Matrizen ist ebenfalls wieder eine Diagonalmatrix. Und auch das Inverse, über das hier später noch die Division definiert wird, ist auch wieder eine Diagonalmatrix. Und die Potenz der Matrix bringt die Transformation der Multiplikation in eine Addition. Es passt also alles so, wie wir das hier brauchen.

Aber dennoch gibt es ein letztes kleines Problem. Aufgrund der Rechenregeln der Potenzen mit einer Matrix als Exponenten könnten wir eine Einheit, die genau jede Basiseinheit mit dem Exponent 1 enthält, nicht von einer Zahl ohne Einheit mit dem Wert der Basis e unterscheiden.

kg m s A = e

Also gehen wir noch einen kleinen Schritt weiter und erhöhen die Größe der Matrix um 1, sodass wir einen eigenen Eintrag für genau keine Einheit haben.

Das ist nun die Version, die wir in Mathematica sinnvoll abbilden können:

$$ \begin{align}
kg =  e ^ {\begin{pmatrix} \textcolor{red}{0}& 0& 0& 0& 0 \\ 0 & \textcolor{green}{1} & 0 & 0& 0 \\ 0 &0 & 0& 0& 0 \\ 0 &0& 0& 0& 0 \\ 0 &0& 0& 0& 0 \end{pmatrix}  } \\ \\
m =  e ^ {\begin{pmatrix} \textcolor{red}{0}& 0& 0& 0& 0 \\ 0 & 0 & 0 & 0& 0 \\ 0 &0 & \textcolor{green}{1}& 0& 0 \\ 0 &0& 0& 0& 0 \\ 0 &0& 0& 0& 0 \end{pmatrix}  } \\ \\
s =   e ^ {\begin{pmatrix} \textcolor{red}{0}& 0& 0& 0& 0 \\ 0 & 0 & 0 & 0& 0 \\ 0 &0 & 0& 0& 0 \\ 0 &0& 0& \textcolor{green}{1}& 0 \\ 0 &0& 0& 0& 0 \end{pmatrix}  } \\ \\
A =  e ^ {\begin{pmatrix} \textcolor{red}{0}& 0& 0& 0& 0 \\ 0 & 0 & 0 & 0& 0 \\ 0 &0 & 0& 0& 0 \\ 0 &0& 0& 0& 0 \\ 0 &0& 0& 0& \textcolor{green}{1} \end{pmatrix}  }
\end{align} $$

Umgekehrt bedeutet das, wir können auch bei Größen mit Einheiten genau aus diesem Feld oben links in rot immer den Zahlenwert lesen. Danach kann die Größe durch den Wert geteilt werden und das, was übrig bleibt, repräsentiert genau die Einheit. Nun haben wir also unsere Einheiten so definiert, dass wir ganz normal damit rechnen können, ohne schon vorher wissen zu müssen, was physikalisch hinter der Kombination der Einheit steckt.

Um das klarzustellen: Diese Version, die Einheiten in Form einer Matrix als Exponent zu schreiben, erhebt nicht den Anspruch die „Mathematische Wahrheit“ über die physikalischen Einheiten darzustellen. Es ist ein Modell, welches die hier betrachteten rechnerischen Eigenschaften der Einheiten umsetzt.

So sieht das dann in Mathematica aus:

kg     := MatrixExp[DiagonalMatrix[{0, 1, 0, 0, 0}]]

meter  := MatrixExp[DiagonalMatrix[{0, 0, 1, 0, 0}]]

second := MatrixExp[DiagonalMatrix[{0, 0, 0, 1, 0}]]

ampere := MatrixExp[DiagonalMatrix[{0, 0, 0, 0, 1}]]

Ich habe ein Notebook für Mathematica zusammengestellt. Da sind alle hier gezeigten Dinge enthalten. Nach dem Laden mit Open muss es “evaluiert” werden. Das kann man entweder im Menü Evaluate machen oder bestätigt nach der Eingabe der ersten eigenen Zeile die Frage, ob dieses jetzt gemacht werden soll.

Damit kann sich alle anderen Einheiten mithilfe der passenden physikalischen Gesetze definieren. Zu beachten ist, dass hier Matrizen-Multiplikation und -Division zu benutzen ist. Die Matrizen-Muliplikation ist in Mathematica der Punkt. Und die Division ist die Multiplikation mit dem Inversen. Das macht die Schreibweise etwas umständlich. Um das wenigstens etwas zu vereinfachen, können wir uns eine Funktion für die Matrix-Division definieren.  Es hat natürlich einen Grund, dass Mathematica das nicht gleich selbst macht: Das funktioniert so einfach nicht für alle Matrizen, aber für die hier von uns benutzten Diagonal-Matritzen. Damit es sich bequem schreiben lässt wurde das hier geschickt verpackt. Zuerst erklären wir dem System wie wir hier unsere Matritzen multipliziert haben wollen und danach sagen wir ihm noch, dass das auch bei der Infix-Notation mit dem / gelten soll

RawSlash[x_, y_] := If[MatrixQ[y], x * Inverse[y], Divide[x, y]]

Needs["Notation`"]

Notation[
NotationTemplateTag[x_ / y_ ] \[DoubleLongLeftRightArrow] 
NotationTemplateTag[RawSlash[x_, y_]]]

Im Mathematica sieht das etwas eleganter aus, wenn man die Dialogbox nutzt, die sich nach Needs[“Notation`”] öffnet

Man kann umgekehrt den Einheiten wieder Namen zuweisen:

unitname[volt] := "V"

Und mit einer kleinen Hilfsfunktion pretty lassen sich bekannte Einheiten auch wieder „hübsch“ ausgeben. Und dank dieser Preprozessor-Zeile wird die Funktion automatisch aufgerufen.

$PrePrint = If[MatrixQ[#], pretty[#], #] &;
Damit diese Art zu rechnen funktioniert, muss Mathematica dazu gebracht werden, auch mit Zahlen exakt zu rechnen. Dazu nutzt man eine spezielle Notation, die man dem System beibringt. Ein doppelter Geteilt-Strich // hinter einem Dezimalbruch sagt dem System, dass es die Zahl „rationalisieren“ soll, also wie einen echten Bruch behandeln soll.


Notation[
NotationTemplateTag[x_ //] \[DoubleLongLeftRightArrow] 
NotationTemplateTag[Rationalize[x_]]]

Auch das sieht direkt im Mathematica etwas eleganter aus. Das System versucht Zeichen, die u.U. nicht gut dargestellt werden können, in ASCII-Worten zu beschreiben. Ein \[DoubleLongLeftRightArrow] wird beispielsweise zu einem .

Wer mag, kann sich die Matrizen auch direkt anzeigen lassen:

MatrixForm[watt]

Man sieht, dass die Exponentialfunktion unseren „Nicht-Einheitswert“ zu 1 gemacht hat, eben weil e0 gleich 1 ist. Und die Einheiten haben alle das e als Basis. Oder man lässt sich die Exponentialfunktion mit dem Logarithmus wieder zurückrechnen:

MatrixForm[MatrixLog[watt]]

Das kann man sich mit einer Hilfsfunktion auch direkt mit den Einheiten darstellen und kann es mit der Erklärung in Wikipedia vergleichen

unitSI[watt]

Schließlich können wir damit richtig rechnen. Das System erkennt, dass wir hier den imaginären Widerstand einer Spule ausrechnen und gibt das Ergebnis in Ohm an.

2 Pi 3500 kilo hertz 1 nano henry

Das Ganze ist noch „work in progress“. Eine zukünftige Version des Notebooks soll auch mit komplexen Zahlen symbolisch rechnen können.

Sonderfälle

Viele Formeln multiplizieren und dividieren Größen mit Einheiten. Daraus ergibt sich dann direkt die Einheit des Ergebnisses. Und wie hier beschrieben, ergibt sich daraus auch die Zusammensetzung aus Basiseinheiten. Nun gibt es aber Größen, die selbst als Vektor zu betrachten sind. Und es gibt verschiedene Arten, Vektoren zu multiplizieren. Eine Kraft und eine Länge haben beide eine Richtung. Wenn die Richtung die gleiche ist und die Kraft wirkt beschleunigend entlang der Länge, dann ist das Resultat eine verrichtete Arbeit, die genau wie Energie in Joule gemessen wird.

Wenn die beiden Größen dagegen senkrecht aufeinander stehen und die Kraft wirkt an einem Hebel mit der Länge auf eine Drehachse, dann wird das als Vektorprodukt ausgerechnet. Das Ergebnis ist auch wieder ein Vektor, der das Drehmoment beschreibt, welches auf die Achse wirkt. Da sich dabei nichts bewegen muss, wird auch keine Arbeit verrichtet. Das Produkt von Newton und Meter bleibt dabei einfach stehen und wir sagen, das Drehmoment wird in Newtonmeter Nm angegeben.

cgs

In älterer Literatur findet man noch das cgs-System, welches in der Variante des elektrostatischen Systems ESU die Besonderheit hat, keine eigene Einheit für eine elektrische Größe zu enthalten. Man wählt dazu ein physikalisches Gesetz zur Beschreibung der elektrischen Größen, konkret das Gesetz von Coulomb, welches die mechanische Kraft zwischen Ladungen beschreibt. Im SI-System sind wir gewohnt, in diesem Gesetz Konstanten als Umrechnungsfaktor zu haben. Das $\epsilon_0$ entsteht aber erst durch die Wahl des Einheitensystems. Im cgs-ESU-System wählt man die Konstante zu 1, sodass dieses Gesetz ganz einfach aussieht:

$$ F = Q1 \ Q2 / r^2 $$

Das formt man um und mit F=ma und Q=It kann man es nach Ampere auflösen und erhält in SI-Einheiten:

$$ A = m^{3/2} \ kg^{1/2} \ s^{-2}$$

Durch den Wegfall einer expliziten physikalischen Einheit für den elektrischen Strom wird dieser also zu einer abgeleiteten Einheit mit rationalen Exponenten. Um wirklich cgs zu erhalten, muss man die Basisgrößen noch anpassen:

$$ A = cm^{3/2} \ g^{1/2} \  s^{-2}$$

Der elektrische Strom ist also in den mechanischen Basiseinheiten definiert und damit kann man auch alle anderen Einheiten umrechnen. Dieses Verfahren kann man im Prinzip immer wieder anwenden, bis man nur noch eine Größe als Basiseinheit hat. Diese eine Größe könnte dann auch eine Naturkonstante sein. Einerseits hat das eine gewisse Attraktivität, nicht nur die Einheiten auf Naturkonstanten zurückzuführen, sondern das ganze Einheitensystem. Da das aber bedeutet, dass die meisten anderen Größen dann rationale Exponenten dieser einen Basis haben, also Wurzeln davon sind, wird es in der Praxis meist doch nicht gemacht.

Dieser Artikel ist mit Hilfe von DD1AH entstanden. Er ist Dozent für Mathematik und Spezialist für mathematische Modelle im Bereich Machine Learning und Big Data. Hier kommt die Idee mit der Darstellung der Einheiten als Potenzen von Diagonalmatrizen und einige Hilfestellung bei der Bedienung von Mathematica von ihm. Vielen Dank dafür.

Teilen