/** * Finds the accurate time of a solstice or equinox using the complete VSOP87 * theory * * @param int $year The year to find a solstice or equinox for * @param array $terms An array of the mean terms for the desired equinox or * solstice * @param int $month The month of the equinox or solstice to find * * @return float The JD of the solstice or equinox in TD */ private static function accurate($year, array $terms, $month) { $Y = $year < 1000 ? (int) $year / 1000 : ((int) $year - 2000) / 1000; $q = intval($month / 3) - 1; $jde0 = static::Horner($Y, $terms); for ($i = 0; $i < 100; $i++) { // TODO:: use vsop 87, but use IAU apparent stuff? $λ = Solar::ApparentEclVSOP87(AstroDate::fromJD($jde0))->λ->rad; $Δ = 58 * sin(deg2rad($q * 90) - $λ); $jde0 += $Δ; if (abs($Δ) < 5.0E-7) { break; } } return $jde0; }