Discussion:
Sonnenposition berechnen und Werte Parallel ausgeben
(zu alt für eine Antwort)
Zatras
2006-04-04 10:12:03 UTC
Permalink
Hallo,
Ich hoffe hir bin ich einigermaßen richtig.

Ich habe ein kleines Problem:

Ich bin gerade dabei ein kleines Solarprojekt zu verwirklichen.
Es besteht aus einem 5 * 3 Meter Parabolähnlichem Sammler aus 15
Spiegeln
die das Licht auf einen 1 * 1 Meter großen Sonnenkollektor
reflektieren.

Die Gesamte Konstruktion soll der Sonne nachgeführt werden sobald die
Sonnenhöhe
10 Grad übersteigt.

Nun suche ich ein Programm,das mir periodisch (zb alle 4 Minuten) auf 2
Parallelen Schnittstellen die Werte für Sonnenhöhe und Azimuth
ausgibt.

Leider bin ich Programmiertechnisch nicht sehr bewandert,oder einfach
zu dumm um das selbst hinzukriegen.Als Notlösung hatte ich einfach
vor,diese Werte aus einer zuvor erstellten Tabelle auszulesen und
zeitgesteuert auszugeben,aber Echtzeitwerte würden mir besser
gefallen.

Vielleicht kann mir jemand helfen?

mfg
Zatras
Thomas Schmidt
2006-04-04 12:12:29 UTC
Permalink
Post by Zatras
Nun suche ich ein Programm,das mir periodisch (zb alle 4 Minuten) auf 2
Parallelen Schnittstellen die Werte für Sonnenhöhe und Azimuth
ausgibt.
Formeln zur Sonnenstandsberechnung gibts hier:
http://de.wikipedia.org/wiki/Sonnenstand

Tschau,
Thomas
--
-------------------------------------------------------------------
Thomas Schmidt e-mail: ***@hoki.ibp.fhg.de
Ralf Mayer
2006-04-04 13:40:43 UTC
Permalink
"Thomas Schmidt" schrieb im Newsbeitrag...
Post by Thomas Schmidt
Post by Zatras
Nun suche ich ein Programm,das mir periodisch (zb alle 4 Minuten) auf 2
Parallelen Schnittstellen die Werte für Sonnenhöhe und Azimuth
ausgibt.
Entschuldige wenn das vielleicht blöd ist, aber was passiert mit dem
gesammeltem Licht? Du wirst Strom daraus "gewinnen" wollen, oder?

Könnte man nicht den aktuellen "Erzeugungswert" messen, und dann jeweils
"etwas links" und "etwas rechts" gucken, ob es da noch ergiebiger ist?

Ok, vielleicht blöd... Was ist nachts? Was ist bei Bewölkung? Was ist wenn
der Reflektor völlig verstellt ist? Vielleicht doch nicht so einfach.
Post by Thomas Schmidt
http://de.wikipedia.org/wiki/Sonnenstand
Wenn das schon alles ist... ein kleines Programm was das kurz ausrechnet ist
wahrscheinlich kein Problem. Ausgabe an Parallelports wüsste ich spontan
nicht, aber das sollte wohl auch gehen.

Wenn du keine andere Lösung findest kann ich mal sehen ob das so leicht ist
wie es aussieht.

Grüße
Ralf
harald c. greier
2006-04-04 14:47:11 UTC
Permalink
Hallo Ralf, du schriebst
Post by Ralf Mayer
Wenn das schon alles ist... ein kleines Programm was das kurz ausrechnet ist
wahrscheinlich kein Problem.
Zeig mal, bitte. Würde mich interessieren.


greets,
harald

--
Ralf Mayer
2006-04-04 15:49:17 UTC
Permalink
"harald c. greier" schrieb im Newsbeitrag...
Post by harald c. greier
Hallo Ralf, du schriebst
Post by Ralf Mayer
Wenn das schon alles ist... ein kleines Programm was das kurz ausrechnet ist
wahrscheinlich kein Problem.
Zeig mal, bitte. Würde mich interessieren.
Der Wiki-Link enthält doch alles an Gleichungen, was gebraucht wird.

Vorgegebene Gleichungen in eine Programmiersprache deiner Wahl umzusetzen
sollte wirklich kein Problem sein - oder übersehe ich da etwas, was die
Sachen kompliziert macht?

Alternativ bietet der Wiki-Link auch Links zu Tabellen und Online-Rechnern,
die dir die Daten ausrechnen - da müßte dann ein Programm diesen Output
lesen und die passende Zeit/Ort Kombination ausgeben.
harald c. greier
2006-04-04 18:20:19 UTC
Permalink
Hallo Ralf,
Post by Ralf Mayer
Der Wiki-Link enthält doch alles an Gleichungen, was gebraucht wird.
Ja schon, mich hat nur interessiert, wie genau das im Vergleich mit
anderen Methoden ist :)
An der im Artikel angegebenen Genauigkeit habe ich so meine Zweifel.
Werde das mal einem Vergleich unterziehen.
Post by Ralf Mayer
Vorgegebene Gleichungen in eine Programmiersprache deiner Wahl umzusetzen
sollte wirklich kein Problem sein - oder übersehe ich da etwas, was die
Sachen kompliziert macht?
Schade. Dachte nur, du hättest das schon mal gemacht bzw. könntest mit
der Source hier aufwarten ;)
Post by Ralf Mayer
Alternativ bietet der Wiki-Link auch Links zu Tabellen und Online-Rechnern,
die dir die Daten ausrechnen - da müßte dann ein Programm diesen Output
lesen und die passende Zeit/Ort Kombination ausgeben.
Hm, ja, lies auch mich grade belehren, dass dies nur mit einer Anwendung
möglich ist, die auch die entsprechenden Schnittstellen ansprechen kann.
Wie das genau auszusehen hat weiß ich leider nicht.

greets,
harald

--
Ralf Mayer
2006-04-05 10:42:35 UTC
Permalink
"harald c. greier" schrieb im Newsbeitrag...
Post by harald c. greier
Schade. Dachte nur, du hättest das schon mal gemacht bzw. könntest mit
der Source hier aufwarten ;)
Hier sind 2 Prozeduren, die ich mal so auf die Schnelle ins .NET Framework
(VB.NET) getippt habe. Eingegeben wird Datum und Zeit (UTC), raus kommen
Rektaszension und Deklination. Frage mich jetzt nicht, wie genau und was und
wo... einfach nur Wikipedia abgetippt.

