Guten Tag,
Ich habe eine Frage. Ich schreibe gerade an einem Programm, welcher mir die Spannung gibt, jedoch muss ich diese in den Druck umwandeln. Dafür hab ich den Zusammenhang, dass der Druck gleich dem log10(Spannung) ist. Nun habe ich folgendes Problem. read_result1 gibt mir eine Liste mit den Werten. Um diese nun umzuschreiben, habe ich eine for Schleife erstellt.
Jedoch habe ich das Problem, dass ich als Fehlermeldung immer wieder bekomme "ValueError: math domain error". Ich habe aber leider keine Idee, wie ich dieses Problem lösen kann.
read_result1 = hat.a_in_scan_read(ALL_AVAILABLE, RETURN_IMMEDIATELY)
for i in range(len(read_result1)):
read_result = math.log10(read_result1)
Danke für ihre Hilfe
Problem mit for Schleife und Liste
Warum heißt es read_result1? Gibt es auch ein read_result0 und ein read_result2? Wenn man Namen durchnummeriert ist as in der Regel ein Anzeichen dafür, dass man eigentlich eine geeignete Datenstruktur benutzen möchte.
Wenn read_result1 eine Liste ist, dann ist sie falasch benannt, denn dann sollte aus dem Namen hervorgehen, dass es sich um mehrere Werte handet. Ein geeigneter Name wäre "results" oder "voltages". Warum das wichtig ist? Weil dir dann aufgefallen wäre, dass du versuchst log10 results zu übergeben - und nicht etwa ein einziges result.
Man verwendet in Python keinen Index um über Listen zu iterierens sondern iteriert direkt über die Elemente. Wobei du das doppelt falsch machst, weil du den Index nicht einmal verwendest.
Innerhalb der for-Schleife würdest du das Ergebnis immer wieder an den Namen read_result (Namensgebung?!?) binden - es also immer wieder überschreiben.
Wie soll denn eigentlich das Ergebnis aussehen? Und für welche Art der Weiterverarbeitung brauchst du das? Das ist wichtig um festzustellen, ob das nicht in einr Datenstruktur besser aufgehoben ist.
Wenn read_result1 eine Liste ist, dann ist sie falasch benannt, denn dann sollte aus dem Namen hervorgehen, dass es sich um mehrere Werte handet. Ein geeigneter Name wäre "results" oder "voltages". Warum das wichtig ist? Weil dir dann aufgefallen wäre, dass du versuchst log10 results zu übergeben - und nicht etwa ein einziges result.
Man verwendet in Python keinen Index um über Listen zu iterierens sondern iteriert direkt über die Elemente. Wobei du das doppelt falsch machst, weil du den Index nicht einmal verwendest.
Innerhalb der for-Schleife würdest du das Ergebnis immer wieder an den Namen read_result (Namensgebung?!?) binden - es also immer wieder überschreiben.
Wie soll denn eigentlich das Ergebnis aussehen? Und für welche Art der Weiterverarbeitung brauchst du das? Das ist wichtig um festzustellen, ob das nicht in einr Datenstruktur besser aufgehoben ist.
Eingerückt wird in Python immer mit 4 Leerzeichen pro Ebene, nicht 6. Man benutzt in Python keinen Index, wenn es nicht nötig ist, und hier ist es nicht nötig.
Was soll das 1 an read_result1? Benutze sprechende Variablennamen. Und dass ein Result irgendwann einmal gelesen wurde, hilft dem Verständnis auch wenig. Was ist denn das für eine Ergebnis? Mit read_result mußt Du dann noch irgendetwas machen.
Zur eigentlichen Frage: Wann kann man den Logarithmus einer Zahl nicht berechnen? Und welchen Wert hat die Spannung?
Was soll das 1 an read_result1? Benutze sprechende Variablennamen. Und dass ein Result irgendwann einmal gelesen wurde, hilft dem Verständnis auch wenig. Was ist denn das für eine Ergebnis? Mit read_result mußt Du dann noch irgendetwas machen.
Code: Alles auswählen
spannungen = hat_a_in_scan_read(ALL_AVAILABLE, RETURN_IMMEDIATELY)
for spannung in spannungen:
druck = math.log10(spannung)
Die Spannung ist positiv. Jedoch bekomme ich immer die Fehlermeldung "ValueError: math domain error".Sirius3 hat geschrieben: Mittwoch 1. September 2021, 15:34 Zur eigentlichen Frage: Wann kann man den Logarithmus einer Zahl nicht berechnen? Und welchen Wert hat die Spannung?
read_result1 gibt mir die Werte in einer Liste an. Diese Werte werden auf einem Diagramm angezeigt. Die Werte geben jedoch die Spannung zurück und nicht den Druck, den ich eigentlich brauche
.
- __blackjack__
- User
- Beiträge: 14065
- Registriert: Samstag 2. Juni 2018, 10:21
- Wohnort: 127.0.0.1
- Kontaktdaten:
@physics12: Mir fiele da auch ein positiver Wert ein, wo man diese Ausnahme bekommt.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
- DeaD_EyE
- User
- Beiträge: 1242
- Registriert: Sonntag 19. September 2010, 13:45
- Wohnort: Hagen
- Kontaktdaten:
Den Zusammenhang verstehe ich nicht. Den letzten Drucksensor (0 - 250 bar), den ich in ein Projekt einbinden musste, gibt eine Spannung von 0V - 10V aus und sie verhält sich linear zum Druck.physics12 hat geschrieben: Mittwoch 1. September 2021, 14:47 Dafür hab ich den Zusammenhang, dass der Druck gleich dem log10(Spannung) ist.
Die Umrechnung war auch ganz einfach. Normalisieren und dann Skalieren. 0V - 10V = > 0 - 250 Bar.
Aber vielleicht meinst ja was ganz anderes.
Code: Alles auswählen
def skalieren(spannung, max_druck):
return spannung / 10 * max_druck
Code: Alles auswählen
from functools import partial
def scale(min_v, max_v, min_unit, max_unit, voltage):
v_range = max_v - min_v
u_range = max_unit - min_unit
norm = (voltage - min_v) / v_range
return norm * u_range + min_unit
minimum_voltage = 0
maximum_voltage = 10
minimum_pressure = 0 # Bar
maximum_pressure = 250 # Bar
pressure = partial(scale, minimum_voltage, maximum_voltage, minimum_pressure, maximum_pressure)
print(pressure(5))
Wenn der das Verhältnis von Spannung vs. Druck der 10er Logarithmus ist, musst du dir überlegen, was bei Sonderfällen passiert.125.0
Negative Zahlen führen auch zu einem ValueError: MathDomainError. Die Ausnahmebehandlung ValueError kannst du mit mit try... except abfangen.
Code: Alles auswählen
import math
def scale(spannung):
try:
return math.log10(spannung)
except ValueError:
return math.nan
Code: Alles auswählen
pi = abs(cmath.log(-1))
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server