Sonnestandsberechnung... Ich komm nicht weiter =(

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.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Hiho Gemeinde,

kurz gesagt versuche ich http://de.wikipedia.org/wiki/Sonnenstan ... _der_Sonne nach Python zu portieren, um damit den Sonnenstand in Abhängigkeit von Jahreszeit und Uhrzeit bestimmen zu können.

Meine Portierung sieht bis jetzt so aus:

Code: Alles auswählen

import math, time

def sonnenstand(timestamp):
    #01.01.2000 12:00 war 946724400.0 (Timestamp)
    
    n = timestamp - 946724400.0

    n = n / 24 / 60 / 60

    L = 280.46  + 0.9856474 * n

    g = 357.528 + 0.9856003 * n

    d = L + 1.915 * math.sin(math.radians(g)) + 0.02 * math.sin(math.radians(2*g))

    e = 23.439 - 0.0000004 * n

    ZAHLER = math.cos(math.radians(e)) * math.sin(math.radians(d))
    
    NENNER = math.cos(math.radians(d))

    a = math.atan(ZAHLER/NENNER)

sonnenstand(time.time()+3600)
Leider ist die Rückgabe von

Code: Alles auswählen

-1.52457686676
Für mich recht unlogisch, es sollte doch ein Wert in Grad rauskommen, oder?

Liebe Grüße und mein bester Dank,
Iopodx
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da Du ja nur radians() benutzt, ist es kein Wunder, dass eine Angabe in rad zurückkommt! In der Doku zu math bekommst Du eine Funktion, die das wieder in Grad zurückwandelt.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Ach stimmt, schlag mich =)

Ich habe also noch ein a = math.degrees(a) eingebaut...

Code: Alles auswählen

Zeitpunkt: 1214224141.77 -87.3376594354
Zeitpunkt: 1214227741.78 -87.2943521399
Ist für mich dennoch ziemlich unwahrscheinlich, da eine Differenz von 3600 Sekunden ja immerhin eine Differenz von 15°C ergeben müsste - oder liege ich da falsch?

MfG
Iopodx
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

k.A. - damit kenne ich mich nicht aus!

Aber bist Du Dir sicher, dass die ganzen Berechnungen so klappen? Speziell bei der Mischung von ints und floats kann ja viel schief gehen ...

Insbesondere kapiere ich zeile 9 nicht!

Generell wären da ein wenig mehr Kommentare evtl. nützlich.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Das meiste ist einfach aus der Wikipedia übernommen.

Zeile neun macht einfach Tage aus dem Sekunden. 60 Sekunden pro Minute, 60 Minuten pro Stunde, 24 Stunden pro Tag.

Danke trotzdem!

MfG
Iopodx
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Hyperion hat geschrieben:k.A. - damit kenne ich mich nicht aus!
Ich auch nicht, aber :
Hyperion hat geschrieben:Insbesondere kapiere ich zeile 9 nicht!
Dabei dürfte es sich um die Umrechnung von Sekunden in Tage handeln.
Also eigentlich das hier:

Code: Alles auswählen

tage = sekunden/86400
und ich vermute, dass hier auch ein Fehler liegt, weil hier eine Ganzzahldivision vorliegt, die wahrscheinlich aber nicht gemeint ist. Also mal so probieren:

Code: Alles auswählen

tage = sekunden/86400.0
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

@pütone

Ja, du hast Recht, aber auch das bringt wohl nicht den Unterschied. Ich muss irgendwo einen Fehler in der Rechnung haben, den ich aber einfach nicht sehen will =(

Das wurmt mich jetzt schon...
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Da hilft wohl nur händisches Debuggen per print oder einem echten Debugger, um sich die einzelnen Ergebnisse der Schritte einmal anzugucken!
BlackJack

Das ist keine Ganzzahldivision, weil `timestamp` ja als Fliesskommazahl in die Funktion kommt. Da Julianische Datum dürfte trotzdem falsch sein, weil 2001-01-01 ja nicht 0 ist.

Und im Text von der Wikipediaseite stehen teilweise Bedingungen, dass bestimmte Werte zum Beispiel zwischen 0 und 360 liegen müssen und auch etwas über Vorzeichen, die man eventuell anpassen muss. Darauf wird im Quelltext aber nirgends eingegangen.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

@BlackJack

Ja, aber bei Trigonometrischen Funktionen sollte man das ja vergessen können... Ich werde berichten.

Ich ziehe ja vom aktuellen Timestamp die Zeit ab, die seit 1970 bis zum Jahre 2000 vergangen ist. Sollte doch hinhauen, oder?

Mein Proble mist denke ich, dass ich hätte weiterlesen müssen. Ich suche nämlich eher den Azimut als irgendwas anderes *grummel* =)
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

BlackJack hat geschrieben:Das ist keine Ganzzahldivision, weil `timestamp` ja als Fliesskommazahl in die Funktion kommt.
Ups! :oops:
Iopodx hat geschrieben:Ja, aber bei Trigonometrischen Funktionen sollte man das ja vergessen können...
Korrekt. Auch die Vorzeichengeschichte löst das Problem nicht. Dabei geht es ja - wenn ich nichts übersehen habe - nur um die Positionierung im richtigen Quadranten.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Hyperion hat geschrieben:k.A. - damit kenne ich mich nicht aus!

