Fehlerrechnung/Fehlerfortpflanzung

--- No warranty that this works with any function ---

Jens Wagner 06/2015

Download this notebook

In [1]:
import sympy as sp
from IPython.display import display, Math, Latex
In [2]:
#Hier die Variablen deklarieren/ "d" ist reserviert und darf nicht verwendet werden
h,r,T = sp.symbols('h r T') #hier Eure Variablennamen einsetzen
variablen = [h,r,T]         #hier Eure Variablennamen einsetzen
#Zahlenwerte und Fehlerwerte
variablen_werte = [2.8,4.2,2.4]  #Werte h=2.8, r=4.2, T=2.4 /hier Eure Werte einsetzen
fehler_werte = [0.3,0.2,0.1]     # dito fuer die Fehler /hier Eure Werte einsetzen
In [3]:
""""
Hier die Funktion deklarieren
Potenzen a hoch b: a**b
bei Funktionen wie sin, sqrt, etc. den Namensraum "sp" vorransetzen z.B. sp.sin()"""

funktion = (h*r**2*sp.sqrt(T))
In [4]:
fehler = 0
fehlersymbole=[]
ableitungen_quadr = []

for var in variablen:
    d = sp.symbols('d' + var.name)        #Symbole fuer die Fehler generieren
    fehlersymbole.append(d)               #Fehlersymbole in Liste eintragen
    partial = sp.diff(funktion, var) * d  #Partielle Differentation und mit mit Fehlersymbol 'd' multiplizieren
    ableitungen_quadr.append(partial**2)  
    fehler = fehler + partial**2

fehler_abs=sp.simplify(sp.sqrt(fehler))              #Latex Format fuer den absoluten Fehler
fehler_rel=sp.simplify(sp.sqrt(fehler/funktion**2))  #Latex Format fuer den relativen Fehler
In [5]:
#Berechnung der Zahlenwerte
funktions_wert=sp.Subs(funktion,variablen,variablen_werte).doit() #Variablenwerte (Zahlen) in Formel einsetzen und
                                                                  #Funktionswert berechnen
err1=sp.Subs(fehler,variablen,variablen_werte).doit()             #Variablenwerte (Zahlen) in FehlerFormel einsetzen 

err2=sp.Subs(err1,fehlersymbole,fehler_werte).doit()              #Variablenwerte (Zahlen) in FehlerFormel einsetzen und
                                                                  #Funktionswert berechnen
In [6]:
#Latex Darstellungen
print('Funktion:')
display(Math("f="+sp.latex(funktion)))

print('Messwerte:')
for i in range(len(variablen)):
    display(Math(str(variablen[i])+'='+ str(variablen_werte[i])+'\pm '+ str(fehler_werte[i])))  #Messwerte mit Fehler

print('Absoluter Fehler:')
display(Math(r'\Delta f='+sp.latex(fehler_abs).replace('d',r'\Delta ')))   #Formel absoluter Fehler
print('Relativer Fehler:')
display(Math(r"\Delta f/f="+sp.latex(fehler_rel).replace('d',r'\Delta '))) #Formel relativer Fehler
display(Math("f= %6.2f \pm %6.2f" %(funktions_wert,sp.sqrt(err2))))        #Messwert und Wert des absoluten Fehler
display(Math("f= %6.2f \pm %6.1f %s" %(funktions_wert,sp.sqrt(err2)/funktions_wert*100," \%"))) #dito als relativer Fehler
Funktion:
$$f=\sqrt{T} h r^{2}$$
Messwerte:
$$h=2.8\pm 0.3$$
$$r=4.2\pm 0.2$$
$$T=2.4\pm 0.1$$
Absoluter Fehler:
$$\Delta f=\frac{1}{2} \sqrt{\frac{r^{2}}{T} \left(4 T^{2} \left(\Delta h^{2} r^{2} + 4 \Delta r^{2} h^{2}\right) + \Delta T^{2} h^{2} r^{2}\right)}$$
Relativer Fehler:
$$\Delta f/f=\frac{1}{2} \sqrt{\frac{4 \Delta h^{2}}{h^{2}} + \frac{16 \Delta r^{2}}{r^{2}} + \frac{\Delta T^{2}}{T^{2}}}$$
$$f= 76.52 \pm 11.08$$
$$f= 76.52 \pm 14.5 \%$$