Octaveで天文計算する際に便利な関数

Octaveを使って天文計算をする際に、便利な関数を紹介します。天文計算と言うと、sinやcos、tanなどの数学関数を利用することがあります。Octaveでは、必要な数学関数や円周率などが用意されています。GNU Fortranでは円周率は、自分で定数として記述していましたが、Octaveでは必要ありませんし、ラジアン値に変換するための定数を記述することもありません。すでに用意されているからです。ここでは、そういった便利な関数を紹介していきましょう。

ラジアン・角度の相互変換

2つの関数が用意されています。

deg2rad … 角度をラジアンに換算する
rad2deg … ラジアンを角度に変換する

deg2rad(316.166396) → 5.518144594364230
rad2deg(5.518144594364230) → 316.1663960000000

sin・cos・tanなどの三角関数の引数を角度で指定

三角関数では、引数はラジアンを指定しなければなりません。そのため、あらかじめ角度をラジアンに換算する必要がありました。Octaveでは、三角関数名にdという修飾子をつけることで、角度で指定することができます。

sind(93.133688) → 0.998504701197285
sin(deg2rad(93.133688)) → 0.998504701197285

sind以外にもcosd tand asind acosd atandなどがありますが、実際に使用するなら、sindやcosdくらいでしょう。電卓と同じ感覚でできるのはいいですね。

自作の関数を作る

関数がなければ作っておくと、あとからコードを記述するのに楽になります。いくつか作ったものを紹介します。

hms2deg

時分秒を角度に換算します。

% hms2deg
function deg = hms2deg(h, m, s)
    deg = 15.0 * (h + m / 60.0 + s / 3600.0);
end

dms2deg

度分秒を角度に換算します。度分秒の場合、マイナスもありますから、sign関数で正負符号を判断しています。計算する際は、abs関数で絶対値にしておかないと、正しく計算されません。

% dms2deg
function deg = dms2deg(d, m, s)
    deg = sign(d) * (abs(d) + m / 60.0 + s / 3600.0);
end

deg2hms

角度から時分秒に換算します。
呼び出し: [h m s] = deg2hms(deg)
戻り値: []で囲まれた変数に値がセットされます。

%deg2hms
function [h m s] = deg2hms(deg)
    deg = deg / 15.0;
    h = floor(deg);
    s = 60.0 * (deg - floor(deg));
    m = floor(s);
    s = 60.0 * (s - m);
end

deg2dms

角度を度分秒に換算します。
呼び出し: [dd m s] = deg2dms(deg)
戻り値: []で囲まれた変数に値がセットされます。

%deg2dms
function [d m s] = deg2dms(deg)
    d = floor(abs(deg));
    d = sign(deg) * d;
    s = 60.0 * (abs(deg) - floor(abs(deg)));
    m = floor(s);
    s = 60.0 * (s - m);
end

hms2day

時刻の時分秒を日の少数点に換算します。

% hms2day
function t = hms2day(h, m, s)
    t = h / 24.0 + m / 1440.0 + s / 86400.0;
end

day2hms

日の小数点部分を時刻の時分秒に換算します。秒はround関数で小数点部分を四捨五入しています。
呼び出し: [h m s] = day2hms(deg)
戻り値: []で囲まれた変数に値がセットされます。

%day2hms
function [h m s] = day2hms(t)
    t = 24.0 * (t - floor(t));
    h = floor(t);
    s = 60.0 * (t - floor(t));
    m = floor(s);
    s = round(60.0 * (s - m));
end

引数に対する正負符号については、必要以外は行っていませんので、ご注意ください。

また、時分秒それぞれが範囲を超えた場合、たとえば、秒が60になったといったときは、秒を0にして分を+1するなどの処理が必要になります。