Ich kann dir auch die Windows Exe geben - allerdings EXE von fremdem Leuten
ist immer so eine Sache...

Private Sub CalcJD()
Dim y, m, d As Integer, h As Double
If dtpDate.Value.Month > 2 Then
y = dtpDate.Value.Year
m = dtpDate.Value.Month
Else
y = dtpDate.Value.Year - 1
m = dtpDate.Value.Month + 12
End If
d = dtpDate.Value.Day
h = dtpTime.Value.Hour / 24 + dtpTime.Value.Minute / 1440 +
dtpTime.Value.Second / 86400
Dim a As Integer = y \ 100
Dim b As Integer = 2 - a + a \ 4
Dim JD As Double = Int(365.25 * (y + 4716)) + Int(30.6001 * (m + 1)) + d + h
+ b - 1524.5
lblJD.Text = JD.ToString("#,0.0000")
Rest(JD)
End Sub

Private Sub Rest(ByVal JD As Double)
Dim n As Double = JD - 2451545
Dim L As Double = 280.46 + 0.9856474 * n
L = L - Int(L / 360) * 360
Dim g As Double = 357.528 + 0.9856003 * n
g = g - Int(g / 360) * 360
Dim g_ As Double = g * PI / 180
Dim A As Double = L + 1.915 * Sin(g_) + 0.02 * Sin(2 * g_)
Dim A_ As Double = A * PI / 180
Dim E As Double = 23.439 - 0.0000004 * n
Dim E_ As Double = E * PI / 180
Dim Rekt_ As Double = Atan(Cos(E_) * Sin(A_) / Cos(A_))
Dim Rekt As Double = Rekt_ * 180 / PI
If Cos(A_) < 0 Then Rekt += 180
Dim Dekl_ As Double = Asin(Sin(E_) * Sin(A_))
Dim Dekl As Double = Dekl_ * 180 / PI
lblRekt.Text = Rekt.ToString("0.0000°")
lblDekl.Text = Dekl.ToString("0.0000°")
End Sub
Post by harald c. greier
Post by Ralf Mayer
Alternativ bietet der Wiki-Link auch Links zu Tabellen und
Online-Rechnern,
die dir die Daten ausrechnen - da müßte dann ein Programm diesen Output
lesen und die passende Zeit/Ort Kombination ausgeben.
Hm, ja, lies auch mich grade belehren, dass dies nur mit einer Anwendung
möglich ist, die auch die entsprechenden Schnittstellen ansprechen kann.
Wie das genau auszusehen hat weiß ich leider nicht.
Das Angebot der Nasa über Telnet (per Programm) anzusprechen und ein ganzes
Datenbündel abzuholen ist gar kein Problem. Daraus dann die für JETZT
passenden Zeilen zu suchen ist etwas fummelig, aber auch kein echter Akt.

Grüße
Ralf
harald c. greier
2006-04-05 20:07:35 UTC
Permalink
Hallo Ralf, du schriebst
Post by Ralf Mayer
Hier sind 2 Prozeduren, die ich mal so auf die Schnelle ins .NET Framework
(VB.NET) getippt habe. Eingegeben wird Datum und Zeit (UTC), raus kommen
Rektaszension und Deklination. Frage mich jetzt nicht, wie genau und was und
wo... einfach nur Wikipedia abgetippt.
Ich kann dir auch die Windows Exe geben - allerdings EXE von fremdem Leuten
ist immer so eine Sache...
Warum denn nicht? Es gibt ja Scanner.
Außerdem wirst du in die Datei ja wohl nix Böses reingetippt haben,
oder? :)

Vielen Dank für deine Mühe. Habe mich jetzt erkundigt, mit Flash bekomme
ich ohne weitere Hilfsmittel (z.B. Delphi) keine Verbindung zu
Rechner-Schnittstellen wie z.B. dem Parallel-Port.

greets,
harald

--
Lutz Terheyden
2006-04-07 06:43:54 UTC
Permalink
Post by harald c. greier
Habe mich jetzt erkundigt, mit Flash bekomme
ich ohne weitere Hilfsmittel (z.B. Delphi) keine Verbindung zu
Rechner-Schnittstellen wie z.B. dem Parallel-Port.
Die Adresse liegt meist bei oder ab 378.
Und damals ging das mit Poke, bzw. Peek; auf dem 64er ;-)
Zatras
2006-04-05 07:26:37 UTC
Permalink
Hallo,
ich hab heut früh mal versucht die Gleichungen von Wiki ins excel zu
übertragen um mal alle Werte die bei Wiki angegeben sind zu bekommen.

Leider sind die Winkel die ich rausbekomme nicht annähernd so wie sie
bei Online-Tools aussehen.
Also scheint es doch nicht so einfach zu sein.Ich hab ja da auch schon
das Problem,das ich nicht genau weiß,in welchem Format Ergebnisse
übergeben oder eingegeben werden sollen (zB UT bzw Winkelfunktionen
Rad od .Grad)

Vielleicht hat jemand ein vorgefertigtes Script wo man die genaue Zeit
und Breiten und Längengrad eingibt und als Ergebnis
Höhen und Seitenwinkel bekommt.

mfg
Zatras

mfg
Zatras
Zatras
2006-04-04 14:15:37 UTC
Permalink
Hi,
Nein es geht nicht um Strom,sondern um Erwärmung von Wasser um ein
Haus damit Teilweise zu heizen.
Ich kann mir auch nicht so wirklich vorstellen das das es Solarzellen
gibt,welche 15 kW/m² lange aushalten würden
ohne zu sterben. :-)

Nachts sollte das ganze Ding in eine fixe Lage fahren ( zB Direkt
Süden,Sonnenhöhe 10Grad) eben irgendwohin wo die Reflektion der
aufgehenden oder untergehenden Sonne niemanden unbeabsichtigt blenden
kann.
Bei Bewölkung soll alles normal betrieben werden,bin ja auch neugierig
wieviel Strahlung so durch die Wolkendecke kommt,sie wird ohnehin ca15
mal verstärkt.

