LoginSignup
1
1

More than 3 years have passed since last update.

SciPyでの境界点問題の取り扱い

Last updated at Posted at 2020-09-07

衝撃マヌーバ (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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1