equationoftime 4.1.1 → 4.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.autotest +39 -0
- data/.gemtest +0 -0
- data/.minitest.rb +2 -0
- data/.ruby-version +1 -0
- data/.settings/org.eclipse.ltk.core.refactoring.prefs +2 -0
- data/CHANGELOG.rdoc +6 -0
- data/Gemfile +12 -0
- data/Gemfile.lock +44 -3
- data/Guardfile +29 -0
- data/{LICENSE.md → LICENSE.rdoc} +0 -0
- data/Manifest.txt +82 -0
- data/README.rdoc +66 -0
- data/Rakefile +60 -45
- data/equationoftime.gemspec +17 -9
- data/examples/Equation_of_Time.jpg +0 -0
- data/examples/analemma_data_generator.rb +58 -0
- data/examples/check_date_type.rb +60 -0
- data/examples/compare_geoc_long_ra.rb +44 -0
- data/examples/data_table_for_astro_dog.rb +45 -0
- data/examples/earth_rotation.rb +42 -0
- data/examples/eot_methods_list.rb +48 -0
- data/examples/eot_plot.r +57 -0
- data/examples/eot_suntimes.rb +149 -0
- data/examples/equation_of_time.py +186 -0
- data/examples/figure_1.jpg +0 -0
- data/examples/file_converter.rb +31 -0
- data/examples/from_readme.rb +14 -0
- data/examples/from_wiki.rb +46 -0
- data/examples/geo_locator.rb +16 -0
- data/examples/getjd.rb +45 -0
- data/examples/gmst_gast_non_sofa.rb +406 -0
- data/examples/input_suntimes.rb +24 -0
- data/examples/julian_day_formula.rb +29 -0
- data/examples/julian_day_formula.txt +12 -0
- data/examples/my_time_conversion.rb +21 -0
- data/examples/nutation_series.txt +678 -0
- data/examples/nutation_table5_3a.txt +682 -0
- data/examples/ptime.rb +162 -0
- data/examples/suntimes.rb +30 -0
- data/examples/suntimes_test.rb +50 -0
- data/examples/t_sofa.rb +8228 -0
- data/examples/test_celes.rb +51 -0
- data/examples/test_ceot.rb +55 -0
- data/examples/test_poly_eval.rb +32 -0
- data/examples/time_scales.rb +29 -0
- data/examples/times_year.rb +53 -0
- data/examples/usage_example.rb +26 -0
- data/examples/use_angles.rb +222 -0
- data/ext/{ceot/eot.c → eot/ceot.c} +1 -1
- data/ext/{ceot/eot.h → eot/ceot.h} +0 -0
- data/ext/{ceot/ceot.c → eot/eot.c} +2 -2
- data/ext/{ceot → eot}/extconf.rb +1 -1
- data/lib/eot.rb +2 -1
- data/lib/eot/angles.rb +28 -28
- data/lib/eot/constants.rb +2 -0
- data/lib/eot/displays.rb +17 -17
- data/lib/eot/eot.so +0 -0
- data/lib/eot/geo_lat_lng_smt.rb +44 -31
- data/lib/eot/init.rb +20 -19
- data/lib/eot/nutation.rb +1 -1
- data/lib/eot/times.rb +22 -22
- data/lib/eot/utilities.rb +5 -5
- data/lib/eot/version.rb +2 -6
- data/test/aliased_angles_spec.rb +239 -0
- data/test/aliased_displays_spec.rb +105 -0
- data/test/aliased_utilities_spec.rb +36 -0
- data/test/angles_spec.rb +264 -0
- data/test/constants_spec.rb +20 -0
- data/test/displays_spec.rb +110 -0
- data/test/geo_spec.rb +38 -0
- data/test/init_spec.rb +44 -0
- data/test/nutation_spec.rb +37 -0
- data/test/spec_config.rb +8 -0
- data/test/times_spec.rb +133 -0
- data/test/utilities_spec.rb +35 -0
- metadata +109 -115
- data/.gitignore +0 -24
- data/.rvmrc +0 -1
- data/README.md +0 -83
- data/README2.txt +0 -70
- data/wiki.md +0 -43
- data/wiki2.md +0 -4
@@ -0,0 +1,186 @@
|
|
1
|
+
#!/usr/bin/env python
|
2
|
+
"""
|
3
|
+
https://bitbucket.org/cmcqueen1975/sundials/src/26a0f54a7c18?at=default
|
4
|
+
Calculation of "equation of time".
|
5
|
+
|
6
|
+
References:
|
7
|
+
http://en.wikipedia.org/wiki/Equation_of_time
|
8
|
+
http://www.sundials.co.uk/equation.htm
|
9
|
+
|
10
|
+
Calculations have been done according to the Wikipedia reference.
|
11
|
+
|
12
|
+
Dependencies:
|
13
|
+
- Python 2.x
|
14
|
+
- NumPy
|
15
|
+
- SciPy (only strictly needed for the more accurate calculation)
|
16
|
+
- matplotlib to plot the graph
|
17
|
+
"""
|
18
|
+
|
19
|
+
import datetime
|
20
|
+
from collections import namedtuple
|
21
|
+
|
22
|
+
import numpy as np
|
23
|
+
import scipy # only strictly needed for the more accurate calculation in equation_of_time_accurate()
|
24
|
+
import scipy.optimize
|
25
|
+
|
26
|
+
# Named tuple to hold geographic location
|
27
|
+
Location = namedtuple('Location', 'latitude, longitude')
|
28
|
+
|
29
|
+
|
30
|
+
# If a location is given, a longitude correction is calculated and included in the graph.
|
31
|
+
# If the sundial itself includes the longitude correction, just use the 0 value here.
|
32
|
+
LOCATION = Location(0, 0)
|
33
|
+
#LOCATION = Location(51.3809, -2.3603) # Bath, England
|
34
|
+
#LOCATION = Location(35.10, 138.86) # Numazu, Japan
|
35
|
+
#LOCATION = Location(-37.81, 144.96) # Melbourne, Victoria, Australia
|
36
|
+
|
37
|
+
|
38
|
+
DAYS_PER_TROPICAL_YEAR = 365.242
|
39
|
+
SUN_ECCENTRICITY = 0.01671
|
40
|
+
|
41
|
+
# The angle from the vernal equinox to the periapsis in the plane of the ecliptic.
|
42
|
+
SUN_ANGLE_OFFSET = 4.9358
|
43
|
+
|
44
|
+
# Angle of tilt of earth's axis--about 23.44 degrees
|
45
|
+
SUN_OBLIQUITY = 0.40910
|
46
|
+
|
47
|
+
|
48
|
+
# Date range for drawing a graph.
|
49
|
+
DATE_START = datetime.date(2009, 1, 1)
|
50
|
+
DATE_END = datetime.date(2010, 1, 1)
|
51
|
+
# Periapsis occurs on a slightly different date each year--varying by a couple
|
52
|
+
# of days. 4th of January is about the average.
|
53
|
+
DATE_PERIAPSIS = datetime.date(2009, 1, 4)
|
54
|
+
|
55
|
+
|
56
|
+
def longitude_offset(location):
|
57
|
+
"""Given a location, return the offset due to longitude, in degrees
|
58
|
+
Location's longitude is used. Latitude isn't needed.
|
59
|
+
"""
|
60
|
+
longitude = location.longitude
|
61
|
+
longitude_per_hour = (360. / 24)
|
62
|
+
longitude_offset = longitude % longitude_per_hour
|
63
|
+
if longitude_offset > longitude_per_hour / 2:
|
64
|
+
longitude_offset -= longitude_per_hour
|
65
|
+
return longitude_offset
|
66
|
+
|
67
|
+
|
68
|
+
def longitude_offset_min(location):
|
69
|
+
minute_per_longitude = 24 * 60 / 360.
|
70
|
+
return longitude_offset(location) * minute_per_longitude
|
71
|
+
|
72
|
+
|
73
|
+
def mean_anomaly(day_number_n):
|
74
|
+
"""day_number_n is the number of days from periapsis."""
|
75
|
+
return day_number_n * (2 * np.pi / DAYS_PER_TROPICAL_YEAR)
|
76
|
+
|
77
|
+
|
78
|
+
@np.vectorize
|
79
|
+
def eccentric_anomaly(mean_anomaly_value):
|
80
|
+
local_sun_eccentricity = SUN_ECCENTRICITY
|
81
|
+
|
82
|
+
def eccentric_anomaly_function(eccentric_anomaly_value):
|
83
|
+
return eccentric_anomaly_value - local_sun_eccentricity * np.sin(eccentric_anomaly_value) - mean_anomaly_value
|
84
|
+
|
85
|
+
# eccentric_anomaly_value = scipy.optimize.brentq(eccentric_anomaly_function, 0 - 0.0001, 2 * np.pi + 0.0001)
|
86
|
+
eccentric_anomaly_value = scipy.optimize.fsolve(eccentric_anomaly_function, mean_anomaly_value)
|
87
|
+
return eccentric_anomaly_value
|
88
|
+
|
89
|
+
|
90
|
+
def true_anomaly(eccentric_anomaly_value):
|
91
|
+
local_sun_eccentricity = SUN_ECCENTRICITY
|
92
|
+
|
93
|
+
half_eccentric_anomaly = eccentric_anomaly_value / 2
|
94
|
+
a_x = np.cos(half_eccentric_anomaly)
|
95
|
+
a_y = np.sin(half_eccentric_anomaly)
|
96
|
+
a_y *= np.sqrt((1 + local_sun_eccentricity) / (1 - local_sun_eccentricity))
|
97
|
+
return 2 * np.arctan2(a_y, a_x)
|
98
|
+
|
99
|
+
|
100
|
+
def right_ascension(sun_angle):
|
101
|
+
"""sun_angle is the angle from the vernal equinox to the Sun in the plane of the ecliptic.
|
102
|
+
It is the true_anomaly value plus the SUN_ANGLE_OFFSET."""
|
103
|
+
a_x = np.cos(sun_angle)
|
104
|
+
a_y = np.sin(sun_angle)
|
105
|
+
return np.arctan2(a_y * np.cos(SUN_OBLIQUITY), a_x)
|
106
|
+
|
107
|
+
|
108
|
+
def equation_of_time_accurate(day_number_n):
|
109
|
+
"""Calculate the equation of time (in min), given a day number.
|
110
|
+
|
111
|
+
day_number_n is the number of days from periapsis.
|
112
|
+
Returns the difference between solar time and clock time, in minutes.
|
113
|
+
This uses a more accurate calculation.
|
114
|
+
"""
|
115
|
+
mean_anomaly_value = mean_anomaly(day_number_n)
|
116
|
+
eccentric_anomaly_value = eccentric_anomaly(mean_anomaly_value)
|
117
|
+
true_anomaly_value = true_anomaly(eccentric_anomaly_value)
|
118
|
+
right_ascension_value = right_ascension(true_anomaly_value + SUN_ANGLE_OFFSET)
|
119
|
+
eot = mean_anomaly_value + SUN_ANGLE_OFFSET - right_ascension_value
|
120
|
+
# Get the angles into the range we want--that is, -pi to +pi
|
121
|
+
eot = (eot + np.pi) % (2 * np.pi) - np.pi
|
122
|
+
return eot * (24 * 60 / 2 / np.pi)
|
123
|
+
|
124
|
+
|
125
|
+
def equation_of_time_simple(day_number_n):
|
126
|
+
"""Calculate the equation of time (in min), given a day number.
|
127
|
+
|
128
|
+
day_number_n is the number of days from periapsis.
|
129
|
+
Returns the difference between solar time and clock time, in minutes.
|
130
|
+
This uses a simple, approximate calculation.
|
131
|
+
"""
|
132
|
+
mean_anomaly_value = mean_anomaly(day_number_n)
|
133
|
+
return -7.655 * np.sin(mean_anomaly_value) + 9.873 * np.sin(2 * mean_anomaly_value + 3.588)
|
134
|
+
|
135
|
+
|
136
|
+
#equation_of_time = equation_of_time_simple
|
137
|
+
equation_of_time = equation_of_time_accurate
|
138
|
+
|
139
|
+
|
140
|
+
def main():
|
141
|
+
import matplotlib
|
142
|
+
#matplotlib.use('pdf')
|
143
|
+
#matplotlib.use('svg')
|
144
|
+
from matplotlib import pyplot as plt
|
145
|
+
|
146
|
+
|
147
|
+
date_range = np.arange(matplotlib.dates.date2num(DATE_START), matplotlib.dates.date2num(DATE_END), 0.1)
|
148
|
+
day_numbers = date_range - matplotlib.dates.date2num(DATE_PERIAPSIS)
|
149
|
+
|
150
|
+
# Calculate the accurate and simple calculations of equation of time.
|
151
|
+
solar_offset_accurate_min = equation_of_time_accurate(day_numbers) + longitude_offset_min(LOCATION)
|
152
|
+
solar_offset_simple_min = equation_of_time_simple(day_numbers) + longitude_offset_min(LOCATION)
|
153
|
+
|
154
|
+
# Plot the graph, either solar vs clock, or vice-versa.
|
155
|
+
if 1:
|
156
|
+
# Solar time vs clock time
|
157
|
+
plt.plot_date(date_range, solar_offset_accurate_min, '-')
|
158
|
+
# plt.plot_date(date_range, solar_offset_simple_min, '--')
|
159
|
+
plt.ylabel('solar time - clock time (min)')
|
160
|
+
else:
|
161
|
+
# Clock time vs solar time
|
162
|
+
plt.plot_date(date_range, -solar_offset_accurate_min, '-')
|
163
|
+
# plt.plot_date(date_range, -solar_offset_simple_min, '--')
|
164
|
+
plt.ylabel('clock time - solar time (min)')
|
165
|
+
|
166
|
+
# Set month lines
|
167
|
+
ax = plt.subplot(111)
|
168
|
+
ax.xaxis.set_major_locator(matplotlib.dates.MonthLocator())
|
169
|
+
ax.xaxis.set_major_formatter(matplotlib.ticker.NullFormatter())
|
170
|
+
# Set month labels centred in the middle (actually on day 15) of each month.
|
171
|
+
ax.xaxis.set_minor_locator(matplotlib.dates.MonthLocator(bymonthday=15))
|
172
|
+
ax.xaxis.set_minor_formatter(matplotlib.dates.DateFormatter('%b'))
|
173
|
+
for tick in ax.xaxis.get_minor_ticks():
|
174
|
+
tick.tick1line.set_markersize(0)
|
175
|
+
tick.tick2line.set_markersize(0)
|
176
|
+
|
177
|
+
plt.grid(True)
|
178
|
+
|
179
|
+
plt.show()
|
180
|
+
# plt.savefig('equation_of_time.pdf')
|
181
|
+
# plt.savefig('equation_of_time.svg')
|
182
|
+
# plt.savefig('equation_of_time.png')
|
183
|
+
|
184
|
+
|
185
|
+
if __name__ == '__main__':
|
186
|
+
main()
|
Binary file
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# the file this data comes from 'Circular_179.pdf' IAU 2000A Nutation Series
|
2
|
+
# the first 678 lines are for lunisolar data
|
3
|
+
|
4
|
+
require 'safe_yaml'
|
5
|
+
|
6
|
+
# make array elements from each line of the file
|
7
|
+
filename = "nutation_table5_3a.txt"
|
8
|
+
temp_array = []
|
9
|
+
data = File.readlines(filename)
|
10
|
+
|
11
|
+
# clean out whitespace and new line breaks
|
12
|
+
data.each {|i| temp_array << i.strip}
|
13
|
+
|
14
|
+
# make new muti-dimensional data array
|
15
|
+
data = []
|
16
|
+
temp_array.each {|i| data << i.split}
|
17
|
+
|
18
|
+
# save the array in a yaml file
|
19
|
+
File::open( "nutation_table5_3a.yaml", "w" ) do |f|
|
20
|
+
YAML.dump( data, f )
|
21
|
+
end
|
22
|
+
|
23
|
+
# show the new data file contents as an array.
|
24
|
+
data = []
|
25
|
+
File.open( "nutation_table5_3a.yaml" ) do |f|
|
26
|
+
YAML.load_documents( f ) do |doc|
|
27
|
+
data = doc
|
28
|
+
p data
|
29
|
+
end
|
30
|
+
p f
|
31
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
# from_wiki.rb
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'eot'
|
5
|
+
rescue LoadError
|
6
|
+
lib = File.expand_path('../../lib', __FILE__)
|
7
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
8
|
+
require 'eot'
|
9
|
+
end
|
10
|
+
|
11
|
+
eot = Eot.new()
|
12
|
+
# Wiki 1:
|
13
|
+
|
14
|
+
loop do
|
15
|
+
puts "#{Time.now} #{eot.show_minutes(eot.now)}"
|
16
|
+
sleep 11
|
17
|
+
end
|
18
|
+
|
19
|
+
# Wiki 2:
|
20
|
+
|
21
|
+
latitude, longitude, date = 41.9474, -88.74467, "2013-12-25"
|
22
|
+
eot.latitude = latitude; eot.longitude = longitude; eot.ajd = Date.parse(date).jd
|
23
|
+
p eot.sunrise_dt().to_time
|
24
|
+
p eot.sunset_dt().to_time
|
25
|
+
|
26
|
+
# Wiki 3:
|
27
|
+
|
28
|
+
loop do
|
29
|
+
eot.ajd = DateTime.now.to_time.utc.to_datetime.ajd
|
30
|
+
puts eot.string_time(eot.tl_Aries() / 15.0)
|
31
|
+
sleep 0.73
|
32
|
+
end
|
33
|
+
|
34
|
+
# Wiki 4:
|
35
|
+
|
36
|
+
puts "There are #{Eot::SM * 6} hours in a sidereal day."
|
37
|
+
puts "That is why on the next day the stars are about 4 minutes earlier."
|
38
|
+
p obtime0 = Time.now
|
39
|
+
p obtime1 = obtime0 + Eot::SM * 6 * 3600
|
40
|
+
puts "Now you know when to look next time."
|
41
|
+
|
42
|
+
# Wiki 5:
|
43
|
+
|
44
|
+
p DateTime.jd(eot.sunrise_jd + 0.5)
|
45
|
+
p DateTime.jd(eot.sunset_jd + 0.5)
|
46
|
+
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# geo_locator.rb
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'eot'
|
5
|
+
rescue LoadError
|
6
|
+
lib = File.expand_path('../../lib', __FILE__)
|
7
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
8
|
+
require 'eot'
|
9
|
+
end
|
10
|
+
|
11
|
+
|
12
|
+
geo = GeoLatLng.new
|
13
|
+
geo.addr = "8000 South Michigan Ave., Chicago, IL"
|
14
|
+
geo.get_coordinates_from_address
|
15
|
+
p geo.lat
|
16
|
+
p geo.lng
|
data/examples/getjd.rb
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'date'
|
4
|
+
include Math
|
5
|
+
|
6
|
+
def calc_time_julian_centurey(t)
|
7
|
+
# Julian Day Number j(2000) subtracted
|
8
|
+
(t - 2451545.0) / 36525.0
|
9
|
+
# Time in fractional centurey
|
10
|
+
end
|
11
|
+
|
12
|
+
# Truncate large angles
|
13
|
+
def mod_360(x)
|
14
|
+
360.0 * ( x / 360.0 - Integer( x / 360.0))
|
15
|
+
end
|
16
|
+
|
17
|
+
def calc_mean_long_aries(t)
|
18
|
+
|
19
|
+
mod_360(280.46061666 + t * 36525.0 * 360.98564736629 + t * (t * 0.000387933 - t * (t / 38710000.0)))
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
puts "outputs data every 5 seconds"
|
24
|
+
loop do
|
25
|
+
time = Time.now.utc
|
26
|
+
theDate = Date.new(time.year, time.month, time.day)
|
27
|
+
# puts time
|
28
|
+
# puts theDate
|
29
|
+
# puts "#{theDate.ajd} = Astronomical Julian Day"
|
30
|
+
# puts "#{theDate.jd - 0.5} = Astronomical Julian Day"
|
31
|
+
# puts "#{theDate.jd} = Julian Day"
|
32
|
+
t = time
|
33
|
+
theDayFraction = (t.usec / (1000000.0 * 3600.0) + t.min / 60.0 + t.hour + t.sec / 3600.0) / 24.0
|
34
|
+
# puts "#{theDayFraction} = Day Fraction time now"
|
35
|
+
|
36
|
+
theTotal = theDate.ajd + theDayFraction
|
37
|
+
# puts "#{theTotal} = Astronomical Julian Day + Day Fraction time now"
|
38
|
+
|
39
|
+
tjc = calc_time_julian_centurey(theTotal)
|
40
|
+
gmst = calc_mean_long_aries(tjc)
|
41
|
+
|
42
|
+
puts "#{gmst.round 3} = (GHA) Mean Hour Angle First Point of Aries (Vernal Equinox)"
|
43
|
+
puts "#{(gmst/15.0).round 3} = Mean Greenwich Siderial Time (GMST)"
|
44
|
+
sleep 5
|
45
|
+
end
|
@@ -0,0 +1,406 @@
|
|
1
|
+
# read_nutation_data.rb is a leftover from building it so I just left it in examples.
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'eot'
|
5
|
+
rescue LoadError
|
6
|
+
lib = File.expand_path('../../lib', __FILE__)
|
7
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
8
|
+
require 'eot'
|
9
|
+
end
|
10
|
+
eot = Eot.new
|
11
|
+
|
12
|
+
now = DateTime.now.to_time.utc.to_datetime
|
13
|
+
|
14
|
+
=begin
|
15
|
+
|
16
|
+
The file this data comes from is 'Circular_179.pdf' IAU 2000A Nutation Series.
|
17
|
+
The first 678 lines are for lunisolar data.
|
18
|
+
|
19
|
+
# Try to make an array using each line of the file
|
20
|
+
filename = 'nutation_series.txt'
|
21
|
+
temp_array = []
|
22
|
+
data = File.readlines(filename)
|
23
|
+
# Clean out whitespace and new line breaks.
|
24
|
+
data.each {|i| temp_array << i.strip}
|
25
|
+
# Make new muti-dimensional data array.
|
26
|
+
data = []
|
27
|
+
temp_array.each {|i| data << i.split}
|
28
|
+
# Save the array in a file.
|
29
|
+
File::open( "nutation_series.data", "w" ) do |f|
|
30
|
+
f << data
|
31
|
+
end
|
32
|
+
|
33
|
+
# Make new muti-dimensional data array using yaml
|
34
|
+
data = []
|
35
|
+
temp_array.each {|i| data << i.split}
|
36
|
+
# Save the array in a yaml file.
|
37
|
+
File::open( "nutation_series.yaml", "w" ) do |f|
|
38
|
+
f << data.to_yaml
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
# $:.unshift(File.expand_path(File.dirname(__FILE__)))
|
43
|
+
# require 'nutation_series_data'
|
44
|
+
# or for => Ruby 1.9.2
|
45
|
+
require_relative 'nutation_series_data'
|
46
|
+
# I manually added @data = to the beginning of the new array file nutation_series.rb so we may use it
|
47
|
+
# data = @data
|
48
|
+
|
49
|
+
# load in the yaml data
|
50
|
+
data = []
|
51
|
+
File.open( "nutation_series2.yaml" ) do |f|
|
52
|
+
YAML.load_documents( f ) do |doc|
|
53
|
+
data = doc
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
=end
|
58
|
+
|
59
|
+
## data was initialized when the class instance was via nutation_series2.yaml file.
|
60
|
+
#data = eot.data
|
61
|
+
#file_path = File.expand_path( File.dirname( __FILE__ ) + "/nutation_table5_3a.yaml" )
|
62
|
+
#data = YAML::load( File.open( file_path, 'r'), :safe => true ).freeze
|
63
|
+
## Arc seconds to radians formula
|
64
|
+
#ARCSEC = 3600.0
|
65
|
+
#dtr = Math::PI / 180.0 / ARCSEC # adjusted for working in the arc seconds values
|
66
|
+
|
67
|
+
## sine degrees
|
68
|
+
#def sind(dtr, x)
|
69
|
+
# Math::sin(dtr*x)
|
70
|
+
#end
|
71
|
+
## cod degrees
|
72
|
+
#def cosd(dtr, x)
|
73
|
+
# Math::cos(dtr*x)
|
74
|
+
#end
|
75
|
+
|
76
|
+
|
77
|
+
## The JD is at Noon 12:00 UTC for today
|
78
|
+
## In all of these expressions, T is the number of Julian centuries of TDB since 2000 Jan 1, 12h TDB (or,
|
79
|
+
## with negligible error, the number of Julian centuries of TT since J2000.0).
|
80
|
+
#jd2000 = 2451545.0 # the J2000 Julian Day Number
|
81
|
+
#
|
82
|
+
#ajd = DateTime.now.to_time.utc.to_datetime.ajd.to_f
|
83
|
+
#
|
84
|
+
## calculate time to julian centuries
|
85
|
+
#t = eot.time_julian_century()
|
86
|
+
|
87
|
+
## Values are in arc seconds see below for definitions of terms
|
88
|
+
#ma_moon = 485868.249036 + 1717915923.2178 * t[0] + 31.8792 * t[1] + 0.051635 * t[2] - 0.00024470 * t[3]
|
89
|
+
#ma_sun = 1287104.79305 + 129596581.0481 * t[0] - 0.5532 * t[1] + 0.000136 * t[2] - 0.00001149 * t[3]
|
90
|
+
#md_moon = 335779.526232 + 1739527262.8478 * t[0] - 12.7512 * t[1] - 0.001037 * t[2] + 0.00000417 * t[3]
|
91
|
+
#me_moon = 1072260.70369 + 1602961601.2090 * t[0] - 6.3706 * t[1] + 0.006593 * t[2] - 0.00003169 * t[3]
|
92
|
+
#omega = 450160.398036 - 6962890.5431 * t[0] + 7.4722 * t[1] + 0.007702 * t[2] - 0.00005939 * t[3]
|
93
|
+
|
94
|
+
## declare and clear these two variables for the sigma loop
|
95
|
+
#delta_psi, delta_eps = 0, 0
|
96
|
+
#
|
97
|
+
#lines = data.size - 1
|
98
|
+
#for i in 0..lines
|
99
|
+
# fma_sun = data[i][0].to_i
|
100
|
+
# fma_moon = data[i][1].to_i
|
101
|
+
# fmd_moon = data[i][2].to_i
|
102
|
+
# fme_moon = data[i][3].to_i
|
103
|
+
# fomega = data[i][4].to_i
|
104
|
+
# sine = sind(dtr, fma_moon * ma_moon +
|
105
|
+
# fma_sun * ma_sun +
|
106
|
+
# fmd_moon * md_moon +
|
107
|
+
# fme_moon * me_moon +
|
108
|
+
# fomega * omega)
|
109
|
+
# cosine = cosd(dtr, fma_moon * ma_moon +
|
110
|
+
# fma_sun * ma_sun +
|
111
|
+
# fmd_moon * md_moon +
|
112
|
+
# fme_moon * me_moon +
|
113
|
+
# fomega * omega)
|
114
|
+
# delta_psi += (data[i][6].to_f +
|
115
|
+
# data[i][7].to_f * t[0]) * sine +
|
116
|
+
# data[i][10].to_f * cosine
|
117
|
+
#
|
118
|
+
# delta_eps += (data[i][8].to_f +
|
119
|
+
# data[i][9].to_f * t[0]) * cosine +
|
120
|
+
# data[i][12].to_f * sine
|
121
|
+
#
|
122
|
+
#end
|
123
|
+
#
|
124
|
+
## convert arc seconds to degree
|
125
|
+
#def to_deg( arc_secs )
|
126
|
+
# arc_secs / ARCSEC
|
127
|
+
#end
|
128
|
+
#
|
129
|
+
#delta_eps = to_deg( delta_eps ) / 1000.0
|
130
|
+
#delta_eps = eot.delta_epsilon(t)
|
131
|
+
#
|
132
|
+
#delta_psi = to_deg( delta_psi ) / 1000.0
|
133
|
+
#delta_psi = eot.delta_psi(t)
|
134
|
+
|
135
|
+
#Delta epsilon degrees decimal = #{to_deg(delta_eps)}
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
##Delta psi needs to be degrees and eps is degrees but dtr uses ARCSEC constant also we need the result back in ARCSEC / 15 to get time in secs.
|
140
|
+
## eoe = delta_psi / ARCSEC * cosd( dtr * ARCSEC, eps ) * ARCSEC / 15.0
|
141
|
+
#eoe = eot.eq_of_equinox() / 15.0
|
142
|
+
##p eot.ml_Aries()
|
143
|
+
#gmst = eot.ml_Aries() / 15.0 # make angle to time.
|
144
|
+
## eoe is ARCSEC so convert it to hours.
|
145
|
+
#gast = gmst + eoe
|
146
|
+
|
147
|
+
|
148
|
+
|
149
|
+
##Mean Obliquity of Ecliptic degrees = #{eot.display_degrees(eps0)}
|
150
|
+
#eot.mo_Earth()
|
151
|
+
##True Obliquity of Ecliptic degrees = #{eot.display_degrees(eps)}
|
152
|
+
#eps = eot.to_Earth()
|
153
|
+
|
154
|
+
#eoe = eot.eq_of_equinox() / 15.0
|
155
|
+
#gmst = eot.ml_Aries() / 15.0 # make angle to time.
|
156
|
+
#gast = gmst + eoe
|
157
|
+
run = <<EOS
|
158
|
+
#{now}
|
159
|
+
|
160
|
+
#{now.to_time}
|
161
|
+
|
162
|
+
The JD = #{eot.ajd = now.ajd.to_f}
|
163
|
+
|
164
|
+
Mean Obliquity of Ecliptic = #{eot.degrees_to_s(eot.mo_Earth())}
|
165
|
+
|
166
|
+
Delta epsilon in arc seconds = #{eot.delta_epsilon() * Eot::R2D * 3600.0}
|
167
|
+
|
168
|
+
True Obliquity of Ecliptic degrees = #{eot.degrees_to_s(eot.to_Earth())}
|
169
|
+
|
170
|
+
Delta psi in arc seconds = #{eot.delta_psi * Eot::R2D * 3600}
|
171
|
+
|
172
|
+
Equation of equinox in seconds = Delta psi * cos epsilon = #{eot.eq_of_equinox() * Eot::R2D / 15.0 * 3600}
|
173
|
+
|
174
|
+
Greenwich Mean Sidereal Time = #{eot.string_time(eot.ml_Aries() * Eot::R2D / 15.0)}
|
175
|
+
|
176
|
+
Greenwich Apparent Sideral Time = #{eot.string_time(eot.ml_Aries() * Eot::R2D / 15.0 + eot.eq_of_equinox() * Eot::R2D / 15.0)}
|
177
|
+
|
178
|
+
To compare results enter the date and time into http://www.celnav.de/longterm.htm
|
179
|
+
|
180
|
+
You can use the methods in EOT instead of this example as this just shows how it works.
|
181
|
+
|
182
|
+
EOS
|
183
|
+
|
184
|
+
puts run
|
185
|
+
|
186
|
+
# Helpful info
|
187
|
+
=begin
|
188
|
+
these values are in arc seconds
|
189
|
+
|
190
|
+
Mean anomaly of the moon
|
191
|
+
ma_moon = 485868.249036 + 1717915923.2178 * t + 31.8792 * t2 + 0.051635 * t3 - 0.00024470 * t4
|
192
|
+
|
193
|
+
Mean anomaly of the sun
|
194
|
+
ma_sun = 1287104.79305 + 129596581.0481 * t - 0.5532 * t2 + 0.000136 * t3 - 0.00001149 * t4
|
195
|
+
|
196
|
+
|
197
|
+
Mean distance of the moon from the ascending node
|
198
|
+
md_moon = 335779.526232 + 1739527262.8478 * t - 12.7512 * t2 - 0.001037 * t3 + 0.00000417 * t4
|
199
|
+
|
200
|
+
|
201
|
+
Mean elongation of the moon
|
202
|
+
me_moon = 1072260.70369 + 1602961601.2090 * t - 6.3706 * t2 + 0.006593 * t3 - 0.00003169 * t4
|
203
|
+
|
204
|
+
|
205
|
+
Longitude of the ascending node of the moon
|
206
|
+
omega = 450160.398036 - 6962890.5431 * t + 7.4722 * t2 + 0.007702 * t3 - 0.00005939 * t4
|
207
|
+
|
208
|
+
=end
|
209
|
+
|
210
|
+
=begin
|
211
|
+
|
212
|
+
Manualy converted values from arc seconds to dergrees(not used here)
|
213
|
+
|
214
|
+
ma_moon = 134.96340251 + 477198.8675605 * t + t2 / 112.92629677 + t3 / 69720.15106 - t4 / 14711892.112791
|
215
|
+
ma_sun = 357.52910918 + 35999.0502911389 * t - t2 / 6507.592191 + t3 / 26470588.2353 - t4 / 313315926.89295
|
216
|
+
md_moon = 93.27209062 + 483202.01745772 * t - t2 / 282.3264 - t3 / 3471552.555 + t4 / 863309352.5179856
|
217
|
+
me_moon = 297.8501954694 + 445267.11144694 * t - t2 / 565.0959 + t3 / 546033.672 - t4 / 113600504.891
|
218
|
+
omega = 125.04455501 - 1934.136261972 * t + t2 / 481.78582 + 0.007702 * t3 / 467411.062 - t4 / 60616265.3645
|
219
|
+
|
220
|
+
=end
|
221
|
+
|
222
|
+
|
223
|
+
=begin
|
224
|
+
|
225
|
+
An example of usage for 'Circular_179.pdf' IAU 2000A Nutation Series
|
226
|
+
The JavaScript from: view-source:http://www.celnav.de/longterm.htm
|
227
|
+
//Nutation, obliquity of the ecliptic
|
228
|
+
function Nutation()
|
229
|
+
{
|
230
|
+
//IAU 1980 nutation theory:
|
231
|
+
|
232
|
+
//Mean anomaly of the moon
|
233
|
+
var Mm = 134.962981389+198.867398056*TE+trunc(477000*TE)+0.008697222222*TE2+TE3/56250;
|
234
|
+
|
235
|
+
//Mean anomaly of the sun
|
236
|
+
var M = 357.527723333+359.05034*TE+trunc(35640*TE)-0.0001602777778*TE2-TE3/300000;
|
237
|
+
|
238
|
+
//Mean distance of the moon from the ascending node
|
239
|
+
var F = 93.271910277+82.017538055*TE+trunc(483120*TE)-0.0036825*TE2+TE3/327272.7273;
|
240
|
+
|
241
|
+
//Mean elongation of the moon
|
242
|
+
var D = 297.850363055+307.11148*TE+trunc(444960*TE)-0.001914166667*TE2+TE3/189473.6842;
|
243
|
+
|
244
|
+
//Longitude of the ascending node of the moon
|
245
|
+
var omega = 125.044522222-134.136260833*TE-trunc(1800*TE)+0.002070833333*TE2+TE3/450000;
|
246
|
+
|
247
|
+
//Periodic terms for nutation
|
248
|
+
var nut = new Array(106);
|
249
|
+
nut[0] = " 0 0 0 0 1-171996-174.2 92025 8.9 ";
|
250
|
+
nut[1] = " 0 0 2-2 2 -13187 -1.6 5736-3.1 ";
|
251
|
+
nut[2] = " 0 0 2 0 2 -2274 -0.2 977-0.5 ";
|
252
|
+
nut[3] = " 0 0 0 0 2 2062 0.2 -895 0.5 ";
|
253
|
+
nut[4] = " 0-1 0 0 0 -1426 3.4 54-0.1 ";
|
254
|
+
nut[5] = " 1 0 0 0 0 712 0.1 -7 0.0 ";
|
255
|
+
nut[6] = " 0 1 2-2 2 -517 1.2 224-0.6 ";
|
256
|
+
nut[7] = " 0 0 2 0 1 -386 -0.4 200 0.0 ";
|
257
|
+
nut[8] = " 1 0 2 0 2 -301 0.0 129-0.1 ";
|
258
|
+
nut[9] = " 0-1 2-2 2 217 -0.5 -95 0.3 ";
|
259
|
+
nut[10] = "-1 0 0 2 0 158 0.0 -1 0.0 ";
|
260
|
+
nut[11] = " 0 0 2-2 1 129 0.1 -70 0.0 ";
|
261
|
+
nut[12] = "-1 0 2 0 2 123 0.0 -53 0.0 ";
|
262
|
+
nut[13] = " 1 0 0 0 1 63 0.1 -33 0.0 ";
|
263
|
+
nut[14] = " 0 0 0 2 0 63 0.0 -2 0.0 ";
|
264
|
+
nut[15] = "-1 0 2 2 2 -59 0.0 26 0.0 ";
|
265
|
+
nut[16] = "-1 0 0 0 1 -58 -0.1 32 0.0 ";
|
266
|
+
nut[17] = " 1 0 2 0 1 -51 0.0 27 0.0 ";
|
267
|
+
nut[18] = "-2 0 0 2 0 -48 0.0 1 0.0 ";
|
268
|
+
nut[19] = "-2 0 2 0 1 46 0.0 -24 0.0 ";
|
269
|
+
nut[20] = " 0 0 2 2 2 -38 0.0 16 0.0 ";
|
270
|
+
nut[21] = " 2 0 2 0 2 -31 0.0 13 0.0 ";
|
271
|
+
nut[22] = " 2 0 0 0 0 29 0.0 -1 0.0 ";
|
272
|
+
nut[23] = " 1 0 2-2 2 29 0.0 -12 0.0 ";
|
273
|
+
nut[24] = " 0 0 2 0 0 26 0.0 -1 0.0 ";
|
274
|
+
nut[25] = " 0 0 2-2 0 -22 0.0 0 0.0 ";
|
275
|
+
nut[26] = "-1 0 2 0 1 21 0.0 -10 0.0 ";
|
276
|
+
nut[27] = " 0 2 0 0 0 17 -0.1 0 0.0 ";
|
277
|
+
nut[28] = " 0 2 2-2 2 -16 0.1 7 0.0 ";
|
278
|
+
nut[29] = "-1 0 0 2 1 16 0.0 -8 0.0 ";
|
279
|
+
nut[30] = " 0 1 0 0 1 -15 0.0 9 0.0 ";
|
280
|
+
nut[31] = " 1 0 0-2 1 -13 0.0 7 0.0 ";
|
281
|
+
nut[32] = " 0-1 0 0 1 -12 0.0 6 0.0 ";
|
282
|
+
nut[33] = " 2 0-2 0 0 11 0.0 0 0.0 ";
|
283
|
+
nut[34] = "-1 0 2 2 1 -10 0.0 5 0.0 ";
|
284
|
+
nut[35] = " 1 0 2 2 2 -8 0.0 3 0.0 ";
|
285
|
+
nut[36] = " 0-1 2 0 2 -7 0.0 3 0.0 ";
|
286
|
+
nut[37] = " 0 0 2 2 1 -7 0.0 3 0.0 ";
|
287
|
+
nut[38] = " 1 1 0-2 0 -7 0.0 0 0.0 ";
|
288
|
+
nut[39] = " 0 1 2 0 2 7 0.0 -3 0.0 ";
|
289
|
+
nut[40] = "-2 0 0 2 1 -6 0.0 3 0.0 ";
|
290
|
+
nut[41] = " 0 0 0 2 1 -6 0.0 3 0.0 ";
|
291
|
+
nut[42] = " 2 0 2-2 2 6 0.0 -3 0.0 ";
|
292
|
+
nut[43] = " 1 0 0 2 0 6 0.0 0 0.0 ";
|
293
|
+
nut[44] = " 1 0 2-2 1 6 0.0 -3 0.0 ";
|
294
|
+
nut[45] = " 0 0 0-2 1 -5 0.0 3 0.0 ";
|
295
|
+
nut[46] = " 0-1 2-2 1 -5 0.0 3 0.0 ";
|
296
|
+
nut[47] = " 2 0 2 0 1 -5 0.0 3 0.0 ";
|
297
|
+
nut[48] = " 1-1 0 0 0 5 0.0 0 0.0 ";
|
298
|
+
nut[49] = " 1 0 0-1 0 -4 0.0 0 0.0 ";
|
299
|
+
nut[50] = " 0 0 0 1 0 -4 0.0 0 0.0 ";
|
300
|
+
nut[51] = " 0 1 0-2 0 -4 0.0 0 0.0 ";
|
301
|
+
nut[52] = " 1 0-2 0 0 4 0.0 0 0.0 ";
|
302
|
+
nut[53] = " 2 0 0-2 1 4 0.0 -2 0.0 ";
|
303
|
+
nut[54] = " 0 1 2-2 1 4 0.0 -2 0.0 ";
|
304
|
+
nut[55] = " 1 1 0 0 0 -3 0.0 0 0.0 ";
|
305
|
+
nut[56] = " 1-1 0-1 0 -3 0.0 0 0.0 ";
|
306
|
+
nut[57] = "-1-1 2 2 2 -3 0.0 1 0.0 ";
|
307
|
+
nut[58] = " 0-1 2 2 2 -3 0.0 1 0.0 ";
|
308
|
+
nut[59] = " 1-1 2 0 2 -3 0.0 1 0.0 ";
|
309
|
+
nut[60] = " 3 0 2 0 2 -3 0.0 1 0.0 ";
|
310
|
+
nut[61] = "-2 0 2 0 2 -3 0.0 1 0.0 ";
|
311
|
+
nut[62] = " 1 0 2 0 0 3 0.0 0 0.0 ";
|
312
|
+
nut[63] = "-1 0 2 4 2 -2 0.0 1 0.0 ";
|
313
|
+
nut[64] = " 1 0 0 0 2 -2 0.0 1 0.0 ";
|
314
|
+
nut[65] = "-1 0 2-2 1 -2 0.0 1 0.0 ";
|
315
|
+
nut[66] = " 0-2 2-2 1 -2 0.0 1 0.0 ";
|
316
|
+
nut[67] = "-2 0 0 0 1 -2 0.0 1 0.0 ";
|
317
|
+
nut[68] = " 2 0 0 0 1 2 0.0 -1 0.0 ";
|
318
|
+
nut[69] = " 3 0 0 0 0 2 0.0 0 0.0 ";
|
319
|
+
nut[70] = " 1 1 2 0 2 2 0.0 -1 0.0 ";
|
320
|
+
nut[71] = " 0 0 2 1 2 2 0.0 -1 0.0 ";
|
321
|
+
nut[72] = " 1 0 0 2 1 -1 0.0 0 0.0 ";
|
322
|
+
nut[73] = " 1 0 2 2 1 -1 0.0 1 0.0 ";
|
323
|
+
nut[74] = " 1 1 0-2 1 -1 0.0 0 0.0 ";
|
324
|
+
nut[75] = " 0 1 0 2 0 -1 0.0 0 0.0 ";
|
325
|
+
nut[76] = " 0 1 2-2 0 -1 0.0 0 0.0 ";
|
326
|
+
nut[77] = " 0 1-2 2 0 -1 0.0 0 0.0 ";
|
327
|
+
nut[78] = " 1 0-2 2 0 -1 0.0 0 0.0 ";
|
328
|
+
nut[79] = " 1 0-2-2 0 -1 0.0 0 0.0 ";
|
329
|
+
nut[80] = " 1 0 2-2 0 -1 0.0 0 0.0 ";
|
330
|
+
nut[81] = " 1 0 0-4 0 -1 0.0 0 0.0 ";
|
331
|
+
nut[82] = " 2 0 0-4 0 -1 0.0 0 0.0 ";
|
332
|
+
nut[83] = " 0 0 2 4 2 -1 0.0 0 0.0 ";
|
333
|
+
nut[84] = " 0 0 2-1 2 -1 0.0 0 0.0 ";
|
334
|
+
nut[85] = "-2 0 2 4 2 -1 0.0 1 0.0 ";
|
335
|
+
nut[86] = " 2 0 2 2 2 -1 0.0 0 0.0 ";
|
336
|
+
nut[87] = " 0-1 2 0 1 -1 0.0 0 0.0 ";
|
337
|
+
nut[88] = " 0 0-2 0 1 -1 0.0 0 0.0 ";
|
338
|
+
nut[89] = " 0 0 4-2 2 1 0.0 0 0.0 ";
|
339
|
+
nut[90] = " 0 1 0 0 2 1 0.0 0 0.0 ";
|
340
|
+
nut[91] = " 1 1 2-2 2 1 0.0 -1 0.0 ";
|
341
|
+
nut[92] = " 3 0 2-2 2 1 0.0 0 0.0 ";
|
342
|
+
nut[93] = "-2 0 2 2 2 1 0.0 -1 0.0 ";
|
343
|
+
nut[94] = "-1 0 0 0 2 1 0.0 -1 0.0 ";
|
344
|
+
nut[95] = " 0 0-2 2 1 1 0.0 0 0.0 ";
|
345
|
+
nut[96] = " 0 1 2 0 1 1 0.0 0 0.0 ";
|
346
|
+
nut[97] = "-1 0 4 0 2 1 0.0 0 0.0 ";
|
347
|
+
nut[98] = " 2 1 0-2 0 1 0.0 0 0.0 ";
|
348
|
+
nut[99] = " 2 0 0 2 0 1 0.0 0 0.0 ";
|
349
|
+
nut[100]= " 2 0 2-2 1 1 0.0 -1 0.0 ";
|
350
|
+
nut[101]= " 2 0-2 0 1 1 0.0 0 0.0 ";
|
351
|
+
nut[102]= " 1-1 0-2 0 1 0.0 0 0.0 ";
|
352
|
+
nut[103]= "-1 0 0 1 1 1 0.0 0 0.0 ";
|
353
|
+
nut[104]= "-1-1 0 2 1 1 0.0 0 0.0 ";
|
354
|
+
nut[105]= " 0 1 0 1 0 1 0.0 0 0.0 ";
|
355
|
+
|
356
|
+
//Reading periodic terms
|
357
|
+
var fMm, fM, fF, fD, f_omega, dp=0, de=0;
|
358
|
+
|
359
|
+
for (x=0; x<105; x++)
|
360
|
+
{
|
361
|
+
fMm = eval(nut[x].substring(0,2));
|
362
|
+
fM = eval(nut[x].substring(2,4));
|
363
|
+
fF = eval(nut[x].substring(4,6));
|
364
|
+
fD = eval(nut[x].substring(6,8));
|
365
|
+
f_omega = eval(nut[x].substring(8,10));
|
366
|
+
dp += (eval(nut[x].substring(10,17))+TE*eval(nut[x].substring(17,23)))*sind(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega);
|
367
|
+
de += (eval(nut[x].substring(23,29))+TE*eval(nut[x].substring(29,33)))*cosd(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega);
|
368
|
+
}
|
369
|
+
|
370
|
+
//Corrections (Herring, 1987)
|
371
|
+
/*
|
372
|
+
var corr = new Array(4);
|
373
|
+
corr[0] = " 0 0 0 0 1-725 417 213 224 ";
|
374
|
+
corr[1] = " 0 1 0 0 0 523 61 208 -24 ";
|
375
|
+
corr[2] = " 0 0 2-2 2 102-118 -41 -47 ";
|
376
|
+
corr[3] = " 0 0 2 0 2 -81 0 32 0 ";
|
377
|
+
|
378
|
+
for (x=0; x<4; x++)
|
379
|
+
{
|
380
|
+
fMm = eval(corr[x].substring(0,2));
|
381
|
+
fM = eval(corr[x].substring(2,4));
|
382
|
+
fF = eval(corr[x].substring(4,6));
|
383
|
+
fD = eval(corr[x].substring(6,8));
|
384
|
+
f_omega = eval(corr[x].substring(8,10));
|
385
|
+
dp += 0.1*(eval(corr[x].substring(10,14))*sind(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega)+eval(corr[x].substring(14,18))*cosd(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega));
|
386
|
+
de += 0.1*(eval(corr[x].substring(18,22))*cosd(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega)+eval(corr[x].substring(22,26))*sind(fD*D+fM*M+fMm*Mm+fF*F+f_omega*omega));
|
387
|
+
}
|
388
|
+
*/
|
389
|
+
|
390
|
+
//Nutation in longitude
|
391
|
+
delta_psi = dp/36000000;
|
392
|
+
|
393
|
+
//Nutation in obliquity
|
394
|
+
delta_eps = de/36000000;
|
395
|
+
|
396
|
+
//Mean obliquity of the ecliptic
|
397
|
+
eps0 = (84381.448-46.815*TE-0.00059*TE2+0.001813*TE3)/3600;
|
398
|
+
|
399
|
+
//True obliquity of the ecliptic
|
400
|
+
eps = eps0+delta_eps;
|
401
|
+
}
|
402
|
+
|
403
|
+
//Equation of the equinoxes
|
404
|
+
EoE = 240*delta_psi*cosd(eps);
|
405
|
+
|
406
|
+
=end
|