kopia lustrzana https://github.com/peterhinch/micropython-samples
sun_moon_test.py: Add precomputed expected results.
rodzic
8281a9cbda
commit
d3790626c4
|
@ -9,7 +9,7 @@
|
||||||
# https://github.com/orgs/micropython/discussions/13075
|
# https://github.com/orgs/micropython/discussions/13075
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from math import sin, cos, sqrt, fabs, atan, radians, floor
|
from math import sin, cos, sqrt, fabs, atan, radians, floor, pi
|
||||||
|
|
||||||
LAT = 53.29756504536339 # Local defaults
|
LAT = 53.29756504536339 # Local defaults
|
||||||
LONG = -2.102811634540558
|
LONG = -2.102811634540558
|
||||||
|
@ -64,7 +64,8 @@ def quad(ym, yz, yp):
|
||||||
nz += 1
|
nz += 1
|
||||||
if z1 < -1.0:
|
if z1 < -1.0:
|
||||||
z1 = z2
|
z1 = z2
|
||||||
return nz, z1, z2, ye
|
return nz, z1, z2, ye
|
||||||
|
return 0, 0, 0, 0 # No roots
|
||||||
|
|
||||||
|
|
||||||
# **** GET MODIFIED JULIAN DATE FOR DAY RELATIVE TO TODAY ****
|
# **** GET MODIFIED JULIAN DATE FOR DAY RELATIVE TO TODAY ****
|
||||||
|
@ -116,20 +117,19 @@ def minisun(t):
|
||||||
# in decimal hours, degs referred to the equinox of date and using
|
# in decimal hours, degs referred to the equinox of date and using
|
||||||
# obliquity of the ecliptic at J2000.0 (small error for +- 100 yrs)
|
# obliquity of the ecliptic at J2000.0 (small error for +- 100 yrs)
|
||||||
# takes t centuries since J2000.0. Claimed good to 1 arcmin
|
# takes t centuries since J2000.0. Claimed good to 1 arcmin
|
||||||
p2 = 6.283185307
|
coseps = 0.9174805004
|
||||||
coseps = 0.91748
|
sineps = 0.397780757938
|
||||||
sineps = 0.39778
|
|
||||||
|
|
||||||
m = p2 * frac(0.993133 + 99.997361 * t)
|
m = 2 * pi * frac(0.993133 + 99.997361 * t)
|
||||||
dl = 6893.0 * sin(m) + 72.0 * sin(2 * m)
|
dl = 6893.0 * sin(m) + 72.0 * sin(2 * m)
|
||||||
l = p2 * frac(0.7859453 + m / p2 + (6191.2 * t + dl) / 1296000)
|
l = 2 * pi * frac(0.7859453 + m / (2 * pi) + (6191.2 * t + dl) / 1296000)
|
||||||
sl = sin(l)
|
sl = sin(l)
|
||||||
x = cos(l)
|
x = cos(l)
|
||||||
y = coseps * sl
|
y = coseps * sl
|
||||||
z = sineps * sl
|
z = sineps * sl
|
||||||
rho = sqrt(1 - z * z)
|
rho = sqrt(1 - z * z)
|
||||||
# dec = (360.0 / p2) * atan(z / rho)
|
# dec = (360.0 / 2 * pi) * atan(z / rho)
|
||||||
ra = (48.0 / p2) * atan(y / (x + rho)) % 24
|
ra = ((48.0 / (2 * pi)) * atan(y / (x + rho))) % 24
|
||||||
return z, rho, ra
|
return z, rho, ra
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,17 +137,15 @@ def minimoon(t):
|
||||||
# takes t and returns the geocentric ra and dec
|
# takes t and returns the geocentric ra and dec
|
||||||
# claimed good to 5' (angle) in ra and 1' in dec
|
# claimed good to 5' (angle) in ra and 1' in dec
|
||||||
# tallies with another approximate method and with ICE for a couple of dates
|
# tallies with another approximate method and with ICE for a couple of dates
|
||||||
|
|
||||||
p2 = 6.283185307
|
|
||||||
arc = 206264.8062
|
arc = 206264.8062
|
||||||
coseps = 0.91748
|
coseps = 0.9174805004
|
||||||
sineps = 0.39778
|
sineps = 0.397780757938
|
||||||
|
|
||||||
l0 = frac(0.606433 + 1336.855225 * t) # mean longitude of moon
|
l0 = frac(0.606433 + 1336.855225 * t) # mean longitude of moon
|
||||||
l = p2 * frac(0.374897 + 1325.552410 * t) # mean anomaly of Moon
|
l = 2 * pi * frac(0.374897 + 1325.552410 * t) # mean anomaly of Moon
|
||||||
ls = p2 * frac(0.993133 + 99.997361 * t) # mean anomaly of Sun
|
ls = 2 * pi * frac(0.993133 + 99.997361 * t) # mean anomaly of Sun
|
||||||
d = p2 * frac(0.827361 + 1236.853086 * t) # difference in longitude of moon and sun
|
d = 2 * pi * frac(0.827361 + 1236.853086 * t) # difference in longitude of moon and sun
|
||||||
f = p2 * frac(0.259086 + 1342.227825 * t) # mean argument of latitude
|
f = 2 * pi * frac(0.259086 + 1342.227825 * t) # mean argument of latitude
|
||||||
|
|
||||||
# corrections to mean longitude in arcsec
|
# corrections to mean longitude in arcsec
|
||||||
dl = 22640 * sin(l)
|
dl = 22640 * sin(l)
|
||||||
|
@ -177,19 +175,19 @@ def minimoon(t):
|
||||||
n += +21 * sin(-l + f)
|
n += +21 * sin(-l + f)
|
||||||
|
|
||||||
# ecliptic long and lat of Moon in rads
|
# ecliptic long and lat of Moon in rads
|
||||||
l_moon = p2 * frac(l0 + dl / 1296000)
|
l_moon = 2 * pi * frac(l0 + dl / 1296000)
|
||||||
b_moon = (18520.0 * sin(s) + n) / arc
|
b_moon = (18520.0 * sin(s) + n) / arc
|
||||||
|
|
||||||
# equatorial coord conversion - note fixed obliquity
|
# equatorial coord conversion - note fixed obliquity
|
||||||
cb = cos(b_moon)
|
cb = cos(b_moon)
|
||||||
x = cb * cos(l_moon)
|
x = cb * cos(l_moon)
|
||||||
v = cb * sin(l_moon)
|
v = cb * sin(l_moon)
|
||||||
W = sin(b_moon)
|
w = sin(b_moon)
|
||||||
y = coseps * v - sineps * W
|
y = coseps * v - sineps * w
|
||||||
z = sineps * v + coseps * W
|
z = sineps * v + coseps * w
|
||||||
rho = sqrt(1.0 - z * z)
|
rho = sqrt(1.0 - z * z)
|
||||||
# dec = (360.0 / p2) * atan(z / rho)
|
# dec = (360.0 / 2 * pi) * atan(z / rho)
|
||||||
ra = (48.0 / p2) * atan(y / (x + rho)) % 24
|
ra = ((48.0 / (2 * pi)) * atan(y / (x + rho))) % 24
|
||||||
return z, rho, ra
|
return z, rho, ra
|
||||||
|
|
||||||
|
|
||||||
|
@ -207,8 +205,6 @@ class RiSet:
|
||||||
|
|
||||||
# ***** API start *****
|
# ***** API start *****
|
||||||
# Examine Julian dates either side of current one to cope with localtime.
|
# Examine Julian dates either side of current one to cope with localtime.
|
||||||
# TODO: Allow localtime offset to be varied at runtime for DST.
|
|
||||||
# TODO: relative=True arg for set_day. Allows entering absolute dates e.g. for testing.
|
|
||||||
def set_day(self, day: int = 0):
|
def set_day(self, day: int = 0):
|
||||||
mjd = get_mjd(day)
|
mjd = get_mjd(day)
|
||||||
if self.mjd is None or self.mjd != mjd:
|
if self.mjd is None or self.mjd != mjd:
|
||||||
|
|
|
@ -1,12 +1,25 @@
|
||||||
# sun_moon_test.py
|
# sun_moon_test.py Test script for sun_moon.py
|
||||||
|
|
||||||
|
# Copyright (c) Peter Hinch 2023
|
||||||
|
# Released under the MIT license (see LICENSE)
|
||||||
|
|
||||||
from .sun_moon import RiSet, abs_to_rel_days
|
# On mip-installed host:
|
||||||
|
# import sched.sun_moon_test
|
||||||
|
# On PC in astronomy directory:
|
||||||
|
# import sun_moon_test
|
||||||
|
|
||||||
|
try:
|
||||||
|
from .sun_moon import RiSet, abs_to_rel_days
|
||||||
|
except ImportError: # Running on PC in astronomy directory
|
||||||
|
from sun_moon import RiSet, abs_to_rel_days
|
||||||
|
|
||||||
|
nresults = [] # Times in seconds from local midnight
|
||||||
|
|
||||||
|
|
||||||
def show(rs):
|
def show(rs):
|
||||||
print(f"Sun rise {rs.sunrise(3)} set {rs.sunset(3)}")
|
print(f"Sun rise {rs.sunrise(3)} set {rs.sunset(3)}")
|
||||||
print(f"Moon rise {rs.moonrise(3)} set {rs.moonset(3)}")
|
print(f"Moon rise {rs.moonrise(3)} set {rs.moonset(3)}")
|
||||||
|
nresults.extend([rs.sunrise(), rs.sunset(), rs.moonrise(), rs.moonset()])
|
||||||
|
|
||||||
|
|
||||||
print("4th Dec 2023: Seattle UTC-8")
|
print("4th Dec 2023: Seattle UTC-8")
|
||||||
|
@ -28,6 +41,55 @@ for day in range(7):
|
||||||
print(f"Day: {day}")
|
print(f"Day: {day}")
|
||||||
show(rs)
|
show(rs)
|
||||||
|
|
||||||
|
# Expected results as computed on Unix build (64-bit FPU)
|
||||||
|
exp = [
|
||||||
|
27628,
|
||||||
|
58714,
|
||||||
|
85091,
|
||||||
|
46417,
|
||||||
|
20212,
|
||||||
|
71598,
|
||||||
|
2747,
|
||||||
|
41257,
|
||||||
|
29049,
|
||||||
|
57158,
|
||||||
|
82965,
|
||||||
|
46892,
|
||||||
|
29130,
|
||||||
|
57126,
|
||||||
|
None,
|
||||||
|
47460,
|
||||||
|
29209,
|
||||||
|
57097,
|
||||||
|
892,
|
||||||
|
47958,
|
||||||
|
29285,
|
||||||
|
57072,
|
||||||
|
5244,
|
||||||
|
48441,
|
||||||
|
29359,
|
||||||
|
57051,
|
||||||
|
9625,
|
||||||
|
48960,
|
||||||
|
29430,
|
||||||
|
57033,
|
||||||
|
14228,
|
||||||
|
49577,
|
||||||
|
29499,
|
||||||
|
57019,
|
||||||
|
19082,
|
||||||
|
50384,
|
||||||
|
]
|
||||||
|
print()
|
||||||
|
max_error = 0
|
||||||
|
for act, requirement in zip(nresults, exp):
|
||||||
|
if act is not None and requirement is not None:
|
||||||
|
err = abs(requirement - act)
|
||||||
|
max_error = max(max_error, err)
|
||||||
|
if err > 30:
|
||||||
|
print(f"Error {requirement - act}")
|
||||||
|
print(f"Maximum error {max_error}. Expect 0 on 64-bit platform, 30s on 32-bit")
|
||||||
|
|
||||||
# Times from timeanddate.com
|
# Times from timeanddate.com
|
||||||
# Seattle
|
# Seattle
|
||||||
# Sunrise 7:40 sunset 16:18 Moonrise 23:37 Moonset 12:53
|
# Sunrise 7:40 sunset 16:18 Moonrise 23:37 Moonset 12:53
|
||||||
|
|
Ładowanie…
Reference in New Issue