2011-10-27 3 views
1

私は、米国海軍天文台のalgorithm for calculating the position of the sunを、使用されているすべての数字が正しく識別された簡単な方法で書いてみようとしています。よくSunの位置、方程式:27日間違い

しかし、どういうわけか、時間の方程式は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(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 

ありがとう!

マット

+4

使用する言語にタグを付け、http://codereview.stackexchange.comに移行することを検討してください。 – ja72

+0

@ ja72:ルビーのようです。 –

+0

@ ja72:これは本当にRubyの質問ではありません。 –

答えて

0

は、それはあなたのプログラムのロジックとRubyの浮動小数点数の精度の問題ではない問題であることができますか?私は、ルビーを使用していないが、それはこのポストによると、ルビーの浮動小数点演算が存在するいくつかの問題があるようです。 Issue with precision of Ruby math operations

投稿によると、浮動小数点演算にはBigDecimalクラスを使う必要があるかもしれません。私は実際にあなたのプログラムを通過しなかった、これはちょうど推測です。ここで

1

def suns_apparent_ecliptic_longitude 
    suns_mean_longitude 
    + SUNS_GEODETIC_PRECESSION * sin(suns_mean_anomaly) 
    + EARTHS_ORBITAL_ECCENTRICITY * sin(2 * suns_mean_anomaly) 
end 

あなたが混合されているユニット。 suns_mean_longitudeは、SUNS_GEODETIC_PRECESSIONのようにラジアンであるため(したがって第2項も同様ですが)EARTHS_ORBITAL_ECCENTRICITY0.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 

私はこのatan2関数が返すどのような単位チェックしていない - あなたはそれが意味をなすために15で割るためにでなければならない度、だと確信していますか?

その他の問題がある可能性があります。これらは私が見ることができるものだけです。

+0

正解! ruby-doc.org/core-1.9.3/Math.html#method-c-atan2戻り値の範囲がPI値として表現されるときは、それらがラジアンであることを確認してください。 y0 = sine_al_Sun(ta)* cosine_to_Earth(ta)alはsuns_apparent_ecliptic_longitudeであり、真の斜度は経度ではありません。それは、天空の極に対する地球の傾きの角度です。 180.0 + rad_to_deg(atan2(-y0、-cosine_al_Sun(ta)))戻り値を適切な範囲に保つのに役立ちます。男が言ったように、リンゴとオレンジを混ぜないでください。 deg rad –

1

私のコードのいくつか。

# 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.00000) 
    [-0.00000, -0.000042037, 0.016708617].inject(0.0) {|p, a| p * ta[0] + a} 
end 
alias_method :eccentricity_earth_orbit, :eccentricity_Earth 

から:それは使用していますEquation of Time Ruby gem

# 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 
関連する問題