SE_BOKUのまとめノート的ブログ

SE_BOKUが知ってること・勉強したこと・考えたことetc

Python3で地球から任意の星までの距離を光年単位で計算する/Pythonサンプル

f:id:arakan_no_boku:20200221194508p:plain

目次

地球から任意の星までの距離を光年単位で計算する/Python3サンプル

空の星までの距離の計算をPython で実装してみます。

別に計算しなくても、地球から星までの距離の情報はそこかしこにあります。

ja.wikipedia.org

地球から金星までは「3962万km」。

地球から太陽までは「 1億4709万km」

地球から木星までは「7億4054万km」

などなど。

でも、数字がわかってm、お、こんな途方もない距離をどうやって測るのか?ってとこが気になって仕方ないので、調べてみたわけです。

星までの距離の測り方

 Googleで「星までの距離 測り方」と検索すると、いくつか候補がでてきます。

www.nao.ac.jp

とか。

spacemgz-telstar.com

とか。

どちらにも共通している図がこれです。

f:id:arakan_no_boku:20210503170826p:plain

三角比ですね。

昔、数学の時間に木の高さを測るという問題で、こんな図をよく見ました。

f:id:arakan_no_boku:20200221200244p:plain

これと同じような考え方です。

三角比の関係を星と地球と太陽の関係に適用するとこうなります。

f:id:arakan_no_boku:20210503190752p:plain

これを見る限り、P(角度)と太陽と地球の距離がわかれば、星との距離「r」が計算できそうです。

ものの本によれが計算式は「r = R/SinP」だそうです。

太陽と地球の距離(R)は一定ですでにわかっていて、約1億4960万kmです。 

次に、角度(P)にあたる部分は、年周視差として求められていて資料があります。

これは度分秒の単位であらわされているので、角度に変換は必要ですが。

なかなか見つけられなかったのですが、探し回って見つけたのが、こちらの表です。

f:id:arakan_no_boku:20200221230544p:plain

引用すると

  • ケンタウルス座アルファ星( α Cen) :年周視差「0.742秒」距離「4.39光年」
  • シリウス (α CMa) :年周視差「0.379秒」:距離「8.60光年」
  • ベガ (α Lyr): 年周視差「0.123秒」:距離「26光年」
  • アルタイル (α Aql): 年周視差「0.194秒」:距離「17光年」
  • 北極星 (α UMi) :年周視差「0.00756秒」:距離「430光年」

です。

これを使えば、プログラムにかけるじゃないかということで、やってみます。

 

年周視差と地球と太陽の距離から距離を光年単位で計算する

 Pythonでプログラムを書いてみます。

本当は星の名前を引数にして、内部で年周視差に変換するほうが、スマートなのですが、とりあえず、計算式をPythonに落とし込んで検算したいだけなので、到着して、年周視差を引数にしてクラスを生成すという、実に、ユーザフレンドリーでない仕様になってます(笑)

例によって、ソースから。

import math


class DistanceToStar:
    def __init__(self, annual_parallax):
        # 年周視差
        self.annual_parallax = annual_parallax
        # 1度(秒換算)
        self.one_degrees = 3600
        # 太陽との距離(KM)
        self.distance_to_sun_km = 149600000.0
        # 1光年の距離(KM)
        self.one_light_year_km = 9460730472580.8

    def calc(self):
        # 年周視差(秒)を角度に換算する
        dig = self.annual_parallax / self.one_degrees
        # 角度をラジアンにして、Sinを計算する
        sin_degrees = math.sin(math.radians(dig))
        # 太陽までの距離をSINでわって光年の単位に換算する
        return (self.distance_to_sun_km / sin_degrees) / self.one_light_year_km

 

計算するプログラムの補足

まず、年周視差が「度分秒」単位なので、「角度」に変換してやる必要があります。

度分秒から度への変換をするサイトがあったので、計算式を見てみると、1度=3600秒として、年周視差を3600でわってやれば、角度に変換ができるようです。

keisan.casio.jp

ということで、

dig = self.annual_parallax / self.one_degrees

 の部分でそれをやってます。

次に、その角度に対する「Sin」を計算します。

math.sinは引数がラジアンなので。

sin_degrees = math.sin(math.radians(dig))

 ですね。 

あとは、太陽までの距離を、上記のSin値でわって、対象の星までの距離(KM単位)がでるので、それをさらに「1光年」のKM数でわって、光年単位にする。

self.distance_to_sun_km / sin_degrees) / self.one_light_year_km

と・・これで求められるはずです。 

 

計算の実行と答え合わせ

上記のクラスを使って、計算してみました。

d1 = DistanceToStar(0.742)
print(d1.calc())
d2 = DistanceToStar(0.379)
print(d2.calc())
d3 = DistanceToStar(0.123)
print(d3.calc())
d4 = DistanceToStar(0.194)
print(d4.calc())
d5 = DistanceToStar(0.00756)
print(d5.calc())

その結果がこちらです。 

4.395701078995025
8.605831663876279
26.517156102499737
16.812423714472963
431.429920715248

単位はすべて光年です。

こちらの表の5つを表の順番通りに年周視差をあてはめてみましたが、おおよそ、あってますね。

f:id:arakan_no_boku:20200221230544p:plain

良い感じじゃないでしょうか。

今回はこんなところで。

ではでは。