Ich hab mal die Formeln auf Wikipedia "angeschaut" aber bis jetzt blick
ich bei der Berechnung noch nicht so richtig durch.
mfg
Zatras
Bilbo Baggins
2006-04-06 19:26:35 UTC
Permalink
Ich würde es nicht mit der Formel machen, sondern das Problem
regelungstechnisch lösen.
Die Nachführung könntest du auf die schräge Deines Breitengrades einstellen.
Dann würde ich mit Fotozellen arbeiten, deren Helligkeitswert Du misst.
Vielleicht kommst Du mit 10 Stück aus.
Vor diese würde ich eine Schlitzblende stellen und die Fotozellen von der
Richtung von Ost nach West verteilen.
Je nach gemessenen Werten weist Du so cirka die Sonnenrichtung. Wenn die
Sonne nicht stark genug scheint, lässt Du die Spiegeln in Parkposition.

Versuchen täte ich es vorerst mit den Robotersätzen von Lego oder
fischertechnik. Die haben zu günstigen Preis eigentlich alles was Du
brauchst: Sensoren, Steuerungen, Programme, ...

Gernot
Post by Ralf Mayer
"Thomas Schmidt" schrieb im Newsbeitrag...
Post by Thomas Schmidt
Post by Zatras
Nun suche ich ein Programm,das mir periodisch (zb alle 4 Minuten) auf 2
Parallelen Schnittstellen die Werte für Sonnenhöhe und Azimuth
ausgibt.
Entschuldige wenn das vielleicht blöd ist, aber was passiert mit dem
gesammeltem Licht? Du wirst Strom daraus "gewinnen" wollen, oder?
Könnte man nicht den aktuellen "Erzeugungswert" messen, und dann jeweils
"etwas links" und "etwas rechts" gucken, ob es da noch ergiebiger ist?
Ok, vielleicht blöd... Was ist nachts? Was ist bei Bewölkung? Was ist wenn
der Reflektor völlig verstellt ist? Vielleicht doch nicht so einfach.
Post by Thomas Schmidt
http://de.wikipedia.org/wiki/Sonnenstand
Wenn das schon alles ist... ein kleines Programm was das kurz ausrechnet
ist wahrscheinlich kein Problem. Ausgabe an Parallelports wüsste ich
spontan nicht, aber das sollte wohl auch gehen.
Wenn du keine andere Lösung findest kann ich mal sehen ob das so leicht
ist wie es aussieht.
Grüße
Ralf
Zatras
2006-04-07 09:01:23 UTC
Permalink
Das hab ich zuerst auch gedacht,liefert aber leider auch ein Problem:

Das funktioniert nur bei direkter Sonneneinstrahlung!

Sobald eine Wolke vor der Sonne ist wird entweder gar nicht
nachgeregelt,oder zu einem falschen Punkt oder die Regelung verläuft
sich und zielt irgendwohin.
Weiters dauert die Nachstellung von Parkposition auf Sonnenposition
ca.15min
(Untersetzung durch 3 Schneckengetriebe -> 2 U/h )
Deshalb sollte Parkstellung nur im Notfall bzw Nacht oder
Schlechtwetter durchgeführt werden.

Ich hätte noch eine Frage,ich habe ein wenig mit den Formeln auf Wiki
gespielt und die Werte sehen nicht so schlecht aus. Nur leider ist mir
dadurch auch etwas aufgefallen,es gibt sehr viele Onlineprogramme zur
Berechnung dieser Werte,
nur gibt es dadurch auch für ein und denselben Zeitpunkt mehrere Werte
für Sonnenhöhe und Azimuth und zwar Unterschiede im Bereich von 5
Grad.

Kann mir jemand ein Programm sagen,das definitiv richtige Werte hat?

mfg
Zatras
Bilbo Baggins
2006-04-07 19:21:43 UTC
Permalink
Es gibt ein ausgezeichnetes Buch:

Nachum Dershowitz, Edward M. Reingold
Calendrical Calculations

Die beiden Herren setzen sich mit den Kalendern der Welt auseinander. Da es
dabei aber auch astronomische Kalender gibt, kommen sie auch an der
Berechnung von Sonnenstand etc. vorbei.

Bilbo


"Zatras" <***@kjk.at> schrieb im Newsbeitrag news:***@u72g2000cwu.googlegroups.com...
Das hab ich zuerst auch gedacht,liefert aber leider auch ein Problem:

Das funktioniert nur bei direkter Sonneneinstrahlung!

Sobald eine Wolke vor der Sonne ist wird entweder gar nicht
nachgeregelt,oder zu einem falschen Punkt oder die Regelung verläuft
sich und zielt irgendwohin.
Weiters dauert die Nachstellung von Parkposition auf Sonnenposition
ca.15min
(Untersetzung durch 3 Schneckengetriebe -> 2 U/h )
Deshalb sollte Parkstellung nur im Notfall bzw Nacht oder
Schlechtwetter durchgeführt werden.

Ich hätte noch eine Frage,ich habe ein wenig mit den Formeln auf Wiki
gespielt und die Werte sehen nicht so schlecht aus. Nur leider ist mir
dadurch auch etwas aufgefallen,es gibt sehr viele Onlineprogramme zur
Berechnung dieser Werte,
nur gibt es dadurch auch für ein und denselben Zeitpunkt mehrere Werte
für Sonnenhöhe und Azimuth und zwar Unterschiede im Bereich von 5
Grad.

Kann mir jemand ein Programm sagen,das definitiv richtige Werte hat?

mfg
Zatras
Thomas Schmidt
2006-04-07 23:10:18 UTC
Permalink
Post by Zatras
es gibt sehr viele Onlineprogramme zur
Berechnung dieser Werte,
nur gibt es dadurch auch für ein und denselben Zeitpunkt mehrere Werte
für Sonnenhöhe und Azimuth und zwar Unterschiede im Bereich von 5
Grad.
Kann mir jemand ein Programm sagen,das definitiv richtige Werte hat?
Das Non-Plus-Ultra wäre der Ephemeridenserver der NASA:
http://ssd.jpl.nasa.gov/horizons.cgi

