KeyError bei Übergabe über Klassenmethode

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
BerndNeumann
User
Beiträge: 3
Registriert: Donnerstag 26. November 2020, 08:21

Hallo liebe Community,

für die Arbeit an einem Prüfstand schreibe ich ein kleines Programm, das mir beim Auswerten der Messunsicherheit helfen soll. Dabei bin ich unter anderem mit Hilfe des Forums auf die uncertainties Bibliothek und die Methode derivatives gestoßen. Diese möchte ich nutzen und habe dazu bereits folgenden Code geschrieben(vereinfachter Abschnitt):

Code: Alles auswählen

from uncertainties import ufloat
import numpy as np

def calc_uncertainty_systematic_sensor(sensor):
    uncertainty_systematic_sensor=float()
    if sensor == 'Rosemount_1151_AP5':
        uncertainty_systematic_sensor = 10
    elif sensor == 'Rosemount_1151_DP4':
        uncertainty_systematic_sensor = 20
    else:
        uncertainty_systematic_sensor = 0.75
    return uncertainty_systematic_sensor

class Messebene:
    
    def __init__(self, value, sensortype):
        self.value=value
        self.sensortype=sensortype
        
    def ufloat_value(self):
        mean_value=np.mean(self.value)
        uncertainty_systematic_value = calc_uncertainty_systematic_sensor(self.sensortype)
        ufloat_value_=ufloat(mean_value,uncertainty_systematic_value)
        return ufloat_value_

P01=Messebene([120000, 120010, 120015, 120008], 'Rosemount_1151_AP5')
P02=Messebene([12000, 12010, 12015, 12005], 'Rosemount_1151_DP4')
T01=Messebene([300, 301, 300.75, 300.25], 'RTD')

a=ufloat(150, 10)
b=ufloat(325, 20)

#funktionsgleichung=P01.ufloat_value()/(P02.ufloat_value()-T01.ufloat_value())
#ableitung_partiell=funktionsgleichung.derivatives[P01.ufloat_value()]'''

funktionsgleichung2=a*b
ableitung_partiell_2=funktionsgleichung2.derivatives[a]

Ohne die auskommentierten Zeilen funktioniert der Code so wie ich es will, ich möchte jedoch in jedem Fall die Klasse "Messebene" verwenden und somit auf die Methode ufloat_value zurückgreifen. Dieses Vorgehen entspricht den auskommentierten Zeilen.
Auf gar keinen Fall möchte ich die Variablen händisch definieren (so wie a und b). Die Initialisierung geschieht eigentlich über ein dictionary, aus Platzgründen habe ich representativ drei Instanzen dargestellt.
Nun meine Frage: Beim Benutzten der Methode ufloat_value gibt mir das Programm ständig einen KeyError, in der Zeile "ableitung_partiell=..." zurück, den ich nicht nachvollziehen kann.
Sowohl die Methode ufloat_value als auch a/b geben einen einen ufloat Wert der Klasse uncertainties.core.Variable zurück. Laut Debugger sind mMn die übergebenen Daten komplett gleich, gleicher Datentyp, gleiches "Aussehen, usw.". Ich kann mir jedoch diesen KeyError nicht erklären und somit meine gewünschte Methode nicht nutzen.
Könnt ihr mir auf die Sprünge helfen, wie ich diese Methode nutzen kann, damit das Problem so läuft, als hätte ich die Variablen händisch definiert?
Was müsste ich anders definieren? Was habe ich falsch gemacht?

Vielen Dank im Voraus
Bl3nder
User
Beiträge: 139
Registriert: Freitag 3. Januar 2020, 17:07

Hey auch wenn es länger her ist habe Ich mir die Mühe gemacht und hab den Fehler gefunden vill siehst du es ja trotzdem:


Code: Alles auswählen

from uncertainties import ufloat
import numpy as np


def calc_uncertainty_systematic_sensor(sensor):
    if sensor == 'Rosemount_1151_AP5':
        uncertainty_systematic_sensor = 10.0
    elif sensor == 'Rosemount_1151_DP4':
        uncertainty_systematic_sensor = 20.0
    else:
        uncertainty_systematic_sensor = 0.75
    return float(uncertainty_systematic_sensor)


class Messebene:
    def __init__(self, value, sensortype):
        self.value = value
        self.sensortype = sensortype
        self.ufloat_value()

    def ufloat_value(self):
        mean_value = np.mean(self.value)
        uncertainty_systematic_value = calc_uncertainty_systematic_sensor(self.sensortype)
        value = ufloat(mean_value, uncertainty_systematic_value)
        return value


P01 = Messebene([120000, 120010, 120015, 120008], 'Rosemount_1151_AP5').ufloat_value()
P02 = Messebene([12000, 12010, 12015, 12005], 'Rosemount_1151_DP4').ufloat_value()
T01 = Messebene([300, 301, 300.75, 300.25], 'RTD').ufloat_value()

# P01 = ufloat(120008, 10)
# P02 = ufloat(12008, 20)
# T01 = ufloat(300.5, 0.8)

a = ufloat(150, 10)
b = ufloat(325, 20)


# funktionsgleichung = P01.ufloat_value() / (P02.ufloat_value() - T01.ufloat_value())

funktionsgleichung = P01 / (P02 - T01)
ableitung_partiell = funktionsgleichung.derivatives[P01]

funktionsgleichung2 = a * b
ableitung_partiell_2 = funktionsgleichung2.derivatives[a]


Nun sollte keine Fehlermeldung mehr kommen, also Ich kenne mich 0 mit der Bibliothek aus aus scheint jedoch interessant zu sein.Du hast bei deinem funktionsgleichung2 es ja richtig gemacht man benötigt den Datentyp ufloat.Jedoch hast du bei deinem Klassenaufruf nicht deinen Messwert ( value) zurückbekommen sondern die Klasse als Objekt,und danach würdest du versuchen mit dem Klassenobjekt deine Klassenmethode aufzurufen das klappt auch du bekommst auch einen Messwert zurück jedoch sieht der Messwert dann wie folgt aus :

a = ufloat(150, 10)
print(type(a))
print(type(P01.ufloat_value()))
print(P01.ufloat_value())


Ausgabe:
<class 'uncertainties.core.Variable'>
<class 'uncertainties.core.Variable'>
120008+/-10 -> das ist schon der gewandelt wert nach ufloat

deshalb bekommt du dann die Fehlermeldung ableitung_partiell = funktionsgleichung.derivatives[P01]
Eine Vision ohne Aktion bleibe eine Illusion
Antworten