Aber bist Du Dir sicher, dass die ganzen Berechnungen so klappen? Speziell bei der Mischung von ints und floats kann ja viel schief gehen ...
Ja? Was kann denn da so alles schief gehen, wenn man auf Ganzzahldivision aufpasst?
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

birkenfeld hat geschrieben:
Hyperion hat geschrieben:k.A. - damit kenne ich mich nicht aus!

Aber bist Du Dir sicher, dass die ganzen Berechnungen so klappen? Speziell bei der Mischung von ints und floats kann ja viel schief gehen ...
Ja? Was kann denn da so alles schief gehen, wenn man auf Ganzzahldivision aufpasst?
Immer wenn ich durch Null teile kommen Exceptions. Da ist wohl was kaputt.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

;)

Okay ich brauchte einfach eine andere Gleichung... Nennt sich dann "Wahre Sonne"... Und das soll einer Wissen ;)

http://de.wikipedia.org/wiki/Zeitgleichung#Wahre_Sonne

Dennoch hab ich hier (wieder) ein Problem:

Recht weit unten des Abschnittes findet sich dann eine formel r = tan²(e/2)

Bitte wie - oder was ist überhaupt - tan²?

Glaub dazu fehlen mir noch die zwei Jahre Mathe LK ab nächstem Jahr...

MfG
Iopodx
Benutzeravatar
HWK
User
Beiträge: 1295
Registriert: Mittwoch 7. Juni 2006, 20:44

Das Quadrat des Tangens.
MfG
HWK
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

tan dürfte der Tangens sein! tan^2 ist dann wohl das Quadrat davon.
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Ja mich hat das nur irritiert, da wir - schulisch - das Quadrat immernoch nach den Term schreiben. Man schreibt ja auch 2² und nicht ²2, oder?

Andere Sache: Ich will nur die Stunden und Minuten vom aktuellen Tag haben - ausgehend vom Timestamp. Jemand eine Idee? Das Teilen durch 86400 erscheint mir sinnvoll, gibt mir aber nur ~ 14.000 Sekunden zurück was gerade 3 Stunden sind?

MfG
Iopodx
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Korrekterweise schreib man (tan(x))^2.
In der Praxis ist oft in einer Formel klar, welches die Argumente fuer die trigonometrischen Funktionen sind, sodass man die Klammern um das Argument weg laesst, also tan x schreibt. tan x^2 ohne Klammern hiesse ja aber eigentlich tan (x^2), also schreibt man das Quadrat an den Tangens dran. Eigentlich eine bloede Notation, aber unheimlich praktisch.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Iopodx hat geschrieben:Andere Sache: Ich will nur die Stunden und Minuten vom aktuellen Tag haben - ausgehend vom Timestamp. Jemand eine Idee? Das Teilen durch 86400 erscheint mir sinnvoll, gibt mir aber nur ~ 14.000 Sekunden zurück was gerade 3 Stunden sind?

Code: Alles auswählen

>>> import datetime
>>> datetime.datetime.now().hour
15
>>> datetime.datetime.now().minute
26
Iopodx
User
Beiträge: 68
Registriert: Sonntag 5. September 2004, 08:58

Fein - kein Mensch hat's gewollt - aber es funktioniert =)

Ich bin so frei:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import math, time, datetime

def sonnenstand():
    geobreite = 50.83333
    geolaenge = 12.91667
    

    # 01.01.2000 12:00 war 946724400.0 (Timestamp)
    
    n = time.time() - 946724400.0

    n = n/86400.0

    L = 280.46  + 0.9856474 * n
    
    g = 357.528 + 0.9856003 * n

    d = L + 1.915 * math.sin(math.radians(g)) + 0.02 * math.sin(math.radians(2*g))

    e = 23.439 - 0.0000004 * n

    DELTA = math.degrees(math.asin(math.sin(math.radians(e)) * math.sin(math.radians(d))))

    ALPHA = math.atan((math.cos(math.radians(e)) * math.sin(math.radians(d))) / math.cos(math.radians(d)))

    ALPHA = math.degrees(ALPHA)

    if ALPHA < 0:
        ALPHA = ALPHA + 180

    # Azimut berechnen
    
    JD0 = 2451545 + n

    T0 = (JD0 - 2451545.0) / 36525

    T = datetime.datetime.utcnow().hour + datetime.datetime.utcnow().minute / 60

    D   = 6.697376 + 2400.05134 * T0 + 1.002738 * T

    Rg = D * 15

    R = (Rg + 11.6) % 360

    r = (R - ALPHA) % 360

    ZAEHLER = math.sin(math.radians(r))

    NENNER  = math.cos(math.radians(r)) * math.sin(math.radians(geobreite)) - \
              math.tan(math.radians(DELTA)) * math.cos(math.radians(geobreite))
    
    return math.degrees(math.atan(ZAEHLER/NENNER))

print sonnenstand()
Vielleicht braucht's ja mal wer ;)

MfG
Iopodx
Antworten