Как рассчитать азимут солнца на основе зенита, часового угла, склонения и широты?

Википедия приводит эту формулу для расчета солнечного азимута:

уравнение для солнечного азимута

Где:

  • ф с угол солнечного азимута
  • θ с зенитный угол Солнца
  • час часовой угол по местному солнечному времени
  • дельта текущее склонение солнца
  • Φ это местная широта

Я реализую это уравнение в JavaScript, но оно не кажется правильным. Может ли кто-нибудь здесь помочь мне подтвердить, правильно ли это уравнение?

Вот моя реализация JS. Единственная странность в конце: ограничение домена acos до [-1, 1], чтобы предотвратить значения NaN.

const getSolarAzimuth = function(
    zenithAngle, hourAngle, declination, latitude
) {
    const cos = Math.cos;
    const sin = Math.sin;

    const cos_phi = (
        sin(declination) * cos(latitude) - cos(hourAngle) * cos(declination) *
            sin(latitude)) /
          sin(zenithAngle);

    return Math.acos(Math.min(Math.max(cos_phi, -1), 1));
};
Используете ли вы градусы или часы для аргументов синусов и косинусов? Они будут работать только с радианами...
Я использую радианы для всего здесь.
Эта формула должна быть получена прямо из формул сферической тригонометрии, вы пытались найти это в Google и попытаться вывести уравнение самостоятельно?

Ответы (1)

Я подтвердил, что эта формула действительно верна. У меня были неправильные единицы в коде, которые предложил @Glorfindel: часовой угол солнца был в часах, а не в радианах.

Мне нужно было настроить смещение угла азимута на основе часового угла:

     // The angle offset needs to be adjusted based on whether the hour angle                                                    
     // is in the morning or the evening.                                                                                        
     //   https://en.wikipedia.org/wiki/Solar_azimuth_angle#Formulas                                                             
     if (hourAngle < 0 || hourAngle > Math.PI) {
         return az;
     }

     return (Math.PI * 2) - az;