Unsicherheit und Einheiten
Anwendungsbereich
Nutzen Sie diese Fertigkeit immer dann, wenn eine Berechnung physikalische Einheiten enthält oder ein berichteter Wert eine Unsicherheit benötigt. Konkret:
- Umrechnen zwischen Einheiten, einschließlich Umrechnungen, die einen physikalischen Kontext erfordern (Wellenlänge in Photonenenergie, Masse in Stoffmenge, Energie in Temperatur);
- Propagieren von Unsicherheiten durch ein Messmodell, mit oder ohne korrelierte Eingänge;
- Erstellen eines GUM-Unsicherheitsbudgets aus Kalibrierscheinen, Spezifikationen und Wiederholbarkeitsdaten;
- Auswählen eines Überdeckungsfaktors und Entscheiden, ob (k = 2) vertretbar ist;
- Runden und Darstellen eines Ergebnisses, sodass ein Leser weiß, was das (\pm) bedeutet;
- Extrahieren von Parameterunsicherheiten aus einer Kurvenanpassung, ohne Korrelationen zu verwerfen;
- Überprüfen vorhandener Analysescodes auf stille Einheiten- und Unsicherheitsfehler;
- Prüfen, ob ein dimensionell konsistentes Ergebnis auch physikalisch möglich ist – die Größenordnung, die dimensionslose Kennzahl und das daraus abgeleitete Regime.
Diese Fertigkeit deckt die Messtechnik und die beiden implementierenden Bibliotheken ab. Sie deckt keine statistische Inferenz, Modellauswahl oder Studienplanung ab – siehe statistical-analysis, statistical-power und experimental-design.
Aktuelle Version und Installation
Stand 26.07.2026:
- pint 0.25.3, veröffentlicht am 19.03.2026; benötigt Python 3.11+.
- uncertainties 3.2.3, veröffentlicht am 21.04.2025; benötigt Python 3.8+.
- NumPy 2.5.1 und SciPy 1.18.0; beide benötigen Python 3.12+.
scipy.constantsin SciPy 1.18.0 enthält CODATA 2022. SciPy 1.11 und älter enthielten CODATA 2018, und mehrere empfohlene Werte unterscheiden sich.
uv venv --python 3.13
source .venv/bin/activate
uv pip install "pint==0.25.3" "uncertainties==3.2.3" "numpy==2.5.1" "scipy==1.18.0"
pint-pandas und pint-xarray fügen einheitenbewusste Spalten und Arrays hinzu und müssen separat installiert werden.
Unverhandelbarer Workflow
- Einheiten beim Eingang anhängen und nur beim Ausgang entfernen. Konvertieren Sie an Funktionsgrenzen mit
ureg.wrapsoderm_as("unit"), niemals mittendrin. - Schreiben Sie das Messmodell explizit auf, bevor Sie etwas berechnen, einschließlich Korrekturen, deren geschätzter Wert null ist. Eine im Modell weggelassene Korrektur lässt ihre Unsicherheit aus dem Budget.
- Geben Sie jedem Eingang vier Dinge: einen Schätzwert, eine Standardunsicherheit, die Verteilung, aus der die Unsicherheit stammt, und ihre Freiheitsgrade.
- Konvertieren Sie Typ-B-Angaben mit dem richtigen Divisor. Die erweiterte Unsicherheit eines Zertifikats wird durch das angegebene (k) geteilt; rechteckige Grenzen werden durch (\sqrt{3}) geteilt.
- Identifizieren Sie Korrelationen vor der Kombination. Eingänge, die gegen denselben Standard kalibriert, mit demselben Instrument gemessen oder aus derselben Anpassung stammen, sind korreliert.
- Berechnen Sie Empfindlichkeitskoeffizienten und lesen Sie das Budget aus (c_i \cdot u(x_i)) und nicht aus den rohen Unsicherheiten.
- Überprüfen Sie die Linearisierung. Führen Sie eine Monte-Carlo-Simulation parallel zum GUM-Rahmen durch und wenden Sie den JCGM-101-Klausel-8-Vergleich an. Melden Sie das Monte-Carlo-Ergebnis, wenn es fehlschlägt.
- Wählen Sie (k) aus den effektiven Freiheitsgraden, nicht aus Gewohnheit.
- Runden Sie zuerst die Unsicherheit, dann den Wert auf dieselbe Dezimalstelle.
- Geben Sie an, was das (\pm) ist – Standard oder erweitert, mit (k), der Überdeckungswahrscheinlichkeit und der Methode.
- Überprüfen Sie die Größenordnung vor der Berichterstattung auf Plausibilität. Ein dimensionell konsistentes Ergebnis kann trotzdem unmöglich sein. Vergleichen Sie es mit einer bekannten Skala oder einer dimensionslosen Kennzahl und bestätigen Sie, dass jede Annahme, auf die Sie sich gestützt haben, in diesem Regime noch gilt.
Die Fehler, die diese Fertigkeit verhindern soll
Jeder der folgenden Fehler läuft ohne Fehler und erzeugt eine plausible Zahl.
Eine Einheit, die bei unbekanntem Maßstab entfernt wurde
length = (12.7 * ureg.mm).magnitude # 12.7 – wovon?
length = (12.7 * ureg.mm).m_as("m") # 0.0127 Meter, angegeben
.magnitude gibt zurück, was die Größe zufällig trug. Nennen Sie die Einheit an der Extraktionsstelle, jedes Mal.
Arithmetik mit Offset-Temperaturen
Q(20, "degC") + Q(5, "degC") # OffsetUnitCalculusError – korrekt abgelehnt
Q(20, "degC") + Q(5, "delta_degC") # 25 degree_Celsius
Q(25, "degC") - Q(20, "degC") # 5 delta_degree_Celsius
Celsius und Fahrenheit sind Intervallskalen. Eine Unsicherheit einer Temperatur ist immer eine Differenz und gehört in eine delta_-Einheit: Die Umrechnung von 20 ± 0.5 degC in Fahrenheit ergibt 68 degF ± 0.9 delta_degF, zwei verschiedene Umrechnungen in einer Zeile.
Logarithmische Einheiten, die durch Multiplikation addieren
Q(10, "dBm") + Q(10, "dBm") # 0.0001 kilogram**2 * meter**4 / second**6
Das ist 10 mW × 10 mW, nicht 20 mW und nicht 13 dBm. Es wird nichts ausgelöst. Konvertieren Sie vor jeder Arithmetik in eine lineare Einheit.
Eine durch einen Roundtrip zerstörte Korrelation
x = ufloat(1.0, 0.1)
x - x # 0.0+/-0
x - ufloat(x.nominal_value, x.std_dev) # 0.00+/-0.14
Das Neuerstellen einer Variablen aus ihrem Nennwert und ihrer Standardabweichung erzeugt eine unabhängige Variable. Das gilt auch für jede Serialisierung, die durch ein Paar von Floats geht. Verwenden Sie correlated_values(values, covariance_matrix), um eine korrelierte Menge wiederherzustellen.
Eine stillschweigend skalierte Kovarianzmatrix
popt, pcov = curve_fit(f, x, y, sigma=sigma) # Standard
popt, pcov = curve_fit(f, x, y, sigma=sigma, absolute_sigma=True)
Die Standardeinstellung skaliert pcov mit dem reduzierten Chi-Quadrat, sodass die Parameterunsicherheiten die Anpassungsgüte absorbieren und dem entsprechen, was man ohne Angabe von sigma erhalten würde. Bei einer synthetischen Geradenanpassung ergeben die beiden Varianten [0.0364, 0.2154] und [0.0477, 0.2820] – eine Differenz von 31 %. Verwenden Sie absolute_sigma=True, wenn sigma echte Standardunsicherheiten enthält.
Eine Linearisierung, die nie überprüft wurde
Für (y = x^2) mit (x = 1.0 \pm 0.5) ergibt der GUM-Rahmen (y = 1.0), (u_c = 1.0) und ein 95 %-Intervall von ([-0.96, 2.96]) – größtenteils negativ für eine quadrierte Größe. Monte Carlo ergibt einen Mittelwert von 1.25, (u_c = 1.06) und ein kürzestes 95 %-Intervall von ([0, 3.32]). Nichts in einer linearen Propagationsbibliothek wird Ihnen mitteilen, dass dies passiert ist.
Gebündelte lokale CLIs
Alle Helfer laufen offline, lehnen URLs und symbolische Links ab, begrenzen ihre Eingaben, schreiben Ausgaben atomar mit privaten Berechtigungen und weigern sich, ohne --force zu überschreiben.
python skills/uncertainty-and-units/scripts/propagate_uncertainty.py --help
python skills/uncertainty-and-units/scripts/uncertainty_budget.py --help
python skills/uncertainty-and-units/scripts/format_result.py --help
python skills/uncertainty-and-units/scripts/convert_units.py --help
python skills/uncertainty-and-units/scripts/audit_units.py --help
python skills/uncertainty-and-units/scripts/check_plausibility.py --help
propagate_uncertainty.py
Führt beide Propagationsmethoden auf demselben Modell aus und wendet den JCGM-101-Klausel-8-Validierungstest an.
python skills/uncertainty-and-units/scripts/propagate_uncertainty.py \
--expression "m / (pi * (d / 2) ** 2 * h)" \
--variable "m=250.0,0.05" \
--variable "d=20.0,0.02,rectangular" \
--variable "h=40.0,0.05,rectangular" \
--measurand density --unit "g/cm3" --format markdown
Jedes --variable ist name=value,standard_uncertainty[,distribution[,dof]], wobei die Verteilung normal, rectangular, triangular, arcsine oder exact ist und nur die Monte-Carlo-Stichproben steuert. Korrelationen werden als --correlation "a,b=0.9" eingegeben. Eine JSON-Datei --spec enthält dasselbe Modell für langlebige Sachen.
Der Ausdruck wird in einen abstrakten Syntaxbaum geparst und durch einen expliziten Durchlauf über + - * / ** und eine feste Liste von Funktionen reduziert. Er wird nie kompiliert oder ausgeführt.
Der Bericht enthält den Schätzwert, (u_c), Empfindlichkeitskoeffizienten, das Budget in Prozent, effektive Freiheitsgrade, (k), (U), beide Monte-Carlo-Überdeckungsintervalle und das Urteil, ob das linearisierte Ergebnis berichtet werden darf.
uncertainty_budget.py
Kombiniert Komponenten, wie sie in Zertifikaten und Datenblättern angegeben sind.
python skills/uncertainty-and-units/scripts/uncertainty_budget.py --template > budget.json
python skills/uncertainty-and-units/scripts/uncertainty_budget.py --spec budget.json --format markdown
Jede Komponente benennt eine distribution, die ihren Divisor festlegt – expanded teilt durch seinen coverage_factor, rectangular durch sqrt(3), triangular durch sqrt(6), arcsine durch sqrt(2), normal durch 1 – mit optionalem sensitivity, dof und relative: true. Das Werkzeug berechnet (u_c), die Welch-Satterthwaite-effektiven Freiheitsgrade, (k) aus der t-Verteilung und (U) und warnt, wenn eine Typ-A-Komponente keine Freiheitsgrade hat, wenn (\nu_{\text{eff}}) klein genug ist, dass (k = 2) falsch ist, wenn eine Komponente dominiert und wenn eine als normal deklarierte Typ-B-Komponente wahrscheinlich eine ungeteilte erweiterte Unsicherheit ist.
format_result.py
python skills/uncertainty-and-units/scripts/format_result.py \
--value 12.34567 --uncertainty 0.02345 --unit mm \
--coverage-factor 2.26 --coverage-probability 0.95
Gibt 12.346 ± 0.023 mm, 12.346(23) mm, die wissenschaftliche und LaTeX-Form sowie den Satz zurück, der die Zahl begleiten muss. Warnt, wenn eine signifikante Stelle für eine mit 1 oder 2 beginnende Unsicherheit angefordert wird, und wenn die Unsicherheit den Schätzwert überschreitet.
convert_units.py
python skills/uncertainty-and-units/scripts/convert_units.py \
--value 532 --unit nm --to eV --context spectroscopy --uncertainty 0.5
python skills/uncertainty-and-units/scripts/convert_units.py \
--value 1.0 --unit g --to mol --context chemistry --context-parameter "mw=180.156 g/mol"
Trägt die Unsicherheit durch die lokale Ableitung der Umrechnung, was wichtig ist, weil Kontextumrechnungen reziprok und nicht proportional sind. Benennt den Kontext in der Fehlermeldung, wenn eine Umrechnung einen benötigt, und markiert Offset- und logarithmische Einheiten. --list-contexts zeigt, was das Register definiert.
audit_units.py
Statische Überprüfung vorhandener Analysescodes. Parst, importiert oder führt nie aus.
python skills/uncertainty-and-units/scripts/audit_units.py \
--input analysis.py --format markdown --fail-on medium
| Regel | Schweregrad | Erkennt |
|---|---|---|
UNIT001 | mittel | ein zweites UnitRegistry in einem Modul – Cross-Registry ValueError |
UNIT002 | mittel | Offset-Temperatureinheiten ohne delta_-Einheit irgendwo |
UNIT003 | hoch | .magnitude ohne vorhergehendes .to(...) oder .m_as(...) |
UNIT004 | mittel | logarithmische Einheiten, deren + multipliziert |
UNC001 | hoch | curve_fit ohne absolute_sigma |
UNC002 | mittel | np.std / np.var ohne ddof |
UNC003 | mittel | math- oder numpy-Funktionen in einem Modul, das uncertainties verwendet |
UNC004 | hoch | ein ufloat, das aus .nominal_value und .std_dev wiederhergestellt wurde |
CONST001 | niedrig | ein Literal innerhalb von 0,1 % einer CODATA-Konstante |
Der Exit-Status ist 1, wenn ein Befund --fail-on entspricht (Standard: high), was es als Pre-Commit- oder CI-Prüfung verwendbar macht.
Die Regeln sind Heuristiken, daher wird ein falsch positives Ergebnis mit einem Direktivenkommentar unterdrückt – nachgestellt, um die eigene Zeile abzudecken, oder allein auf einer Zeile, um die nächste abzudecken:
value = quantity.magnitude # audit-units: ignore UNIT003 -- bereits upstream konvertiert
# audit-units: ignore UNC003 -- das Argument hier ist ein einfaches Float-Array
scaled = np.log10(counts)
# audit-units: ignore-file CONST001 deckt ein ganzes Modul ab, und die Benennung keiner Regel unterdrückt alle. Unterdrückungen werden im Bericht gezählt und nicht versteckt, sodass eine Datei, die alles stumm schaltet, dies trotzdem angibt.
check_plausibility.py
Dimensionelle Konsistenz ist nicht physikalische Möglichkeit. Eine Zelle von 2 m Durchmesser und eine Reynolds-Zahl von 4e7 in einer Kapillare bestehen beide jeden Einheitentest. Dieses Werkzeug testet eine Menge von Größen gegen dimensionslose Kennzahlen, charakteristische Skalen und kuratierte Größenordnungsbänder und überprüft die Dimensionierung jeder Formel, bevor eine Zahl gemeldet wird.
python skills/uncertainty-and-units/scripts/check_plausibility.py \
--quantity "density=1060 kg/m**3" --quantity "velocity=0.5 mm/s" \
--quantity "length=8 um" --quantity "viscosity=3.5 mPa*s" \
--group reynolds --format markdown
# Re = 0.001211 -- laminar (Kreisrohr, Länge = Durchmesser)
python skills/uncertainty-and-units/scripts/check_plausibility.py \
--quantity "diameter=2 m" --band "eukaryotic_cell_diameter=diameter"
# implausible: 4.3 Dekaden außerhalb des Bereichs 5-100 um
--group wertet eine von 14 dimensionslosen Kennzahlen aus und benennt das Regime, in das sie das System einordnet; --scale berechnet eine charakteristische Skala wie eine Diffusionszeit, Debye-Länge oder Stokes-Sinkgeschwindigkeit; --band vergleicht eine bereitgestellte Größe mit einem beobachteten Bereich. --list gibt den gesamten Katalog mit den Eingaben aus, die jede Formel benötigt.
Physikalische Konstanten ((k_B), (N_A), (R_{\text{gas}}), (g_{\text{earth}}) und der Rest) stehen jeder Formel ohne Angabe zur Verfügung und werden zur Laufzeit aus scipy.constants gelesen und nicht als Literale geschrieben, sodass sie der CODATA-Version folgen, die SciPy ausliefert.
Der Dimensionierungscheck ist der Punkt. Die Übergabe einer kinematischen Viskosität, wo die Formel eine dynamische benötigt – beide "Viskosität" genannt, beide für Wasser tabelliert, unterscheiden sich um den Faktor ρ – wird abgelehnt, bevor eine Zahl berechnet wird:
error: viscosity must have dimensionality [mass] / ([length] * [time]),
but m²/s is [length] ** 2 / [time]
Exit-Status ist 1, wenn das Urteil --fail-on entspricht (Standard: implausible; ein Wert innerhalb einer Dekade eines Bandes ist questionable). Die Schwellenwerte sind Konventionen mit weichen Kanten und gehen von der Geometrie aus, für die ihre Korrelation angepasst wurde – siehe references/plausibility-scales.md für die in jedem Fall zu verwendende charakteristische Länge.
Wahl einer Propagationsmethode
| Situation | Methode |
|---|---|
| Lineares oder nahezu lineares Modell, annähernd normale Eingänge, große dof | Nur GUM-Rahmen |
| Eine Nichtlinearität über ±2u eines Eingangs | Beide ausführen, Klausel-8-Test anwenden |
| Relative Unsicherheit über ~20 % bei einem Eingang | Beide ausführen, Klausel-8-Test anwenden |
| Jede Korrelation | GUM-Rahmen bevorzugen (korrelierte Monte-Carlo-Stichproben sind rechenintensiver) |
| Nicht normale Verteilungen | Monte Carlo |
| Ergebnis muss in einem definierten Bereich liegen | Monte Carlo |
| Sehr kleine Stichprobengröße (n < 10) | Monte Carlo (t-Verteilung gilt nur für den Mittelwert) |
| Empfindlichkeitskoeffizienten werden benötigt | GUM-Rahmen |
| Validierung mit experimenteller Kovarianz | Beide, mit der Klausel-8-Entscheidungsregel |
Referenzen
- JCGM 100:2008 (GUM) – https://www.bipm.org/en/committees/jc/jcgm/publications
- JCGM 101:2008 – Supplement 1, Monte-Carlo-Propagation von Verteilungen
- JCGM 106:2012 – Rolle der Messunsicherheit bei Konformitätsbewertung
- JCGM-VIM – Internationales Metrologiewörterbuch
- Taylor & Kuyatt, NIST TN 1297 – Leitfaden zur Auswertung und Angabe der Unsicherheit von Messergebnissen
- ISO/IEC 98-4:2012 – Rolle der Messunsicherheit bei Konformitätsentscheidungen