はじめに
OpenGoddard は、ロケットの打上げ経路のように「時間とともに変わる操作を、どう決めればいちばん良いか」を数値計算で求める Python ライブラリです。このような問題を最適制御問題といいます。
どんな問題を解くのか
Section titled “どんな問題を解くのか”例として、坂道で球を転がす問題を考えます。点 A から静かに球を放し、重力だけで点 B まで転がします。 坂の形を自由に作れるとき、いちばん早く B に着く形はどれでしょうか。

直線は距離こそ最短ですが、加速がゆるやかなので遅くなります。逆に深く潜りすぎると道のりが長くなります。 この中間にある「最速の形」は、最初に急降下して速さを稼ぎ、後半はその速さで水平に進む曲線です。
この問題で探しているのは、ひとつの数ではなく、坂の形(各時刻にどちらへ進むか)という関数です。 ロケットなら「各時刻に推力をどれだけ、どの向きに出すか」、自動車なら「各時刻にアクセルとブレーキをどれだけ踏むか」が、 同じように探す対象になります。OpenGoddard はこの種の問題を、次の情報から解きます。
- 運動方程式:操作を決めると、状態(位置・速度・質量など)がどう変化するか
- 条件:出発点と到着点の状態、途中で守る制限(推力の上限、加速度の上限など)
- 目的:何を最小にしたいか(所要時間、燃料、到達高度にマイナスをつけたもの など)
結果として、状態と操作の時間変化(時間履歴)が得られます。下は、2段式ロケットで高度 500 km の円軌道に入るとき、 軌道上に残る質量を最大にする飛び方を求めた例です(例題13)。

- 擬スペクトル法(LGL法) で解きます。少ない点数で高い精度が得られる方法です(擬スペクトル法)。
- 数式をそのまま書けます。 運動方程式・条件・目的関数を普通の Python 関数として書くだけで、 離散化や最適化問題の組み立てはライブラリが行います(問題の書き方)。
- 複数の区間を扱えます。 段分離のように途中で性質が変わる飛行も、区間ごとに分けて解けます。
- 依存は NumPy・SciPy・Matplotlib だけです。 最適化には SciPy の SLSQP(逐次二次計画法)を使います。
インストール
Section titled “インストール”Python 3.11 以上が必要です。
pip install OpenGoddard例題を動かす場合は、リポジトリを取得して uv で環境を作ります。
git clone https://github.com/istellartech/OpenGoddard.gitcd OpenGoddarduv syncuv run python examples/02_move_stop.pyこのサイトの読み方
Section titled “このサイトの読み方”最適制御や数値最適化を学習中の方は、上から順に読むことを想定しています。
名前について
Section titled “名前について”ロケットの父と呼ばれる Robert H. Goddard にちなみます。彼が1919年に提起した「決まった量の推進剤で、ロケットを最も高く上げるには 推力をどう変えればよいか」という問題(Goddard 問題)は、最適制御の代表的な例題です(例題07)。
OpenGoddard は インターステラテクノロジズ株式会社 が MIT ライセンスで公開しています。