Seite 1 von 2

Sonnestandsberechnung... Ich komm nicht weiter =(

Verfasst: Montag 23. Juni 2008, 13:16
von Iopodx
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

Verfasst: Montag 23. Juni 2008, 13:24
von Hyperion
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.

Verfasst: Montag 23. Juni 2008, 13:30
von Iopodx
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

Verfasst: Montag 23. Juni 2008, 13:58
von Hyperion
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.

Verfasst: Montag 23. Juni 2008, 14:01
von Iopodx
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

Verfasst: Montag 23. Juni 2008, 14:06
von numerix
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

Verfasst: Montag 23. Juni 2008, 14:11
von Iopodx
@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...

Verfasst: Montag 23. Juni 2008, 14:20
von Hyperion
Da hilft wohl nur händisches Debuggen per print oder einem echten Debugger, um sich die einzelnen Ergebnisse der Schritte einmal anzugucken!

Verfasst: Montag 23. Juni 2008, 14:34
von 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.

Verfasst: Montag 23. Juni 2008, 14:57
von Iopodx
@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* =)

Verfasst: Montag 23. Juni 2008, 15:40
von numerix
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.

Verfasst: Montag 23. Juni 2008, 18:18
von birkenfeld
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?

Verfasst: Montag 23. Juni 2008, 23:49
von Leonidas
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.

Verfasst: Dienstag 24. Juni 2008, 12:28
von Iopodx
;)

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

Verfasst: Dienstag 24. Juni 2008, 12:30
von HWK
Das Quadrat des Tangens.
MfG
HWK

Verfasst: Dienstag 24. Juni 2008, 12:31
von Hyperion
tan dürfte der Tangens sein! tan^2 ist dann wohl das Quadrat davon.

Verfasst: Dienstag 24. Juni 2008, 13:24
von Iopodx
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

Verfasst: Dienstag 24. Juni 2008, 13:44
von Rebecca
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.

Verfasst: Dienstag 24. Juni 2008, 14:26
von numerix
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

Verfasst: Dienstag 24. Juni 2008, 14:47
von Iopodx
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