#プログラム大喜利 出題その(4)

Twitter. It's what's happening.

これでむしろ必要なのは、プログラムを組む前に「言葉の意味を理解する能力」と「言葉が指すものについての知識」、その上で「式を組み立てる能力」だな。要求される仕様によっては、何をおいても基礎学力が必要という例でもある。

/*
gso.c
*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define G 6.673e-11

double GSOheight(double M, double r, double p)
{
	return cbrt((M * G * p * p) / (4.0 * M_PI * M_PI)) - r;
}

int main(int argc, char **argv)
{
	double h = GSOheight(5.974e24, 6378.137e3, 24 * 60 * 60 * 364.25 / 365.25);
	
	printf("GSOheight: %f[km]\n", h / 1000.0);
}

これは解説が要るかもしれんので書いてみる。

  • 求めるものは「静止軌道高度」。
  • 静止軌道」は「中心天体の自転と同じ周期を持ち、天体表面から見て一点に留まっているようにみえる衛星の軌道」のこと。
  • 静止軌道は必ず「赤道上空の円軌道」になる。
  • 「赤道上空の円軌道」の「地上高度」は、円軌道の「半径」から「天体の赤道半径」を引いたものになる。
  • 円軌道においては、中心天体の引力と、公転による遠心力が釣り合っている。
  • 天体の引力:F_g = \frac{GMm}{r^2} (G は「万有引力定数」)
  • 遠心力:F_p = \frac{mv^2}{r}
  • つまり、\frac{GMm}{r^2} = \frac{mv^2}{r} が成り立ち、r=\frac{GM}{v^2}
  • 円軌道の「長さ」は円周の値なので  l=2\pi r
  • この軌道を速度 v で一周する時間が周期 p なので、 p = \frac{2\pi r}{v}
  • つまり、連立方程式

\begin{eqnarray}\\ \begin{cases}\\ r=\frac{GM}{v^2} & \\ p=\frac{2 \pi r}{v} &\\ \end{cases} \\ \end{eqnarray}
を、rについて解けば、中心天体の質量と周期から、静止軌道の半径を求める式が得られる。何を求めるかさえ分かれば、式自体は中学校の算数レベル。中学校で教えないものとしては立方根が出てくることぐらいか。

  • 求めた静止軌道半径と、天体の赤道半径をどうするかは先に述べた通り。

物理定数 G の値ぐらいは Wikipedia にも載ってるし Google でもすぐ調べがつくので、その程度のことは即座に調べられるのも現代のプログラマに要求される能力の一つ。