2

ここで火星の方程式とデータを使用しています http://ssd.jpl.nasa.gov/txt/aprx_pos_planets.pdf

4ページの上部にある偏心異常ケプラー方程式の解 http://murison.alpheratz.net/dynamics/twobody/KeplerIterations_summary.pdf

そして、get_centuries_past の日付を次の日付に変更して出力を確認し、E-7 ページで火星の実際の x、y、z 座標を調べます (以下のサンプル データですが、興味のある方は http://books. google.com/books/about/Astronomical_Almanac_for_the_Year_2013_a.html?id=7fl_-DLwJ8YC )

date 2456320.5 は 2013 年 1 月 28 日であり、出力する必要があります

x = 1.283762
y = -0.450111
z = -0.241123

date 2456357.5 は 2013, 3, 6 であり、出力する必要があります

x = 1.300366
y = 0.533593
z = 0.209626

date 2456539.500000 は 2013, 9, 4 であり、出力する必要があります

x = - 0.325604
y = 1.418110
z = 0.659236

平均異常方程式をテストしましたが、問題ありませんでした。ただし、x、y、z 座標の適切なセットを取得できません。ケプラーと座標関数を微調整してきましたが、天文年鑑の表と一致させることができません。

星の位置を解決するための提案やアドバイスは大歓迎です。以下のコードは .rb ファイルに記述でき、コマンド ラインで実行すると x、y、z 値が出力されます。

def get_centuries_past_j2000()
        #second number is from DateTime.new(2000,1,1,12).amjd.to_f - 1 the modified julian date for the J2000 Epoch
        #Date.today.jd.to_f - 51544.5
        (DateTime.new(2013,1,28).amjd.to_f - 51544.5)/36525
end

class Planet
    attr_accessor :semi_major_axis, :semi_major_axis_delta, :eccentricity, :eccentricity_delta,
    :inclination, :inclination_delta, :mean_longitude, :mean_longitude_delta, :longitude_of_perihelion, 
    :longitude_of_perihelion_delta, :longitude_of_ascending_node, :longitude_of_ascending_node_delta, :time_delta
def initialize(semi_major_axis, semi_major_axis_delta, eccentricity, eccentricity_delta,
inclination, inclination_delta, mean_longitude, mean_longitude_delta, longitude_of_perihelion, 
longitude_of_perihelion_delta, longitude_of_ascending_node, longitude_of_ascending_node_delta, time_delta)
    @semi_major_axis = semi_major_axis + (semi_major_axis_delta * time_delta)
    @eccentricity = eccentricity + (eccentricity_delta * time_delta)
    @inclination = inclination + (inclination_delta * time_delta)
    @mean_longitude = mean_longitude + (mean_longitude_delta * time_delta)
    @longitude_of_perihelion = longitude_of_perihelion + (longitude_of_perihelion_delta * time_delta)
    @longitude_of_ascending_node = longitude_of_ascending_node + (longitude_of_ascending_node_delta * time_delta)
    @argument_of_perhelion = @longitude_of_perihelion - @longitude_of_ascending_node
end

def mean_anomaly
    ((@mean_longitude - @longitude_of_perihelion)%360).round(8)
end

def eccentric_anomaly
    mod_mean_anomaly = mean_anomaly
    if mod_mean_anomaly > 180
        mod_mean_anomaly = mod_mean_anomaly - 360
    elsif mod_mean_anomaly < -180
        mod_mean_anomaly = mod_mean_anomaly + 360
    end
    e34 = @eccentricity**2
    e35 = @eccentricity*e34
    e33 = Math.cos(mod_mean_anomaly*Math::PI/180)
    mod_mean_anomaly + (-0.5 * e35 + @eccentricity + (e34 + 1.5 * e33 * e35) * e33) * Math.sin(mod_mean_anomaly*Math::PI/180)
end

def J2000_ecliptic_plane
    x_prime = @semi_major_axis * (Math.cos(eccentric_anomaly*Math::PI/180) - @eccentricity)
    y_prime = @semi_major_axis * Math.sqrt(1-@eccentricity**2) * Math.sin(eccentric_anomaly*Math::PI/180)
    z_prime = 0
    x = x_prime * (Math.cos(@argument_of_perhelion*Math::PI/180) * Math.cos(@longitude_of_ascending_node*Math::PI/180) - Math.sin(@argument_of_perhelion * Math::PI/180) * Math.sin(@longitude_of_ascending_node * Math::PI/180) * Math.cos(@inclination * Math::PI/180)) + y_prime * (-Math.sin(@argument_of_perhelion* Math::PI/180) * Math.cos(@longitude_of_ascending_node * Math::PI/180) - Math.cos(@argument_of_perhelion * Math::PI/180) * Math.sin(@longitude_of_ascending_node * Math::PI/180) * Math.cos(@inclination * Math::PI/180))
    y = x_prime * (Math.cos(@argument_of_perhelion*Math::PI/180) * Math.sin(@longitude_of_ascending_node*Math::PI/180) + Math.sin(@argument_of_perhelion * Math::PI/180) * Math.cos(@longitude_of_ascending_node * Math::PI/180) * Math.cos(@inclination * Math::PI/180)) + y_prime * (-Math.sin(@argument_of_perhelion* Math::PI/180) * Math.sin(@longitude_of_ascending_node * Math::PI/180) + Math.cos(@argument_of_perhelion * Math::PI/180) * Math.cos(@longitude_of_ascending_node * Math::PI/180) * Math.cos(@inclination * Math::PI/180))
    z = x_prime * Math.sin(@argument_of_perhelion*Math::PI/180) * Math.sin(@inclination*Math::PI/180) + y_prime * Math.cos(@argument_of_perhelion*Math::PI/180) * Math.sin(@inclination*Math::PI/180)
    return x, y, z
end
end

time = get_centuries_past_j2000
mars = Planet.new(1.52371034, 0.00001847, 0.09339410, 0.00007882, 1.84969142, -0.00813131, -4.553443205, 19140.30268499, -23.94362959, 0.44441088, 49.55952891, -0.29257343, time)
puts time
puts mars.mean_anomaly
puts mars.eccentric_anomaly
puts mars.J2000_ecliptic_plane
4

1 に答える 1

0

これは役に立つかもしれませんが、私は地球の近日点の議論には同意しません. 近日点の経度は問題ありません。傾きは非常に小さいため、他の惑星の場合とは異なり、地球には実際には適用されません。そして、オメガの価値を見つけることは困難です. 近日点は常に変化しています。参考までに、西暦 1248 年には冬至と一致していました。

まず、IAU には、標準化された天文関数を備えた無料の SOFA C および FORTRAN ライブラリがあります。行列テーブルは特定のルーチンに含まれているため、調べに行く必要はありません。

しかし、古い学校の方法を使用する傾向がある場合は、このサイトに必要なものがあります http://www.stjarnhimlen.se/comp/tutorial.html

NOVA C と JAVA、MICA、JPL のカタログ、Jean Meeus の本、AA USNO、およびウィキペディア以外の多くのカタログには、大量の情報があります。長方形の値が必要なようですので、Paul Schlyter がお手伝いできると思います。

SOFA にもこれらがありますが、それらの使用方法に関するドキュメントでは、テクニックを教えることはできません。それらを理解するには多くの研究が必要です。

Ruby を使用しているようで、Celes という名前の SOFA lib のラッパー gem があります。gem install celes を実行するだけで入手できます。

すべて fa で始まる基本的な引数を見てみましょう。

** iauFal03 月の平均偏差 ** iauFaf03 月の緯度の平均引数 ** iauFaom03 月の昇交点の平均経度 ** iauFame03 水星の平均経度 ** iauFave03 金星の平均経度 ** iauFae03 地球の平均経度** iauFama03 火星の平均経度 ** iauFaju03 木星の平均経度 ** iauFasa03 土星の平均経度 ** iauFaur03 天王星の平均経度 ** iauFapa03 経度における一般累積歳差運動

楽しむ!

更新の編集:

この宝石には、地球の太陽中心および重心 x、y、z を提供する 2 つの関数があります。

p は位置、v は速度です。h はヘリオセントリック、b は重心です。

pvh = Celes.epv00(jd_now, 0.0)[0]
pvb = Celes.epv00(jd_now, 0.0)[1]

sc = Celes.pv2s(pvh)

sc は球座標を意味します。

ご覧のとおり、指定する必要があるのは JD 時間値だけです。そのgemとSOFA Cコードにはたくさんの良いものがあります. それらすべてを使用する方法をまだ学習していません。

于 2015-11-08T02:41:50.830 に答える