コンテンツにスキップ

はじめに

OpenGoddard は、ロケットの打上げ経路のように「時間とともに変わる操作を、どう決めればいちばん良いか」を数値計算で求める Python ライブラリです。このような問題を最適制御問題といいます。

例として、坂道で球を転がす問題を考えます。点 A から静かに球を放し、重力だけで点 B まで転がします。 坂の形を自由に作れるとき、いちばん早く B に着く形はどれでしょうか。

A から B へ球を転がしたときの所要時間。最短距離の直線は最速ではありません。最速の形(サイクロイド)は、最初に急に下って速さを稼ぎます。
A から B へ球を転がしたときの所要時間。最短距離の直線は最速ではありません。最速の形(サイクロイド)は、最初に急に下って速さを稼ぎます。

直線は距離こそ最短ですが、加速がゆるやかなので遅くなります。逆に深く潜りすぎると道のりが長くなります。 この中間にある「最速の形」は、最初に急降下して速さを稼ぎ、後半はその速さで水平に進む曲線です。

この問題で探しているのは、ひとつの数ではなく、坂の形(各時刻にどちらへ進むか)という関数です。 ロケットなら「各時刻に推力をどれだけ、どの向きに出すか」、自動車なら「各時刻にアクセルとブレーキをどれだけ踏むか」が、 同じように探す対象になります。OpenGoddard はこの種の問題を、次の情報から解きます。

  • 運動方程式:操作を決めると、状態(位置・速度・質量など)がどう変化するか
  • 条件:出発点と到着点の状態、途中で守る制限(推力の上限、加速度の上限など)
  • 目的:何を最小にしたいか(所要時間、燃料、到達高度にマイナスをつけたもの など)

結果として、状態と操作の時間変化(時間履歴)が得られます。下は、2段式ロケットで高度 500 km の円軌道に入るとき、 軌道上に残る質量を最大にする飛び方を求めた例です(例題13)。

例題13の解。青が1段目、赤が2段目の飛行経路、橙の矢印は推力の向きです。白い点は計算で直接求めた点(ノード)で、線はそれらを通る多項式です。
例題13の解。青が1段目、赤が2段目の飛行経路、橙の矢印は推力の向きです。白い点は計算で直接求めた点(ノード)で、線はそれらを通る多項式です。
  • 擬スペクトル法(LGL法) で解きます。少ない点数で高い精度が得られる方法です(擬スペクトル法)。
  • 数式をそのまま書けます。 運動方程式・条件・目的関数を普通の Python 関数として書くだけで、 離散化や最適化問題の組み立てはライブラリが行います(問題の書き方)。
  • 複数の区間を扱えます。 段分離のように途中で性質が変わる飛行も、区間ごとに分けて解けます。
  • 依存は NumPy・SciPy・Matplotlib だけです。 最適化には SciPy の SLSQP(逐次二次計画法)を使います。

Python 3.11 以上が必要です。

ターミナルウィンドウ
pip install OpenGoddard

例題を動かす場合は、リポジトリを取得して uv で環境を作ります。

ターミナルウィンドウ
git clone https://github.com/istellartech/OpenGoddard.git
cd OpenGoddard
uv sync
uv run python examples/02_move_stop.py

最適制御や数値最適化を学習中の方は、上から順に読むことを想定しています。

ロケットの父と呼ばれる Robert H. Goddard にちなみます。彼が1919年に提起した「決まった量の推進剤で、ロケットを最も高く上げるには 推力をどう変えればよいか」という問題(Goddard 問題)は、最適制御の代表的な例題です(例題07)。

OpenGoddard は インターステラテクノロジズ株式会社 が MIT ライセンスで公開しています。