\[ \sigma_{f(x_i)} = \sqrt{\sum_i \left( \frac{\partial f}{\partial x_i}\right)^{\!2} \sigma_{x_i}^2} \]
# TODO: Korrelation erklären
ufloat
, repräsentiert Wert mit Fehlerfrom uncertainties import ufloat
x = ufloat(5, 1)
y = ufloat(3, 1)
x + y
# Korrelationen werden von uncertainties beachtet:
x = ufloat(3, 1)
y = ufloat(3, 1)
print(x**2 - y)
print(x**2 - x) # Fehler ist kleiner!
uncertainties.unumpy
ergänzt numpy:
import numpy as np
import uncertainties.unumpy as unp
x = [1, 2, 3, 4, 5]
err = [0.1, 0.3, 0.1, 0.8, 1.0]
y = unp.uarray(x, err)
unp.cos(unp.exp(y))
Zugriff auf Wert und Standardabweichung mit n
und s
:
x = ufloat(5, 1)
print(x.n)
print(x.s)
Bei unumpy
mit nominal_values
und std_devs
x = unp.uarray([1, 2, 3], [0.3, 0.3, 0.1])
print(unp.nominal_values(x))
print(unp.std_devs(x))
Kann man natürlich auch abkürzen:
from uncertainties.unumpy import (nominal_values as noms,
std_devs as stds)
print(noms(x))
print(stds(x))
Man muss daran denken, die Funktionen aus unumpy zu benutzen (exp
, cos
, etc.)
unp.cos(x)
SymPy importieren:
from sympy import *
Mathematische Variablen erzeugen mit var()
:
x, y, z = var('x y z')
x + y + z
Differenzieren mit diff()
:
f = x + y**3 - cos(z)**2
print(f.diff(x))
print(f.diff(y))
print(f.diff(z))
print(f.diff(z, z, z))
Eine Funktion, die automatisch die Fehlerformel generiert:
from sympy import *
def error(f, err_vars=None):
from sympy import Symbol, latex
s = 0
latex_names = dict()
if err_vars == None:
err_vars = f.free_symbols
for v in err_vars:
err = Symbol('latex_std_' + v.name)
s += f.diff(v)**2 * err**2
latex_names[err] = '\\sigma_{' + latex(v) + '}'
return latex(sqrt(s), symbol_names=latex_names)
E, q, r = var('E_x q r')
f = E + q**2 * r
print(error(f))
\[\sqrt{\sigma_{E_{x}}^{2} + 4 \sigma_{q}^{2} q^{2} r^{2} + \sigma_{r}^{2} q^{4}}\]