bonjour a tous,je travail actuellement sur un petit programme arduino (mega2560)
et je suis confronter a un soucis de calcul pour calculer les heure de lever coucher de lune avec dst et localisation.(en faite je me suis perdu dans le code).
je crois que j'ai louper quelque chose mais je vois pas où car j'ai un retour obligatoire en nan alors que normalement je devrai avoir un résultat(en plus j'ai perdu mon livre de jean Meeus pour comparer les résultats)
// Fonction pour calculer la date julienne correspondant à une date donnée
double julian_Date(int annee, int mois, int jour)
{
bool estGregorien = annee >= 1583;
int a = annee / 100;
int b = estGregorien ? 2 - a + a / 4 : 0;
double c = estGregorien ? 365.25 * annee : 365 * annee + 0.25;
double d = 30.6000 * (mois + 1);
double jd = b + c + d + jour + 1720994.5;
return jd;
}
le calcul de JD est correcte en résultat ,car vérifié sur d'autre site.
voici la fonction du code incriminé.
// Fonction pour calculer le lever et le coucher de la lune pour une date et une position données
void moon_rise_set(int year, int month, int day, int dst_offset, double lon, double lat, double *rise_time, double *set_time)
{
const static double DR = PI / 180; // Conversion degrés -> radians
const static double K1 = 15 * PI * 1.0027379 / 180; // Constante pour le calcul du lever/coucher de la Lune
// Calcul de la date julienne pour la date donnée
double jd = julian_Date(year, month, day);
// Calcul de la date julienne à midi heure locale en prenant en compte l'heure d'été et la longitude
double jd0 = floor(jd) - 0.5 + 0.5 * dst_offset / 3600.0 - lon / 360.0;
// Calcul du temps en siècles depuis J2000
double t0 = (jd0 - 2451545.0) / 36525.0;
// Calcul de différentes variables astronomiques pour la lune
double m0 = fmod(358.47583 + 35999.04975 * t0, 360.0) * DR; // Moyenne anomalie de la lune
double m1 = fmod(296.1046 + 385.8169 * t0 + 0.01043 * t0 * t0, 360.0) * DR; // Anomalie corrigée de la lune
double f = fmod(21.2964 + 390.6705 * t0 - 0.0016 * t0 * t0, 360.0) * DR; // Argument de la latitude de la lune
double d = fmod(350.737486 + 445267.1142 * t0 - 0.001436 * t0 * t0, 360.0) * DR; // Distance moyenne de la lune
double omega = fmod(259.183275 - 1934.1420 * t0 + 0.002078 * t0 * t0, 360.0) * DR; // Longitude ascendante du noeud ascendant de la lune
// Calcul de la longitude de la lune
double l = m0 + m1 * sin(m0) + f * sin(d) + 0.0021 * sin(d - m0) - 0.0018 * sin(d + m0) + omega * sin(d); // Longitude de la lune
// Calcul de la latitude de la lune
double obliquity = 23.439281 * DR; // Obliquité de l'écliptique
double moon_lat = atan2(sin(obliquity) * sin(l), cos(l)); // Latitude de la lune
// Calcul de la déclinaison de la lune
double moon_dec = asin(sin(moon_lat) * cos(obliquity) + cos(moon_lat) * sin(obliquity) * sin(l)); // Déclinaison de la lune
// Calcul du temps sidéral local à midi heure locale
double lst = 100.46 + 0.985647 * jd0 + lon + 15.0 * dst_offset / 3600.0;
// Calcul de l'angle horaire de la lune
double ha = lst - l;
// Calcul de l'altitude de la lune au moment du lever/coucher
double moon_alt = asin(sin(moon_lat) * sin(lat * DR) + cos(moon_lat) * cos(lat * DR) * cos(ha * DR));
// Calcul du cosinus de l'angle horaire pour le calcul du lever/coucher de la lune
double cosh = (sin(-0.5667 * DR) - sin(lat * DR) * sin(moon_dec)) / (cos(lat * DR) * cos(moon_dec));
// Vérifie si le cosinus de l'angle horaire est valide
if (cosh >= -1.0 && cosh <= 1.0)
{
// Calcul de l'heure de lever de la lune
double moon_rise = lst - (180.0 / 15.0) * (moon_alt / DR) / 15.0;
// Calcul de l'heure de coucher de la lune
double moon_set = lst + (180.0 / 15.0) * (-moon_alt / DR) / 15.0;
// Correction pour prendre en compte la date locale
moon_rise += 24.0 * (moon_rise < 0);
moon_set += 24.0 * (moon_set < 0);
// Affectation des valeurs de temps local de lever/coucher de la lune aux pointeurs passés en paramètres
*rise_time = moon_rise;
*set_time = moon_set;
// Vérifie si la lune ne se lève pas
if (isnan(*rise_time))
{
printf("La lune ne se lève pas ce jour là.\n");
}
// Vérifie si la lune ne se couche pas
if (isnan(*set_time))
{
printf("La lune ne se couche pas ce jour là.\n");
}
}
else
{
// Si le cosinus de l'angle horaire n'est pas valide, la lune ne se lève pas ou ne se couche pas
printf("La lune ne se lève pas ou ne se couche pas ce jour là.\n");
*rise_time = NAN;
*set_time = NAN;
}
// Calcul de différentes variables pour le calcul de l'azimut de la lune
double x = cos(ha);
double y = sin(ha);
double z = sin(lat * DR);
double p = y * z + cos(lat * DR) * x;
double q = sqrt(pow(x, 2) + pow(y, 2));
double r = atan2(z * q, p) / DR;
// Calcul de l'azimut de la lune
double h1 = 360.0 - r;
double h2 = r;
// Calcul de l'altitude de la lune au moment du lever/coucher
if (fabs(cosh) <= 1.0)
{
moon_alt = asin(sin(moon_lat) * sin(lat * DR) + cos(moon_lat) * cos(lat * DR) * cos(ha * DR));
}
else
{
// Si le cosinus de l'angle horaire est invalide, la lune ne se lève/couche pas ce jour-là
*rise_time = NAN;
*set_time = NAN;
return;
}
// Calcul de l'angle horaire pour le lever et le coucher de la lune
double h0 = fabs(moon_alt) + 0.7275 * (moon_alt - 0.53 * PI / 180); // Correction de la hauteur de l'
// Calcul du temps universel de lever/coucher de la lune
double ut_rise = (r - h0 + 360) / 15.0; // Temps universel de lever de la lune
double ut_set = (r + h0 + 360) / 15.0; // Temps universel de coucher de la lune
// Calcul du temps local de lever/coucher de la lune à partir du temps universel
double ta = ut_rise + K1 * sin(m0 - l) - 0.014 * sin(2 * m0 - l);
double tb = ut_set + K1 * sin(m0 - l) - 0.014 * sin(2 * m0 - l);
// Affectation des valeurs de temps local de lever/coucher de la lune aux pointeurs passés en paramètres
// Conversion en degrés à partir de l'heure locale
*rise_time = (ta - lon - 12.0 - dst_offset / 15.0) * 15.0;
*set_time = (tb - lon - 12.0 - dst_offset / 15.0) * 15.0;
// Vérifie si les angles horaires sont valides
if (h1 < 0.0)
{
h1 += 360.0;
}
if (h2 > 360.0)
{
h2 -= 360.0;
}
// Vérifie si la lune est visible toute la nuit
if (h1 > h2)
{
Moonrise = true;
Moonset = true;
}
else
{
// Vérifie si la lune est visible avant minuit ou après minuit
if (l < h1)
{
*rise_time += 24.0;
*set_time += 24.0;
}
if (l > h2)
{
*rise_time += 24.0;
*set_time += 24.0;
}
// Vérifie si la lune est visible toute la nuit
if (l < h1 || l > h2)
{
Moonrise = true;
Moonset = true;
}
else
{ // La lune est visible, mais pas toute la nuit
Moonrise = false;
Moonset = false;
}
}
}