Der ist natürlich in Englisch und setzt ein wenig Fachkenntnis voraus,
sollte im Prinzip aber auch für einen Nichtfachmann benutzbar sein,
der von ein paar astronomischen Grundlagen schon mal gehört hat.
Für dich interessant wären vor allem die Ausgabegrößen ("Table
Settings") "Apparent AZ & EL", nämlich scheinbare Richtung (Azimuth)
und Höhe (Elevation).

Im deutschsprachigen Umfeld sollte
http://www.calsky.com/

recht zuverlässig sein. Unter "Sun" kannst du dir unter Anderem
Sonnenstände ausgeben lassen.

Beide Ephemeridenserver geben nordorientierte Azimute aus. Zum
Vergleich mit den Wikipedia-Formeln musst du 180° addieren. Beim
NASA-Server darfst du nicht vergessen, gegebenenfalls die Refraktion
einzuschalten.

Tschau,
Thomas
--
-------------------------------------------------------------------
Thomas Schmidt e-mail: ***@hoki.ibp.fhg.de
Zatras
2006-04-10 09:31:37 UTC
Permalink
Hallo,
Danke erstmal für alle Antworten und Anregungen.

Ich werd mal versuchen die Formeln auf der Wiki Seite zu einem Programm
umzubauen.
Ich habe aber leider mit 2 Formeln ein Problem:

1:Sternzeit OHG = 6,697376h + 2400,05134h * T0 + 1,002738 * UT

Ich hab das Beispiel auf Wiki als Referenz genommen,alle Werte bis
dorthin sind "fast" gleich (sehen nach Rundungsfehlern aus). Nur der
Wert für OHG ist um genau 168 zu hoch.
Wenn ich den Wert 168 abziehe ist der Wert für Azimuth für andere
Zeiten und Orte sehr nahe an den Werten von
Onlinerechnern. Ich weiß leider nicht woher diese 168 kommen?

2: Höhenberechnung: h = arcsin(cos(teta) * cos(tau) * cos(phi) +
sin(teta) * sin(phi))
(Bitte nicht treten wenn die Bezeichnungen der Winkel nicht stimmen)
Also bei mir wird der Wert in Klammer sehr oft größer 1 -> also nicht
möglich
Wenn er unter 1 ist, dann ist der berechnete Wert für h falsch.

Was mache ich denn da falsch?

mfg
Zatras
Josef Puerstinger
2006-04-10 09:16:51 UTC
Permalink
Hallo Zatras,
Post by Zatras
2: Höhenberechnung: h = arcsin(cos(teta) * cos(tau) * cos(phi) +
sin(teta) * sin(phi))
Also bei mir wird der Wert in Klammer sehr oft größer 1 -> also nicht
möglich
Kannst Du bitte ein paar Werte nennen, bei denen Dein Problem mit dem
"groesser 1" auftritt? Danke!

Josef
Zatras
2006-04-10 11:43:50 UTC
Permalink
Hab den Fehler bei der Höhe inzwischen gefunden,ich hatte bei der
Berechnung eine Klammer falsch gesetzt.
Der Wert weicht jetzt ca. 0,3 Grad von den Onlinewerten ab.

Nun bleibt nur noch das Problem mit OhG:
OHG = 6,697376h + 2400,05134h * T0 + 1,002738 * UT


T0 = 0,065941136.......
UT = 6

-> OHG = 6,697376 + 158,262112 + 6,016428 = 170,975916
laut Wiki sollte der Wert: 2,9759 haben also genau 168 weniger als
rauskommt.


???

vielen dank im Voraus!
mfg
Zatras
Thomas Schmidt
2006-04-10 12:52:33 UTC
Permalink
Zatras schrieb:
...
Post by Zatras
1:Sternzeit OHG = 6,697376h + 2400,05134h * T0 + 1,002738 * UT
Ich hab das Beispiel auf Wiki als Referenz genommen,alle Werte bis
dorthin sind "fast" gleich (sehen nach Rundungsfehlern aus). Nur der
Wert für OHG ist um genau 168 zu hoch.
Wenn ich den Wert 168 abziehe ist der Wert für Azimuth für andere
Zeiten und Orte sehr nahe an den Werten von
Onlinerechnern. Ich weiß leider nicht woher diese 168 kommen?
Das ist ein ganzzahliges Vielfaches von 24. Die Sternzeit, um die
es hier geht, ist ja letztlich nichts anderes als ein Drehwinkel,
der die momentane Rotationsstellung der Erde angibt. Da es für die
momentane Rotationsstellung nicht darauf ankommt, wie oft sich die
Erde bis dahin vollständig um sich selbst gedreht hat, kann man
ganzzahlige Vielfache von 360° abziehen (oder im vorliegenden Fall
ganzzahlige Vielfache von 24h, da der Winkel im Stundenmaß ausgedrückt
wird).

Das _mußt_ du allerdings nicht tun, denn du berechnest später
Sinus und Kosinus davon, und die liefern mit dem Originalwinkel
dasselbe Ergebnis, wie nach Abziehen von 7*24h = 168h, weil beide
Winkel ja physikalisch äquivalent sind. Ein gewisser numerischer
Vorteil des Abziehens liegt darin, dass du ein paar Fließkomma-
stellen frei machst, die eventuell beim Verringern von Rundungs-
fehlern nützlich sind, vor allem wenn du ohnehin mit geringer
Stellenzahl rechnest (wie's im Excel wohl der Fall ist).

Tschau,
Thomas
--
-------------------------------------------------------------------
Thomas Schmidt e-mail: ***@hoki.ibp.fhg.de
Zatras
2006-04-28 09:26:39 UTC
Permalink
Hallo,

Danke erstmal an alle die mich mit ihren Antworten in die richtige
Richtung gebracht haben!

Ich habe noch eine Bitte an euch:
Ich habe nun das Programm in FreeBasic geschrieben (Quelltext unten)

Leider habe ich bei dieser Berechnung öfter Differenzen zu den
Onlinedaten,kann mir
vielleicht jemand sagen was ich da falsch gemacht habe,oder wo der
Fehler sonst liegen könnte?

mfg
Zatras

10 T$ = Time$
15 pi#=4*ATN(1)
20 Dat$ = Date$
25 Print "Local Time: "; t$ ; " Date: " ; Dat$
30 Hour=Val(Mid$(T$,1,2))
40 Hour=Hour -2 rem Greenwich-Abgleich
45 If Hour<0 then Hour=Hour+24
50 Minute=Val(Mid$(T$,4,2))
60 Minneu=Val(Mid$(T$,4,2))
70 Second=Val(Mid$(T$,7,2))
80 Day=Val(MID$(dat$,4,2))
90 Month=Val(MID$(dat$,1,2))
100 Year=Val(MID$(dat$,7,4))
105 Print "GMT:";hour;minute;second
110 Greg#=2-(INT(year/100))+(INT(INT(year/100)/4))-1524.5
120 JD2#=day+hour/24+minute/1440+second/86400+Greg#
130 If month<3 then 150
140 JD#=JD2#+INT(365.25*(Year+4716))+INT(30.6001*(Month+1))
150 JD#=JD2#+INT(365.25*(Year-1+4716))+Int(30.6001*(Month+12+1))
160 JD0#=JD#-hour/24-minute/1440-second/86400
170 UT#=Hour+Minute/60+Second/3600
200 n#=JD#-2451545
210 L#=280.46+0.9856474*n#
220 if L#>360 then 240
230 goto 310
240 L#=L#-360
250 goto 220
310 g#=357.528+0.9856003*n#
320 if g#>360 then 340
330 goto 400
340 g#=g#-360
350 goto 320
400 gr#=(g#/180)*PI#
410 A#=L#+1.915*sin(gr#+0.2*sin(2*gr#))
430 E#=23.439-(0.0000004*n#)
450 Er#=(E#/180)*PI#
460 Ar#=(A#/180)*PI#
470 REKr#=ATN(cos(Er#)*sin(Ar#)/cos(Ar#))
480 REK#=REKr#/PI#*180
490 IF cos(Ar#)>0 then 520
500 REK#=REK#+180
520 DEKr#=ASIN(sin(Er#)*sin(Ar#))
530 DEK#=DEKr#/PI#*180
550 T0#=(JD0#-2451545)/36525
570 OhG#=6.697376+2400.05134*T0#+1.002738*UT#
580 If OhG#<24 then 620
590 OhG#=OhG#-24
600 Goto 580
620 OG#=OhG#*15
630 BREITE=46.35
640 LAENGE=14.06
650 O#=OG#+LAENGE
660 Tau#=O#-REK#
680 TAUr#=(Tau#/180)*PI#
690 BREITEr#=(BREITE/180)*PI#
700 LAENGEr#=(LAENGE/180)*PI#
710 Nenn#=Cos(TAUr#)*Sin(BREITEr#)-tan(DEKr#)*cos(BREITEr#)
720 AZIr!=ATN(sin(TAUr#)/Nenn#)
730 AZI#=AZIr!/PI#*180
740 if Nenn#<0 then AZI#=AZI#+180
745 AZout=INT(AZI#+180)
750 Print "Azimuth: "; azi#;" AZout: ";AZout
751 h1#=cos(DEKr#)
752 h2#=cos(TAUr#)
753 h3#=cos(BREITEr#)
754 h4#=sin(DEKr#)
755 h5#=sin(BREITEr#)
760 HOEHEr#=ASIN(h1#*h2#*h3#+H4#*H5#)
770 HOEHE#=HOEHEr#/PI#*180
775 Hout=INT(HOEHE#*3.5)
780 Print "Hoehe: ";HOEHE#;" Hout: ";Hout
790 if HOUR>21 Goto 1000
800 if HOEHE#<10 GOTO 2000
810 OUT(888,Hout)
820 OUT(889,AZout-50)
830 Goto 2000
1000 OUT (888,35)
1010 OUT (889,130)
2000 if Minute=Minneu then 2020
2010 Goto 10
2020 sleep 1000
2025 T$=TIME$
2030 Minneu=Val(Mid$(T$,4,2))
2040 goto 2000
Thomas Schmidt
2006-04-30 19:34:04 UTC
Permalink
Zatras schrieb:
...
Post by Zatras
Leider habe ich bei dieser Berechnung öfter Differenzen zu den
Onlinedaten,kann mir
vielleicht jemand sagen was ich da falsch gemacht habe,oder wo der
Fehler sonst liegen könnte?
Es wäre hilfreich, wenn du uns etwas Näheres über diese Differenzen
sagen könntest. Sind es Unterschiede in der siebten Nachkommastelle
oder fehlt es um ein paar hundert Grad? Treten immer Differenzen
in derselben Größenordnung auf? Treten sie bei jeder Rechnung auf
oder nur in seltenen Fällen? Hast du auch RA und Dek mit Online-
Werten verglichen oder nur Azimut und Höhe? Etc...
Ein konkretes Beispiel wäre ein nützlicher Ansatzpunkt.

Tschau,
Thomas
Zatras
2006-05-02 09:24:13 UTC
Permalink
Hallo,

also die Unterschiede liegen bei max. + - 1 Grad
Beispiel:
Uhrzeit Heute: 02.05.2006 - 11:13 Uhr Ort: Breite:46.35 -
Länge:14,06

Laut meinem Programm:
Höhe: 52,456 Grad Azimuth: 134,407

Laut
http://www.jgiesen.de/SME/index.htm
Höhe: 51,54 Grad Azimuth: 135,3 Grad

Die Differenzen treten immer auf, mal weniger mal mehr,eine Genauigkeit
von +- 0,1 Grad wäre mein Ziel.

mfg
Zatras
Thomas Schmidt
2006-05-02 22:18:27 UTC
Permalink
Post by Zatras
also die Unterschiede liegen bei max. + - 1 Grad
Uhrzeit Heute: 02.05.2006 - 11:13 Uhr Ort: Breite:46.35 -
Länge:14,06
Höhe: 52,456 Grad Azimuth: 134,407
Laut
http://www.jgiesen.de/SME/index.htm
Höhe: 51,54 Grad Azimuth: 135,3 Grad
Die Differenzen treten immer auf, mal weniger mal mehr,eine Genauigkeit
von +- 0,1 Grad wäre mein Ziel.
Aha, ein stets auftretender Fehler der Größenordnung 1 Grad deutet mit
einiger Wahrscheinlichkeit auf ein Problem mit der Mittelpunktsgleichung
hin, weil die für die Sonne stets im Bereich 0..2° liegt. Und in der Tat,
die Zeile

410 A#=L#+1.915*sin(gr#+0.2*sin(2*gr#))

sollte lauten

410 A#=L#+1.915*sin(gr#)+0.2*sin(2*gr#)


Meine Implementierung des Rechenverfahrens liefert:

JD = 2453857.88403
n = 2312.88403
L = 40.14813°
g = 117.10719°
ekl.Länge = 41.83655°
eps = 23.43807°
alpha = 39.39917°
delta = 15.38523°
JD0 = 2453857.5
T0 = 0.06331...
thetaG = 23.89330°
theta = 12.45951°
Azimut = -44.86981 (südorientiert) = 135.13019 (nordorientiert)
Höhe = 51.74518 (ohne Refraktion)
= 51.75849 (mit Refraktion)
Post by Zatras
http://www.jgiesen.de/SME/index.htm
Bei Benutzung dieses Applets als Referenz ist ein wenig Vorsicht geboten,
weil es offenbar die von dir angestrebte Genauigkeit selbst nicht ganz
erreicht. Hier der Vergleich mit Daten aus drei anderen Quellen:

ich (s.o.): Höhe = 51.745°, Azimut = 135.130° (ohne Refraktion)
Höhe = 51.758°, Azimut = 135.130° (mit Refraktion)

Applet Höhe = 51.54°, Azimut = 135.3°

====================================================================

SkyMap 2.2 Höhe = 51.758°, Azimut = 135.127° (offenbar mit Refraktion)

CalSky: Höhe = 51.7450°, Azimut = 135.1272° (ohne Refraktion)
Höhe = 51.76° , Azimut = 135.13° (mit Refraktion)

HORIZONS: Höhe = 51.7455°, Azimut = 135.1287° (ohne Refraktion)
Höhe = 51.7588°, Azimut = 135.1287° (mit Refraktion)
Post by Zatras
40 Hour=Hour -2 rem Greenwich-Abgleich
45 If Hour<0 then Hour=Hour+24
Wenn die Mitternacht überschritten wird, müsstest du nicht nur
die Stunden um 24 hochzählen, sondern auch den Tag um eins vermindern.
Falls dabei ein Monatsanfang überschritten wird, müsstest du
stattdessen den Monat um eins vermindern und den Tag auf den letzten
Tag des Monats setzen. Falls du gleichzeitig den Jahresanfang über-
schritten hast, müsstest du den Monat auf Dezember setzen und das
Jahr um eins vermindern.
Einfacher ist es, das Julianische Datum erst für den Zeitpunkt in
MEZ oder MESZ auszurechnen (mit derselben Formel, nur eben MEZ oder
MESZ als Input) und vom Ergebnis 1/24 (MEZ -> UT) oder 2/24 (MESZ -> UT)
zu subtrahieren.


Ansonsten kann ich bei einer _flüchtigen_ Durchsicht deines Codes
Post by Zatras
210 L#=280.46+0.9856474*n#
220 if L#>360 then 240
230 goto 310
240 L#=L#-360
250 goto 220
Wenn n < 0 ist, müssen hier und an den entsprechenden anderen Stellen
im Programm evtl. auch Vielfache von 360° _addiert_ werden.
Kürzer geht sowas mit

L = 360*frac(L/360)
if L<0 then L = L+360
Post by Zatras
470 REKr#=ATN(cos(Er#)*sin(Ar#)/cos(Ar#))
720 AZIr!=ATN(sin(TAUr#)/Nenn#)
Hier muss eventuell der Fall cos(Ar#)=0 bzw. Nenn#=0 abgefangen werden.

Tschau,
Thomas
--
-------------------------------------------------------------------
Thomas Schmidt e-mail: ***@hoki.ibp.fhg.de
Zatras
2006-05-03 09:43:07 UTC
Permalink
Hallo

Vielen Danke für die wirklich große Hilfe!

Habe mein Programm nun etwas überarbeitet,waren doch noch ein paar
Fehler drin.
Nun bekomme ich "fast" alle Werte die du auch bekommen hast.
Außer:

thetaG = 23.89330°
theta = 12.45951°
Azimut = -44.86981
Höhe = 51.74518

Bei mir sind diese Werte so:
thetaG = 23,8932470649555
theta = 12,3987059743328
Azimuth = - 45,2670206676516
Höhe = 51,9625634621038

Nur ich verstehe nicht ganz wie sich in diesem Bereich ein solcher
Fehler einschleichen kann:

570 OhG#=6.697376+2400.05134*T0#+1.002738*UT#
580 If OhG#<24 then 620
590 OhG#=OhG#-24
600 Goto 580
620 OG#=OhG#*15
630 BREITE=46.35
640 LAENGE=14.06
650 O#=OG#+LAENGE
651 if O#<360 goto 660
652 O#=O#-360
653 Goto 651

Hast du da noch irgendeine Idee?

mfg
Zatras
Post by Zatras
40 Hour=Hour -2 rem Greenwich-Abgleich
45 If Hour<0 then Hour=Hour+24
Die Software wird nur im Zeitraum 5-21 Uhr benötigt,ich wollte nur
sichergehen,
das keine negative Zeit ( UT ) in die Berechnung kommt


Neuer Quellcode:

10 T$ = "11:13:00" rem Time$
15 pi#=4*ATN(1)
20 Dat$ = "05.02.2006" rem Date$
25 Print "Local Time: "; t$ ; " Date: " ; Dat$
30 Hour=Val(Mid$(T$,1,2))
40 Hour=Hour -2 rem Greenwich-Abgleich
45 If Hour<0 then Hour=Hour+24
50 Minute=Val(Mid$(T$,4,2))
60 Minneu=Val(Mid$(T$,4,2))
70 Second=Val(Mid$(T$,7,2))
80 Day=Val(MID$(dat$,4,2))
90 Month=Val(MID$(dat$,1,2))
100 Year=Val(MID$(dat$,7,4))
105 Print "GMT:";hour;minute;second
110 Greg#=2-(INT(year/100))+(INT(INT(year/100)/4))-1524.5
120 JD2#=day+hour/24+minute/1440+second/86400+Greg#
130 If month<3 then 150
140 JD#=JD2#+INT(365.25*(Year+4716))+INT(30.6001*(Month+1))
145 Goto 160
150 JD#=JD2#+INT(365.25*(Year-1+4716))+Int(30.6001*(Month+12+1))
160 JD0#=JD#-hour/24-minute/1440-second/86400
170 UT#=Hour+Minute/60+Second/3600
200 n#=JD#-2451545
210 L#=280.46+0.9856474*n#
220 if L#>360 then 240
230 goto 310
240 L#=L#-360
250 goto 220
310 g#=357.528+0.9856003*n#
320 if g#>360 then 340
330 goto 400
340 g#=g#-360
350 goto 320
400 gr#=(g#/180)*PI#
410 A#=L#+1.915*sin(gr#)+0.02*sin(2*gr#)
430 E#=23.439-(0.0000004*n#)
450 Er#=(E#/180)*PI#
460 Ar#=(A#/180)*PI#
470 REKr#=ATN(cos(Er#)*sin(Ar#)/cos(Ar#))
480 REK#=REKr#/PI#*180
490 IF cos(Ar#)>0 then 520
500 REK#=REK#+180
520 DEKr#=ASIN(sin(Er#)*sin(Ar#))
530 DEK#=DEKr#/PI#*180
550 T0#=(JD0#-2451545)/36525
570 OhG#=6.697376+2400.05134*T0#+1.002738*UT#
580 If OhG#<24 then 620
590 OhG#=OhG#-24
600 Goto 580
620 OG#=OhG#*15
630 BREITE=46.35
640 LAENGE=14.06
650 O#=OG#+LAENGE
651 if O#<360 goto 660
652 O#=O#-360
653 Goto 651
660 Tau#=O#-REK#
680 TAUr#=(Tau#/180)*PI#
690 BREITEr#=(BREITE/180)*PI#
700 LAENGEr#=(LAENGE/180)*PI#
710 Nenn#=Cos(TAUr#)*Sin(BREITEr#)-tan(DEKr#)*cos(BREITEr#)
720 AZIr!=ATN(sin(TAUr#)/Nenn#)
730 AZI#=AZIr!/PI#*180
740 if Nenn#<0 then AZI#=AZI#+180
745 AZout=INT(AZI#+180)
750 Print "Azimuth: "; azi#;" AZout: ";AZout
751 h1#=cos(DEKr#)
752 h2#=cos(TAUr#)
753 h3#=cos(BREITEr#)
754 h4#=sin(DEKr#)
755 h5#=sin(BREITEr#)
760 HOEHEr#=ASIN(h1#*h2#*h3#+H4#*H5#)
770 HOEHE#=HOEHEr#/PI#*180
775 Hout=INT(HOEHE#*3.5)
780 Print "Hoehe: ";HOEHE#;" Hout: ";Hout
781 Print JD#;n#
782 Print L#;g#
783 Print A#;E#
784 Print Rek#;Dek#
785 Print JD0#;t0#
786 Print OhG#;O#
790 if HOUR>21 Goto 1000
800 if HOEHE#<10 GOTO 2000
810 OUT(888,Hout)
820 OUT(889,AZout-50)
830 Goto 2000
1000 OUT (888,35)
1010 OUT (889,130)
2000 if Minute=Minneu then 2020
2010 Goto 10
2020 sleep 10000
2025 T$=TIME$
2030 Minneu=Val(Mid$(T$,4,2))
2040 goto 2000
Thomas Schmidt
2006-05-03 21:42:57 UTC
Permalink
Post by Zatras
Nun bekomme ich "fast" alle Werte die du auch bekommen hast.
thetaG = 23.89330°
theta = 12.45951°
Azimut = -44.86981
Höhe = 51.74518
thetaG = 23,8932470649555
theta = 12,3987059743328
Azimuth = - 45,2670206676516
Höhe = 51,9625634621038
Nur ich verstehe nicht ganz wie sich in diesem Bereich ein solcher
570 OhG#=6.697376+2400.05134*T0#+1.002738*UT#
580 If OhG#<24 then 620
590 OhG#=OhG#-24
600 Goto 580
620 OG#=OhG#*15
630 BREITE=46.35
640 LAENGE=14.06
650 O#=OG#+LAENGE
651 if O#<360 goto 660
652 O#=O#-360
653 Goto 651
Hast du da noch irgendeine Idee?
Hm, so auf Anhieb nicht; der Code sieht eigentlich unschuldig aus.
Die Variablen müssen auf alle Fälle Double Precision sein, Single
genügt nicht. Ich denke, das #-Suffix heißt Double. Sind die Variablen
damit automatisch als Double deklariert, oder fehlt evtl. eine explizite
Deklaration?

Und mal dumm gefragt: Sind Konstanten wie in
Post by Zatras
570 OhG#=6.697376+2400.05134*T0#+1.002738*UT#
grundsätzlich Double, oder richten sie sich danach, ob in der Formel
Single bzw. Double vorkommen, oder muss man sie ggf. explizit als
Double deklarieren?
Es macht mich ein wenig stutzig, dass sich unsere thetaG ab der sechsten
Post by Zatras
thetaG = 23.89330°
thetaG = 23,8932470649555
^
12 3456


Mein Codestück sieht so aus:

thG := 2400.05134*T0;
thG := frac(thG/24)*24;
thG := thG + 6.697376 + 1.002738*(JD-JD0)*24;
thG := frac(thG/24)*24;
while thG<0 do thG := thG+24;

Ich mache erst die Multiplikation mit T0 und ziehe schon von diesem
Zwischenergebnis Vielfache von 24h ab, um ein paar Fließkommastellen
freizumachen, aber es dürfte nicht wirklich einen Unterschied machen.

Ich starte mit der Eingabe JD = 2453857.88403,
mein Programm berechnet daraus

JD = 2453857.88402999984
JD0 = 2453857.5
alpha = 39.399173040725491200
delta = 15.385227219548088320
T0 = 0.063312799452429850 (T0 _muss_ auf alle Fälle ein Double sein)

Im betreffenden Programmteil ist dann der Wert von thG nach Abarbeiten
der jeweiligen Zeile

thG := 2400.05134*T0; // thG = 151.95396916495551
thG := frac(thG/24)*24; // thG = 7.95396916495550954
thG := thG + 6.697376 + 1.002738*(JD-JD0)*24; // thG = 23.8933005404891716
thG := frac(thG/24)*24; // thG = 23.8933005404891716
while thG<0 do thG := thG+24; // wird nicht ausgeführt

und weiter, mit lambda = 14.06 und phi = 46.35

th := (thG + lambda/15)*15; // th = 372.45950810733757
while th>=360 do th := th - 360; // th = 12.4595081073375695
while th< 0 do th := th + 360; // nicht ausgeführt

A := atn2(cs(delta)*sn(th-alpha), cs(delta)*cs(th-alpha)*sn(phi)-sn(delta)*cs(phi)); // A = -44.869810816805952
(sn und cs sind selbstdefinierte Sinus und Cosinus, die Grad statt Radian als Eingabe erwarten,
der Arcustangens atn2(y, x) gibt das Ergebnis automatisch im richtigen Quadranten zurück)

h := asn(cs(delta)*cs(th-alpha)*cs(phi)+sn(delta)*sn(phi)); // h = 51.7451767231141062

R := 1.02 / tn(h + 10.3/(h+5.11)); // R = 0.799025260854254071

hr := h + R/60; // hr = 51.7584938107950094


Tschau,
Thomas
--
-------------------------------------------------------------------
Thomas Schmidt e-mail: ***@hoki.ibp.fhg.de
Zatras
2006-05-04 08:23:29 UTC
Permalink
Hi,
kannst du mir mal deinen Quellcode schicken?

Mir ist aufgefallen,das wir schon Unterschiede bei JD haben (ab
6.Kommastelle)
weiters nimmst du statt UT für die Berechnung JD-JD0

# = Double -> Hab ich mal auf einer Seite gefunden,find diese Seite
leider nicht mehr - aber 15 Stellen sind bei FreeBasic Maximum - bei
dir sind es 18 Stellen(bei R sogar 19)
welche Sprache verwendest du denn?

mfg
Zatras
Thomas Schmidt
2006-05-04 19:28:55 UTC
Permalink
Post by Zatras
Hi,
kannst du mir mal deinen Quellcode schicken?
Mir ist aufgefallen,das wir schon Unterschiede bei JD haben (ab
6.Kommastelle)
weiters nimmst du statt UT für die Berechnung JD-JD0
# = Double -> Hab ich mal auf einer Seite gefunden,find diese Seite
leider nicht mehr - aber 15 Stellen sind bei FreeBasic Maximum - bei
dir sind es 18 Stellen(bei R sogar 19)
welche Sprache verwendest du denn?
JD rechne ich in diesem Testprogramm nicht selber aus. Im vorliegenden
Fall habe ich mir von GUIDE 8 das Datum 2. Mai 2006 11:13:00 MESZ ins
JD umrechnen lassen und 2453857.88403 erhalten.

(JD-JD0)*24 ist nichts anderes als UT.

18 Stellen hat in diesem Fall nur die Ausgabe (war so konfiguriert).
Ich rechne mit double precision, das entspricht 15 bis 16 Stellen
und reicht völlig. Single precision ist aber zuwenig, vergewissere
dich bitte, dass alles (zumindest alles wichtige) wirklich double
precision ist.

Mein Quellcode ist in Delphi, einem Pascal-Dialekt. Er tut eigentlich
nichts weiter als phi, lambda und JD einzulesen, die Formeln der
Reihe nach abzuarbeiten und das Ergebnis jedes Schritts in einem
Textfeld auszugeben:



function sn(x: double): double;
begin
sn := sin(x*pi/180);
end;

function cs(x: double): double;
begin
cs := cos(x*pi/180);
end;

function tn(x: double): double;
begin
tn := tan(x*pi/180);
end;

function asn(x: double): double;
begin
asn := arcsin(x)*180/pi;
end;

function atn2(y, x: double): double;
var tmp: double;
begin
if x=0 then
begin
if y>=0 then atn2 := 90
else atn2 := -90;
end
else
begin
tmp := arctan(y/x)*180/pi;
if x<0 then tmp := tmp + 180;
atn2 := tmp;
end;
end;

procedure TForm1.bt_calcClick(Sender: TObject);
var phi, lambda, JD, JD0, n, L, g, ecLon, eps, alpha, delta,
T0, thG, th, A, h, R, hr: double;
code: integer;
outstr: string;
begin

val(trim(ed_phi.text), phi, code);
val(trim(ed_lambda.text), lambda, code);
val(trim(ed_JD.text), JD, code);

n := JD - 2451545;

L := 280.460 + 0.9856474*n;
while L>=360 do L := L-360; // besser: L := 360*frac(L/360);
while L < 0 do L := L + 360;
str(L:9:5, outstr);
ed_L.text := outstr;

g := 357.528 + 0.9856003*n;
while g>=360 do g := g - 360; // besser: g := 360*frac(g/360);
while g < 0 do g := g + 360;
str(g:9:5, outstr);
ed_g.text := outstr;

ecLon := L + 1.915 * sn(g) + 0.020*sn(2*g);
while ecLon>=360 do ecLon := ecLon - 360; // besser: ecLon := 360*frac(ecLon/360);
while ecLon < 0 do ecLon := ecLon + 360;
str(ecLon:9:5, outstr);
ed_ecLon.text := outstr;

eps := 23.439 - 0.0000004*n;
str(eps:9:5, outstr);
ed_eps.text := outstr;

alpha := atn2( cs(eps)*sn(ecLon), cs(ecLon));
str(alpha:9:5, outstr);
ed_alpha.text := outstr;

delta := asn(sn(eps)*sn(ecLon));
str(delta:9:5, outstr);
ed_delta.text := outstr;

JD0 := int(JD-0.5)+0.5;
str(JD0:9:1, outstr);
ed_JD0.text := outstr;

T0 := (JD0 - 2451545)/36525;
str(T0:9:5, outstr);
ed_T0.text := outstr;

thG := 2400.05134*T0;
thG := frac(thG/24)*24;
thG := thG + 6.697376 + 1.002738*(JD-JD0)*24;
thG := frac(thG/24)*24;
while thG<0 do thG := thG+24;
str(thG:9:5, outstr);
ed_thG.text := outstr;

th := thG*15 + lambda;
while th>=360 do th := th - 360; // besser: th := 360*frac(th/360);
while th< 0 do th := th + 360;
str(th:9:5, outstr);
ed_th.text := outstr;

A := atn2(cs(delta)*sn(th-alpha), cs(delta)*cs(th-alpha)*sn(phi)-sn(delta)*cs(phi));
str(A:9:5, outstr);
ed_A.text := outstr;

h := asn(cs(delta)*cs(th-alpha)*cs(phi)+sn(delta)*sn(phi));
str(h:9:5, outstr);
ed_h.text := outstr;

R := 1.02 / tn(h + 10.3/(h+5.11));

hr := h + R/60;
str(hr:9:5, outstr);
ed_hr.text := outstr;

end;

Tschau,
Thomas
--
-------------------------------------------------------------------
Thomas Schmidt e-mail: ***@hoki.ibp.fhg.de
Loading...