atan2 mit sympy

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Hallo.

Meines Erachtens müsste atan2() in sympy doch nur positive rad ausgeben, oder?

Code: Alles auswählen

import sympy as sp

dx, dy = all_symbols = sp.symbols('dx dy')

sub = {
    dx: -12,
    dy: 42,
}

t = sp.atan2(dx, dy)

print(t)
print(t.subs(sub))
print(sp.N(t.subs(sub)))
Warum macht mein code dann das, was es macht?!

Hoffe, dass jemand von euch meinen mathematischer Knoten im Kopf lösen kann.
Danke
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Wie kommst Du darauf, dass atan2 von 0 bis 2 pi geht? -pi bis pi wäre richtiger.
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Habe mir sagen lassen (und daraus gefährliches Viertelwissen abgeleitet), dass, wenn man tan2 verwendet, die Quadrantenabfrage überflüssig ist.
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

Ist es ja auch. Aber Du hast immer noch die Freiheit, den Range festzulegen.
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Was genau meinst du mit Range? Hat atan2 einen Parameter, den ich nicht kenne?

Alternativ müsste ih ja sonst immer eine Abfrage bei Umrechnen machen, oder?
(Quick 'n dirty)

Code: Alles auswählen

import sympy as sp

points = [
    {'name': 'NW', 'x': 110, 'y': 210},
    {'name': 'NO', 'x': 100, 'y': 205},
    {'name': 'SO', 'x': 95, 'y': 195},
    {'name': 'SW', 'x': 115, 'y': 190},
]

t_NW_NO = sp.atan2(points[0]['x'] - points[1]['x'], points[0]['y'] - points[1]['y'])
t_NW_NO_rad = sp.N(t_NW_NO)
t_NW_NO_gon = sp.N(t_NW_NO_rad * 200 / sp.pi)
print(f't_NW_NO = {t_NW_NO_rad} rad = {t_NW_NO_gon} gon')

t_NO_NW = sp.atan2(points[1]['x'] - points[0]['x'], points[1]['y'] - points[0]['y'])
t_NO_NW_rad = sp.N(t_NO_NW)
t_NO_NW_gon = sp.N(t_NO_NW_rad * 200 / sp.pi)
print(f't_NO_NW = {t_NO_NW_rad} rad = {t_NO_NW_gon} gon')

angles_gon = [t_NW_NO_gon, t_NO_NW_gon]

for angle in angles_gon:
    if angle < 0:
        print(f'SOLL: {angle + 400}')
    else:
        print(f'SOLL: {angle}')
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das meint, dass es eine Festlegungssache ist. atan2 kann auf verschiedene Arten implementiert werden, inklusive der Richtung, die als 0 interpretiert wird - east counter-clockwise, north-clockwise etc. Das ist also Implementierungssache, und dein Wunsch, und die Implementierung von sympy stimmen eben nicht ueberein. Entweder rechnest du das trivial um ( if v < 0: v += 2pi, wenn ich mich gerade nicht vertue), oder du definierst die eben selbst, wie du sie brauchst. Ist ja kein Hexenwerk.
Feedback1000
User
Beiträge: 88
Registriert: Dienstag 20. September 2022, 21:21

Ok. also kann es in numpy, oder math schon wieder ganz anders definiert sein?
__deets__
User
Beiträge: 14536
Registriert: Mittwoch 14. Oktober 2015, 14:29

So weit ich gesehen habe, ist es da ueberall +/- pi. Also kongruent. Was in meinen Augen sinnvoll ist, weil das Vorzeichen sofort die Richtung klar macht. Aber theoretisch ja.
Antworten