005
12.05.2006, 23:08 Uhr
~irgendwer
Gast
|
Hallo
Wie ich sehe, hast Du meinen Rat befolgt und hier gepostet. Ich habe hier mal einen Entwurf, weiss aber nicht ob der das richtige zurückliefert. Kompilier das ganze mal und lass die Test durchlaufen und vergleich es mit deinen Berechnungen. Ich habs mit DevCpp (http://sourceforge.net/projects/dev-cpp) getestet.
C++: |
#include <stdio.h> #include <stdlib.h> #include <math.h>
// Formeln aus dem Javascript der digitalen Sonnenuhr // nach Formeln und Tabellen aus // Arnold Zenkert: Faszination Sonnenuhr, // Verlag Harri Deutsch 1995, ISBN 3-8171-1386-2
// d,m =aktuelles Datum (3.Mai => d=3, m=5) // lambda=geogr. Länge im Bogenmaß // phi=gegr. Breite im Bogenmaß // delta=Deklination der Sonne im Bogenmaß // tau=Stundenwinkel der Sonne im Bogenmaß // z=Zeitgleichung in Zeit-Minuten
#define PI 3.1415926535897932384626433832795
// Gemäss http://de.wikipedia.org/wiki/Bogenmass double b2g(double lambda) { return lambda*180.0/PI; }
//-------------------------------------------------- // Berechnung der Deklination für den d.Tag des Monats m eines Jahres // Ergebnis in Grad; => delta=Ergebnis*(Pi/180) // Zenkert, Tabelle ab S. 155 //-------------------------------------------------- double Deklination (int d, int m) { int i; double k; double dekl[]={ /* Deklination für den */ /* 1. 6. 11. 16. 21. 26. des Monats */ -23.1, -22.6, -21.9, -21.0, -20.0, -18.8, -17.3, -15.8, -14.2, -12.5, -10.8, -8.9, -7.8, -5.9, -3.9, -2.0, 0.0, 2.0, 4.3, 6.3, 8.1, 9.9, 11.7, 13.3, 14.9, 16.4, 17.7, 19.0, 20.1, 21.0, 22.0, 22.6, 23.1, 23.3, 23.4, 23.4, 23.2, 22.8, 22.2, 21.5, 20.6, 19.1, 18.2, 16.9, 15.4, 13.9, 12.3, 10.6, 8.2, 6.7, 4.8, 2.9, 0.9, -1.0, -3.0, -4.9, -6.8, -8.7, -10.5, -12.3, -14.3, -15.8, -17.3, -18.6, -19.8, -20.8, -21.7, -22.4, -23.0, -23.3, -23.4, -23.4, -23.1 }; i=(m-1)*6+floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt. // k=(d-1 - 5*floor((d-1)/5))/5; return(dekl[i]+k*(dekl[i+1]-dekl[i])); }
//-------------------------------------------------- // Berechnung der Zeitgleichung für den d.Tag des Monats m eines Jahres // in Minuten (Das ist der Wert, um den jede Sonnenuhr wegen der elliptischen Erdbahn // falsch geht (hängt von der Jahreszeit ab) // Zenkert, Tabelle ab S. 155 //-------------------------------------------------- double Zeitgleichung (int d, int m) { int i; double k; double zgz[]={ // Zeitgleichung für den // 1. 6. 11. 16. 21. 26. des Monats -3.5, -5.8, -7.9, -9.7, -11.3, -12.6, //Januar -13.6, -14.1, -14.3, -14.1, -13.7, -13.0, -12.4, -11.4, -10.1, -8.7, -7.3, -5.8, -4.0, -2.5, -1.1, 0.2, 1.3, 2.2, 2.9, 3.4, 3.7, 3.7, 3.5, 3.1, 2.3, 1.5, 0.5, -0.6, -1.6, -2.9, -3.7, -4.6, -5.4, -6.0, -6.3, -6.5, -6.3, -5.9, -5.2, -4.3, -3.2, -1.9, -0.2, 1.6, 3.3, 5.1, 6.9, 8.6, 10.3, 11.7, 13.2, 14.4, 15.3, 16.0, 16.4, 16.4, 16.0, 15.3, 14.2, 12.8, 11.0, 9.1, 6.9, 4.5, 2.0, -0.5, //Dezember -3.5 }; i=(m-1)*6+floor((d-1)/5); //Index des Eintrags, dessen Tag <= dem gesuchten ist // Die folgende Interpolation liefert für die Tage zwischen dem 26. und dem 1. des // Folgemonats ungenaue Werte, da dann die zu zwei aufeinander folgenden Tabellen-Eingängen // gehörende Tag-Differenz nicht 5, sondern zwischen 3=28+1-26 und 6=31+1-26 schwankt. // k=(d-1 - 5*floor((d-1)/5))/5; return(zgz[i]+k*(zgz[i+1]-zgz[i])); }
//-------------------------------------------------- // Berechnet aus aktueller Uhrzeit, geogr. Länge lambda (0..tau..2*PI) // und Zeitgleichung z den Stundenwinkel // getUTCHours,getUTCMinutes,getUTCSeconds=Aktuelle Greenwich-Zeit (UTC) // An einem Tage ändert sich der Stundenwinkel von 0h bis 24h Greenwich-Zeit // dort gleichmäßig von -Pi über 0 (12h) bis +Pi // Bei uns geht die Sonne pro Längengrad um 4 Minuten früher auf => +4*b2g(lambda) // (b2g: Umrechnung von lambda aus dem Bogenmaß ins Gradmaß) // Dazu kommt noch die jahreszeitlich veränderliche Zeitgleichung //-------------------------------------------------- double Date2Stundenwinkel (double d_UTCHours, double d_UTCMinutes, double d_UTCSeconds, double lambda,double z) { /* double tau= PI/(12*60*60) // 12 Zeit-Stunden entsprechen Pi=180 Grad *( 60*60*d_UTCHours // Greenwich-Zeit (für lamda=0) +60*( d_UTCMinutes +4*b2g(lambda) // 1 Grad entspricht 4 Zeitminuten +z // Zeitgleichung in Minuten ) +d_UTCSeconds ) -PI; // 12 Uhr entspricht 0 Grad */ double tau=PI/(12.0*60.0*60.0)*(60.0*60.0*d_UTCHours+60.0*(d_UTCMinutes+4.0*b2g(lambda)+z)+d_UTCSeconds)-PI; if (tau<0) { tau=tau+2.0*PI; } return(tau); }
//-------------------------------------------------- // Berechnung des Sonnen-Azimuts (im Bogenmaß) aus geogr. Breite phi, // Deklination delta und Stundenwinkel tau // Zenkert S. 67 //-------------------------------------------------- double Azimut( double phi, double delta, double tau){ double k, r; if (cos(tau)>=(tan(delta)/tan(phi))){ k=0; } else { k=1.0; } r=k*PI+atan(sin(tau)/(sin(phi)*cos(tau)-cos(phi)*tan(delta))); if (r>PI){r=r-2.0*PI;} return(r); }
//-------------------------------------------------- // Berechnung der Sonnen-Höhe (im Bogenmaß) aus geogr. Breite phi, // Deklination delta und Stundenwinkel tau // Zenkert S. 67 //-------------------------------------------------- double Hoehe (double phi, double delta, double tau){ return(asin(sin(phi)*sin(delta)+cos(phi)*cos(delta)*cos(tau))); }
//--------------------------------------------------
int main(int argc, char *argv[]) { double lambda_b = 0.0; double lambda_g = 0.0; int d = 1; // 1. int m = 1; // Januar double deklination = 0.0; double zeitgl=0.0; double d_UTCHours = 0.0; double d_UTCMinutes = 0.0; double d_UTCSeconds = 0.0; double d2sw = 0.0; double lambda = 0.0; double z = 0.0; double phi = 0.0; double delta = 0.0; double tau = 0.0; double azimut=0.0; double hoehe=0.0; puts("Teste b2g:"); puts("----------"); printf("lambda im Bogenmass [rad] eingeben:"); scanf("%lf", &lambda_b); lambda_g = b2g(lambda_b); printf("b2g( %g rad ) => %g Grad\n\n", lambda_b, lambda_g); puts("Teste Deklination(d, m):"); puts("------------------------"); puts("d,m =aktuelles Datum (3.Mai => d=3, m=5)"); printf("d eingeben:"); scanf("%d", &d); printf("m eingeben:"); scanf("%d", &m); deklination = Deklination(d,m); printf("Deklination( d=%d, m=%d ) => %g\n\n", d, m, deklination); puts("Teste Zeitgleichung (d, m):"); puts("---------------------------"); puts("d,m =aktuelles Datum (3.Mai => d=3, m=5)"); printf("d eingeben:"); scanf("%d", &d); printf("m eingeben:"); scanf("%d", &m); zeitgl = Zeitgleichung(d,m); printf("Zeitgleichung( d=%d, m=%d ) => %g\n\n", d, m, zeitgl); puts("Teste double Date2Stundenwinkel ("); puts(" int d_UTCHours, => aktuelle Greenwich-Zeit (UTC) Stunden"); puts(" int d_UTCMinutes, => aktuelle Greenwich-Zeit (UTC) Minuten"); puts(" int d_UTCSeconds, => aktuelle Greenwich-Zeit (UTC) Sekunden"); puts(" double lambda, => lambda im Bogenmass"); puts(" double z) => Zeitgleichung" ); puts("---------------------------------------------------------------"); printf("d_UTCHours eingeben:"); scanf("%lf", &d_UTCHours); printf("d_UTCMinutes eingeben:"); scanf("%lf", &d_UTCMinutes); printf("d_UTCSeconds eingeben:"); scanf("%lf", &d_UTCSeconds); printf("lambda eingeben:"); scanf("%lf", &lambda); printf("z eingeben:"); scanf("%lf", &z); d2sw = Date2Stundenwinkel(d_UTCHours, d_UTCMinutes, d_UTCSeconds, lambda, z); printf("Date2Stundenwinkel(\n"); printf(" d_UTCHours = %g\n", d_UTCHours); printf(" m_UTCHours = %g\n", d_UTCMinutes); printf(" s_UTCHours = %g\n", d_UTCSeconds); printf(" lambda = %g\n", lambda); printf(" z = %g\n", z); printf(" => %g\n\n", d2sw); puts("Teste Azimut( phi, delta, tau):"); puts("Teste Hoehe( phi, delta, tau):"); puts("-------------------------------"); printf("phi eingeben:"); scanf("%lf", &phi); printf("delta eingeben:"); scanf("%lf", &delta); printf("tau eingeben:"); scanf("%lf", &tau); azimut = Azimut( phi, delta, tau); hoehe = Hoehe( phi, delta, tau); printf("Azimut( phi=%g, delta=%g, tau=%g) => %g\n", phi, delta, tau, azimut); printf(" Hoehe( phi=%g, delta=%g, tau=%g) => %g\n\n", phi, delta, tau, hoehe); system("PAUSE"); return 0; }
|
mod edit: BENUTZE DIE CPP TAGS SELBER Dieser Post wurde am 12.05.2006 um 23:12 Uhr von Pablo editiert. |