Aller au contenu

Messages recommandés

Posté (modifié)

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;
    }
  }
}


 

Modifié par australopitheque

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.