Math 太阳';s位置,时间方程式:错误27天
我正试图改进美国海军天文台的功能,用一种更简单的方式写下它,所有使用的数字都已正确识别——这样普通人也能理解它 但不知何故,时间方程式偏离了27天。也许这里有人能发现哪里不对劲 试运行:Math 太阳';s位置,时间方程式:错误27天,math,physics,astronomy,azimuth,Math,Physics,Astronomy,Azimuth,我正试图改进美国海军天文台的功能,用一种更简单的方式写下它,所有使用的数字都已正确识别——这样普通人也能理解它 但不知何故,时间方程式偏离了27天。也许这里有人能发现哪里不对劲 试运行: 1) Failure: test_equation_of_time(TestSolarCalculations): Expected 2011-10-01 10:23:00 UTC, not 2011-10-28 10:59:31 UTC. 2) Failure: test_suns_declination(
1) Failure:
test_equation_of_time(TestSolarCalculations):
Expected 2011-10-01 10:23:00 UTC, not 2011-10-28 10:59:31 UTC.
2) Failure:
test_suns_declination(TestSolarCalculations):
Expected -3.18, not -3.2087920449753007.
新算法:
# Constants for J2000.0 / 1 Jan 2000 12:00Z:
#
EPOCHS_JULIAN_DATE = 2451545
ANOMALISTIC_YEAR_IN_DAYS = 365.259636
TROPICAL_YEAR_IN_DAYS = 365.2421897
SUNS_MEAN_ANOMALY_AT_EPOCH = degrees_to_radians 357.5291
SUNS_MEAN_LONGITUDE_AT_EPOCH = degrees_to_radians 280.459
SUNS_GEODETIC_PRECESSION = degrees_to_radians 1.915
EARTHS_ORBITAL_ECCENTRICITY = 0.020
EARTHS_ADJUSTED_AVERAGE_RADIUS_IN_AU = 1.00014
EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION = degrees_to_radians 0.01671
EARTHS_ECLIPTIC_MEAN_OBLIQUITY = degrees_to_radians 23.439
EARTHS_ECLIPTIC_OBLIQUITY_CHANGE_RATE = degrees_to_radians 0.00000036
def days_from_epoch
@todays_julian_date - EPOCHS_JULIAN_DATE
end
def suns_daily_mean_anomaly_change_rate
degrees_to_radians(360 / ANOMALISTIC_YEAR_IN_DAYS)
end
def suns_mean_anomaly
SUNS_MEAN_ANOMALY_AT_EPOCH + suns_daily_mean_anomaly_change_rate * days_from_epoch
end
def suns_daily_mean_longitude_change_rate
degrees_to_radians(360 / TROPICAL_YEAR_IN_DAYS)
end
def suns_mean_longitude
SUNS_MEAN_LONGITUDE_AT_EPOCH + suns_daily_mean_longitude_change_rate * days_from_epoch
end
def suns_apparent_ecliptic_longitude
suns_mean_longitude + SUNS_GEODETIC_PRECESSION * sin(suns_mean_anomaly) + EARTHS_ORBITAL_ECCENTRICITY * sin(2 * suns_mean_anomaly)
end
def suns_distance_from_earth_in_au
EARTHS_ADJUSTED_AVERAGE_RADIUS_IN_AU - EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION * cos(suns_mean_anomaly) - (EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION ^ 2 / 2) * cos(2 * suns_mean_anomaly)
end
def earths_ecliptic_mean_obliquity
EARTHS_ECLIPTIC_MEAN_OBLIQUITY - EARTHS_ECLIPTIC_OBLIQUITY_CHANGE_RATE * days_from_epoch
end
def suns_right_ascension
atan2(cos(suns_apparent_ecliptic_longitude) * sin(suns_apparent_ecliptic_longitude), cos(suns_apparent_ecliptic_longitude)) / 15
end
# Time.utc(Time.now.year) => 2011-01-01 00:00:00 UTC
#
def equation_of_time
Time.utc(Time.now.year) + (radians_to_degrees(suns_mean_longitude) / 15 - suns_right_ascension) * 60 * 60 * 24
end
def suns_declination
radians_to_degrees(asin(sin(earths_ecliptic_mean_obliquity) * sin(suns_apparent_ecliptic_longitude)))
end
谢谢
Mats可能是Ruby浮点数的精度问题,而不是程序逻辑问题?我没有使用过ruby,但根据本文,ruby浮点操作中似乎存在一些问题。 根据文章,您可能需要使用BigDecimal类进行浮点操作。实际上我没有看过你的程序,这只是一个猜测。这里:
def suns_apparent_ecliptic_longitude
suns_mean_longitude
+ SUNS_GEODETIC_PRECESSION * sin(suns_mean_anomaly)
+ EARTHS_ORBITAL_ECCENTRICITY * sin(2 * suns_mean_anomaly)
end
你们是混合单位太阳平均经度
是弧度,正如太阳大地进动
(因此第二项也是如此),但地球轨道偏心率
是0.020
度
此外:
EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION = degrees_to_radians 0.01671
应该是
EARTHS_APPROXIMATE_ATMOSPHERIC_REFRACTION = 0.01671
我想,因为这是用来计算距离的公式
此外,
def suns_right_ascension
atan2(cos(suns_apparent_ecliptic_longitude) * sin(suns_apparent_ecliptic_longitude), cos(suns_apparent_ecliptic_longitude)) / 15
end
我还没有检查这个函数返回的单位是多少?你确定它是度吗?它必须是度,才能除以15才有意义
可能还有其他问题,;这些是我唯一能看到的。我的一些代码
# From angles.rb:<br>
# eccentricity of elliptical Earth orbit around Sun
# Horner calculation method
def eccentricity_Earth( ta = A2000 )
ta = check_jct_zero( ta )
# 0.016708617 - ta[ 0 ] * ( 0.000042037 + ta[ 0 ] * 0.0000001235 )
[-0.0000001235, -0.000042037, 0.016708617].inject(0.0) {|p, a| p * ta[0] + a}
end
alias_method :eccentricity_earth_orbit, :eccentricity_Earth
#从角度。rb:
#椭圆地球绕太阳轨道的偏心率
#霍纳计算法
def偏心距_接地(ta=A2000)
ta=检查0(ta)
#0.016708617-ta[0]*(0.000042037+ta[0]*0.0000001235)
[-0.0000001235,-0.000042037,0.016708617]。注入(0.0){p,a{p*ta[0]+a}
结束
别名法:偏心距地球轨道,偏心距地球轨道
发件人:
在哪里用的
# From angles.rb:<br>
# equation of centre
# added to mean anomaly to get true anomaly.
def center( ta = A2000)
ta = check_jct_zero( ta )
sine_1M = sin( 1.0 * deg_to_rad( @ma ) )
sine_2M = sin( 2.0 * deg_to_rad( @ma ) )
sine_3M = sin( 3.0 * deg_to_rad( @ma ) )
sine_4M = sin( 4.0 * deg_to_rad( @ma ) )
sine_5M = sin( 5.0 * deg_to_rad( @ma ) )
e = eccentricity_Earth( ta )
rad_to_deg( sine_1M * ( 2.0 * e - e**3/4.0 + 5/96.0 * e**5 ) +
sine_2M * ( 5/4.0 * e**2 - 11/24.0 * e**4 ) +
sine_3M * ( 13/12.0 * e**3 - 43/64.0 * e**5 ) +
sine_4M * 103/96.0 * e**4 +
sine_5M * 1097/960.0 * e**5 )
# sine_1M *( 1.914602 - ta[ 0 ] * ( 0.004817 + ta[ 0 ] * 0.000014 )) +
# sine_2M *( 0.019993 - ta[ 0 ] * 0.000101 ) +
# sine_3M * 0.000289
end
alias_method :equation_of_center, :center
#从角度。rb:
#中心方程
#添加到平均异常以获得真实异常。
def中心(ta=A2000)
ta=检查0(ta)
正弦1M=正弦(1.0*度到弧度(@ma))
正弦2M=正弦(2.0*度到弧度(@ma))
正弦3M=正弦(3.0*度到弧度(@ma))
正弦4M=正弦(4.0*度到弧度(@ma))
正弦5M=正弦(5.0*度到弧度(@ma))
e=偏心距_接地(ta)
弧度到度(正弦1M*(2.0*e-e**3/4.0+5/96.0*e**5)+
正弦2M*(5/4.0*e**2-11/24.0*e**4+
正弦3M*(13/12.0*e**3-43/64.0*e**5)+
正弦4M*103/96.0*e**4+
正弦5M*1097/960.0*e**5)
#正弦(1.914602-ta[0]*(0.004817+ta[0]*0.000014))+
#正弦(0.019993-ta[0]*0.000101)+
#正弦3M*0.000289
结束
别名\u方法:方程\u的\u中心,:中心
请使用所使用的语言,并考虑迁移到.jJ72:这不是一个真正的Ruby问题。@ JA72 CODReVIEW是用于工作代码的,不是吗?你能发布旧代码吗?(我推测)工作吗?我认为你的代码混合在某种程度上:地球偏心率的值是0.01671(见维基百科)。您正在使用大气折射的精确值,并将其从度转换为弧度。胡说八道,对!ruby doc.org/core-1.9.3/Math.html#method-c-atan2当返回范围以PI值表示时,请确保它们以弧度表示。考虑使用这种类型的公式,Y0=SuneialalSun(TA)* CasyNo.ToEl(TA)AL是太阳光和黄道经度,并且是真正的斜度,而不是经度。这是地球相对于天极的倾斜角度。180.0+rad_至_deg(atan2(-y0,-余弦太阳(ta)))将有助于将返回值保持在适当的范围内。就像那个人说的,不要把苹果和桔子混在一起。度拉德