軌道の計算:一瞬ごとに速度と位置を更新する
遊びをつくる執筆にClaudeを使用しています。

「小さな軌道」で発射角度と初速を決めると、点線の予測が星の引力で曲がっていきます。この曲線は、どんな計算から出てくるのでしょうか。答えは、「ほんの少し時間を進めて、速度を更新し、位置を更新する」という一行分の計算の繰り返しです。曲線の式を一発で解く必要はありません。 この繰り返しは、表計算ソフトの行にそのまま置き換えられます。1行が「一瞬」、列が「その瞬間の状態」です。この記事では、軌道を再現する表の列と式を一つずつ組み立てます。そのうえで、更新の順序を入れ替えると軌道がどう変わるかを、読者が自分で確かめる手順にします。結果の数値は載せません。表を作れば、答えは手元の画面に出ます。 後半では、「小さな軌道」の確認済みの機能と表計算の列を照らし合わせます。作品の内部実装は確認できていないため、「設計から読み取れること」の範囲にとどめます。
「一瞬ごとの更新」とは何をすることか
軌道計算は、次の3つの考えだけでできています。
- 位置は、速度の分だけ動きます。
- 速度は、加速度の分だけ変わります。
- 引力による加速度は、星に向かう向きで、星に近いほど大きくなります。
時間を細かく区切った一区切りを「刻み」と呼び、その長さを dt と書きます。一回の刻みで、速度に「加速度×dt」を足し、位置に「速度×dt」を足します。これを何百回も繰り返すと、曲がった軌道の点列ができます。
引力の大きさは、星からの距離の2乗に反比例します。これは一般に知られた万有引力の法則の形です。表では、「星の強さ」を一つの定数 GM にまとめて扱います。この GM の値は表の練習用に自分で決めるもので、「小さな軌道」の内部の数値とは関係ありません。
表の列を決める
星は原点 (0, 0) に置き、動かないものとします。1行に必要な状態は次の8列です。
- A、中身:時刻 t
- B, C、中身:位置 x, y
- D, E、中身:速度 vx, vy
- F、中身:星までの距離 r
- G, H、中身:加速度 ax, ay
定数は表の端に置きます。K1 に GM、K2 に刻み dt を入れます。最初は GM=1、dt=0.1 を勧めます。
初期条件は2行目に入れます。A2=0、B2=1、C2=0、D2=0、E2=1 です。星から距離1の位置で、真横(上向き)に速さ1で発射する設定です。
この条件には、検算できる性質があります。円軌道では、向心加速度 v²/r と引力加速度 GM/r² が等しくなります。GM=1、r=1、v=1 なら、どちらも1で釣り合います。理論上はきれいな円になる条件です。軌道が円から外れていれば、それは物理の問題ではなく、計算の側で何かが起きているということです。判断の基準に使えます。
一行ずつの式を書く
2行目の F、G、H は、状態から導かれる値です。
F2: =SQRT(B2^2+C2^2)
G2: =-$K$1*B2/F2^3
H2: =-$K$1*C2/F2^3加速度の式に F の3乗が出てくるのは、距離の2乗に反比例する大きさに、方向を表す B2/F2(長さ1に直した向き)が掛かるためです。結果として、星に向かう向きで、大きさ GM/r² の加速度になります。F2^3 を F2^2 に書き間違える誤りが多いので、最初に確認してください。
3行目は、2行目から次の瞬間を作ります。
A3: =A2+$K$2
D3: =D2+G2*$K$2
E3: =E2+H2*$K$2
B3: =B2+D3*$K$2
C3: =C2+E3*$K$2
F3, G3, H3: 2行目の式を下へコピー$ の付いた K1 と K2 は、行を下げても動かさない固定参照です。付け忘れると、下の行で定数がずれて、軌道が突然おかしくなります。
3行目ができたら、そのまま数百行下へコピーします。B と C を散布図にすると、軌道の形が見えます。
手計算で検算できます。dt=0.1 のとき、2行目では ax=-1、ay=0 です。3行目は、D3 = 0 + (-1)×0.1 = -0.1、E3 = 1 + 0×0.1 = 1 になります。次に B3 = 1 + (-0.1)×0.1 = 0.99、C3 = 0 + 1×0.1 = 0.1 です。画面の値がこれと合えば、式は正しく入っています。
更新の順序で軌道は変わる
上の式では、B3 と C3 を計算するときに、更新後の速度 D3、E3 を使いました。速度を先に更新し、その新しい速度で位置を動かす順序です。
もう一つの順序は、古い速度 D2、E2 で位置を動かす方法です。
B3: =B2+D2*$K$2
C3: =C2+E2*$K$2この場合、同じ手計算の3行目は B3=1、C3=0.1 です。星までの距離は √(1²+0.1²)≈1.005 となり、最初の一歩で1を超えます。先ほどの順序(新しい速度を使う方)では √(0.99²+0.1²)≈0.995 で、1を下回ります。一歩目から、膨らむ向きと縮む向きに分かれます。
一般に、古い速度で動かす方法は、軌道が少しずつ外へ膨らんでいく傾向が知られています。新しい速度を使う方法は、円に近い軌道を長く保ちやすいことが知られています。この傾向が自分の表でも出るかどうかは、次の手順で確かめられます。
- 2つの順序の表を別シートに作ります。初期条件と定数は同じにします。
- 各表に I 列を足します。式は =0.5*(D2^2+E2^2)-$K$1/F2 です。運動の勢いと引力の位置エネルギーの和にあたります。
- 同じ行数(たとえば500行)まで下へコピーし、I 列の最初と最後を比べます。
- 距離 F 列の最小値と最大値も比べます。円軌道なら、どちらも1に近いはずです。
- dt を 0.1、0.05、0.01 と変えて、同じ行数ではなく同じ時刻まで進めて比べます。
読み方の目安です。I 列が大きく動かない表は、物理を保てている表です。I 列が増え続ける表は、計算の側が軌道をずらしています。dt を小さくして差が縮むなら、ずれの原因は刻みの粗さです。縮まないなら、式の書き間違い(符号、F の累乗、固定参照)を疑ってください。
よくある失敗は、行数を揃えて比べてしまうことです。dt が違うと、同じ行数でも進んだ時刻が違います。比べるときは、A 列の時刻を基準にしてください。
「小さな軌道」の設計から読み取れること
ここからは、確認済みの機能と表計算の列を対応づけます。内部の計算方式やコードは確認できていないため、作品が上の方法で動いているとは言えません。あくまで、機能から読み取れる範囲の話です。
- 発射角度と初速: 表の初期条件 D2、E2 にあたります。角度と速さが決まれば、速度の x 成分と y 成分が決まります。初速が同じでも、角度で最初の曲がり方が変わります。
- 引力で曲がる軌道: G、H 列の加速度にあたります。星に近づくほど F が小さくなり、加速度が急に大きくなります。表で星のすぐ近くを通る初期条件を試すと、その様子を再現できます。
- 全軌道予測(点線): 発射前に軌道の先まで描くには、発射後と同じ種類の更新を、先の時刻まで先に回しておく必要があります。表で言えば、数百行を先に埋めておくことです。点線が実際の軌道とどこまで一致するかは、作品を開いて確かめる項目です。
- 前回の軌道(細い実線): 前回の表を別シートに残して重ねることに相当します。条件を少し変えるたびに、前回との差を見て調整できます。
- 予測を消して挑む: 表の先の行を隠した状態です。曲がり方の感覚だけで角度と初速を決めることになります。表で何度も軌道を見たあとなら、この挑み方の手がかりが増えます。
- 一時停止から同じ位置で再開: 位置と速度さえ残っていれば、続きを計算できます。表の1行が、再開に必要な情報をすべて持っているのと同じです。
- 3つの星系: 星の数や配置の違いは作品を開いて確かめてください。星が複数あるなら、各星からの加速度を足し合わせる形に表を拡張できます。G、H 列に項を足すだけです。
- 最速記録はプレイ中だけ: 画面を閉じると消えます。
次の行動
まず、円軌道の初期条件で表を作り、手計算した3行目の値と一致するかを確かめてください。次に、更新順序の違う表をもう一枚作り、I 列と F 列の最小・最大を比べます。そのうえで「小さな軌道」を開き、点線の予測を出した状態と消した状態で、同じ星系に挑んでみてください。

