衝撃マヌーバ (Impulsive Transfer) を伴う軌道の設計で生じる境界点問題(Boundary Value Problem)の取り扱いについて。狙い撃ち法(Shooting method: https://ja.wikipedia.org/wiki/%E7%8B%99%E3%81%84%E6%92%83%E3%81%A1%E6%B3%95
)では収束しない場合が多いため、minimize()
やroot()
などの関数を使用する必要が出てくるので、メモ。
仮定する問題
拘束条件ベクトル $F$ と制御パラメータベクトル $X$ を考える
\begin{align}
X =& \left[ x_1, x_2, \ldots, x_n \right]^T
\\
F =& \left[ f_1, f_2, \ldots, f_m \right]^T
\end{align}
一般的に、$n=m$により問題の収束に必要となる。仮に衝撃マヌーバの場合、各方向の $\Delta V$ のコンポーネントや遷移時間 (time of flight) などが含まれる。具体的には、
X = \left[ V_x, V_y, V_z, t_f \right]^T
などが考えられる。$F$と$X$からヤコビ行列 $DF$求めると
DF =
\begin{bmatrix}
\dfrac{\partial f_1}{\partial x_1} & \cdots & \dfrac{\partial f_1}{\partial x_n} \\
\vdots & \ddots & \vdots \\
\dfrac{\partial f_m}{\partial x_1} & \cdots & \dfrac{\partial f_m}{\partial x_n}
\end{bmatrix}
となる。狙い撃ち法を使用する場合、$X$は
X^{j+1} = X^j - \left[ DF(X^j) \right]^{-1} X^j
で求められる。
軌道設計にscipy.optimize.root()
を使用する場合
まず、求根アルゴリズムを用いて$F=0$を求める場合を考える。アルゴリズムの違いはあっても、この場合root()
に与えられるインプットは狙い撃ち法を使う場合と近いため使用しやすい。
参考
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
軌道設計にscipy.optimize.minimize()
を使用する場合
次に、所謂最適化問題として取り扱う場合、constraint vector $F$ を拘束条件とし、例えば必要となる $\Delta V$ を最小化する問題として捉える。その場合、
\begin{aligned}
\min _{X} ( \Delta V_x^2 + \Delta V_y^2 + \Delta V_z^2 )
\text { such that } \begin{aligned}
F(X) &=0 \\
\end{aligned}
\end{aligned}
とする。
参考
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root.html#r9d4d7396324b-1
https://org-technology.com/posts/scipy-root-finding-multidimensional-functions.html
https://people.duke.edu/~ccc14/sta-663/MultivariateOptimizationAlgortihms.html