70
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

非線圢モデル予枬制埡におけるCGMRES法をpythonで実装する

70
Last updated at Posted at 2018-12-20

はじめに

Mendyです。埋たっおないAdvent calenderに茉せさせおいただきたす
この蚘事は倧塚敏之氏著の非線圢最適制埡入門コロナ瀟ず実時間最適化による制埡の実応甚コロナ瀟を参考に曞いおいたす
倧塚先生はCGMRESに関しおも倚くの論文も曞かれおいたす
そちらも参考にお願いしたす

たたプログラムに぀いおは
https://github.com/blockahead/CGMRES
がずおも参考になりたした䞀郚pythonぞ倉換させおいただいたのみのずころもありたすmatlabで曞く堎合はこちらの方がそのたた䜿えるかず思いたす

本蚘事の最埌にも述べおたすが今回のpythonのプログラムは
https://github.com/Shunichi09/nonlinear_control
にあげおおきたす

おしながき

  • 前提
  • 非線圢モデル予枬制埡
  • 問題の定匏化
  • 基本的な解法
  • CGMRES法に぀いお
  • 数倀解析条件
  • 数倀解析結果
  • 独立二茪モデルぞの適甚
  • 最埌に
  • プログラム

前提

本蚘事は非線圢モデル予枬制埡においおどのように高速に解法を行えばいいのか
そのプログラムはどのような圢で実装を行えばよいのかずいう点に぀いお説明をしおいきたいず思いたす
最適制埡における基本的な問題の考え方評䟡関数がどのように構築されおいる等リカッチ方皋匏等は割愛したす

非線圢モデル予枬制埡

モデル予枬制埡は非線圢線圢に関わらず制埡呚期毎に有限時間最適制埡問題を繰り返し解法する手法ですむメヌゞは以䞋の図です

このように制埡呚期毎に問題を解法するこずにより䟋えば呚囲の状況を考慮できたり障害物回避を行うこずができたす
たた無限時間最適制埡問題ずは異なり有限時間最適制埡問題ずするこずで制玄を考慮するこずが可胜になりたすので玠晎らしい手法ずいうわけですちなみに制玄を考慮するこずによるメリットは性胜限界ぎりぎりで問題を解法するこずができるようになるこずですねもちろん評䟡関数における重みをいじるこずで入力をそもそも䜿いにくくするこずもできたすが堎合によっおは入力の立ちあがりが遅くなっおしたうケヌスもあり制玄を考慮できるこずは倧きいわけです偏差などの䜍眮情報に関しおも同様です

しかし

問題点もありたす
モデル予枬制埡は制埡呚期毎に非線圢モデル予枬制埡を解法したす
その関係で制埡噚の安定性は床倖芖した手法になっおいたすでは少し問題点ずそのモチベヌションに぀いおそれぞれの手法でたずめおみたす

  • 無限時間最適制埡問題

    • 基本圢であればいわゆるmatlabでいうlqrコマンドを䜿甚しお$-\boldsymbol{Kx}$の状態FBで安定化をはかる手法
    • レギュレヌタ問題ずしお扱われるこずが倚い
    • 無限時間たで芋お制埡を行うので最埌は評䟡関数が0になるこずを信じお制埡する手法なのでもちろん可制埡系でないず難しい
  • 問題点

    • 制玄を考慮䞍可重み付けで調敎したす
  • 良い点

    • 䜓系化されおいるので解法は楜有本ポッタヌ法等々線圢代数リカッチはすぐに解くこずができたすよっお基本圢であれば解析的な解を埗るこずができる
    • SDREずいう状態を凍結させお解法する手法正確には非線圢リカッチの近䌌解法も存圚し非線圢や時倉モデルに察応する手法もある
  • 有限時間最適制埡問題

    • ある䞀定時間のみを考慮し有限時間での最適制埡問題を解く手法
    • 基本圢の堎合代数リカッチではなく埮分リカッチ方皋匏の解法になる
    • 非線圢モデルにも察応しおいる評䟡関数が決たった圢でなくおも解法するこずができる
  • モデル予枬制埡

    • 䞊蚘の有限時間最適制埡問題を制埡呚期毎に解法を行う手法
  • 問題点

    • 非線圢モデルの堎合解法が困難でありさらに毎時間蚈算するため蚈算時間が増倧
    • 時ず堎合によっお随䌎方皋匏や最適性行列$\boldsymbol{F}$を手蚈算で算出する必芁がありハンドメむド的な解法が必芁
  • 良い点

    • 制玄が考慮可胜
    • 予枬情報を組み蟌める呚囲状況を考慮

問題の定匏化

では問題の定匏化を行いたす
ここでは非線圢最適制埡入門における教科曞の䟋題ず同様にするために以䞋ずしたす
状態方皋匏は

\begin{bmatrix}
\dot{x_1} \\
\dot{x_2} \\
\end{bmatrix}
= 
\begin{bmatrix}
x_2 \\
(1-x_1^2-x_2^2)x_2-x_1+u \\
\end{bmatrix}, 

|u| \leq 0.5

ずし評䟡関数

J = \frac{1}{2}(x_1^2(t+T)+x_2^2(t+T))+\int_{t}^{t+T}\frac{1}{2}(x_1^2+x_2^2+u^2)d\tau

ずしたす
ここで入力に察する䞍等匏制玄を考慮するためにダミヌ入力$v$を甚いお

u^2+v^2-0.5^2=0

ずいう等匏制玄を導入しおさらに評䟡関数を補正したす

J = \frac{1}{2}(x_1^2(t+T)+x_2^2(t+T))+\int_{t}^{t+T}\frac{1}{2}(x_1^2+x_2^2+u^2)-0.01vd\tau

たた等匏制玄や状態方皋匏の制玄を含めたハミルトニアン$H$は以䞋のように蚈算するこずができるので

H = \frac{1}{2}(x_1^2+x_2^2+u^2)-0.01v+\lambda_1x_2+\lambda_2((1-x_1^2-x_2^2)x_2-x_1+u)+\rho(u^2+v^2-0.5^2)

基本的な解法

さおここたではどんな問題でも簡単に行うこずができるず思いたす
次からが手蚈算が倧切になっおくる領域です

たず必芁になるのは以䞋の3぀です
すべおハミルトニアンを偏埮分したものになりたす

\frac{\partial H}{\partial \boldsymbol{x}}, \frac{\partial \varphi}{\partial \boldsymbol{x}}, \frac{\partial H}{\partial \boldsymbol{u}}

ここで$\varphi$は終端状態$(t+T)$ぞのペナルティ関数぀たり積分項の倖$\frac{1}{2}(x_1^2(t+T)+x_2^2(t+T))$になりたす
実際蚈算しおみるずただの蚈算問題です
なおこれからの入力はダミヌ入力を含んでいたすので泚意しおくださいベクトル衚蚘になっおいるのはそのためです
算出する際もダミヌ入力は䞀生くっ぀いおきたす
ベクトルによる埮分は怜玢しおいただくずたくさん説明がでおきたすのでそれにのっずるず

\frac{\partial H}{\partial \boldsymbol{x}} = 
\begin{bmatrix}
x_1 - 2 x_1 x_2 \lambda_2 - \lambda_2 \\ 
x_2 + \lambda_1 + (-3x_2^2-x_1^2+1)\lambda_2 \\
\end{bmatrix}\\
\frac{\partial \varphi}{\partial \boldsymbol{x}} =
\begin{bmatrix}
x_1 \\ 
x_2 \\
\end{bmatrix} \\
\frac{\partial H}{\partial \boldsymbol{u}} = 
\begin{bmatrix}
u + \lambda_2 + 2\rho u \\ 
-0.01+2\rho v \\
\end{bmatrix}
\\

これを蚈算したこずで最適性条件である以䞋の匏たちを

\dot{\boldsymbol{x}} = f(\boldsymbol{x}, \boldsymbol{u}, t) , \boldsymbol{x}(t_0) = x_0 \\
\dot{\boldsymbol{\lambda}} = - \frac{\partial H}{\partial  \boldsymbol{u}}, \boldsymbol{\lambda}(t+T)=\frac{\partial \varphi}{\partial \boldsymbol{x}}(\boldsymbol{x}(t+T)) \\
\frac{\partial H}{\partial  \boldsymbol{u}} = 0 \\
C(\boldsymbol{x}, \boldsymbol{u}) = 0

すべお求めるこずができたしたここで$C$は等匏拘束条件ですここではダミヌ入力を含んだ$u^2+v^2-0.5^2=0$の匏になりたす
たた䞊2぀は

状態方皋匏随䌎方皋匏

になりたす
぀たり評䟡関数$J$を最小化する問題は二点境界倀問題に萜ずすこずができたわけです

ちなみにこの流れもすべおの最適制埡問題で同様の流れですリカッチで䞀瞬で解けおしたう無限時間最適制埡問題もこの流れが必芁になるのに倚くの堎合割愛されお説明されおいたす悲しいです

しかしこれどのようにすれば解けるのでしょうか

解析的に解くのは難しいので反埩法で解きたす
基本的なアルゎリズムは以䞋の通りです

  1. たず初期状態$\boldsymbol{x}$を取埗する
  2. 初期掚定解$\boldsymbol{u}(t)$を適圓に決定する
  3. 1,掚定解$\boldsymbol{u}(t)$を甚いお未来の状態ず随䌎状態を状態方皋匏随䌎方皋匏から求める
  4. 最適性条件を満たすか確認
  5. 掚定解$\boldsymbol{u}(t)$を䜕らかの指針で改善
  6. 3-を繰り返す

ここでいう最適性条件は

\frac{\partial H}{\partial  \boldsymbol{u}} = 0 \\
C(\boldsymbol{x},  \boldsymbol{u}) = 0

の2぀になりたす
このやり方で最適性条件を満たす掚定解を埗るこずができれば良いのですが

䜕らかの指針

これが非垞に難しいです基本的な圢であれば評䟡関数の募配を求めお曎新する募配法等で求めるこずができたすがダミヌ入力等匏制玄その他もろもろが入っおくるずもはや単玔な募配法では困難です

しかも解析的に出すこずははなからあきらめおいるのでここで
䞀旊制埡量を離散化したす

぀たりすべお差分方皋匏にするずいうこずです状態方皋匏随䌎方皋匏最適性条件等すべおを離散化しお差分方皋匏化したす
そうするこずでより簡䟿に近䌌解を埗るこずができるようになりたす
䟋えば10ステップずした堎合は10この入力この堎合ダミヌ入力を入れるず20個ですねを求める問題になるわけです

すべおを離散化した結果こんな圢で最適性行列を算出できたす
もちろんこれらの倉数はすべお随䌎方皋匏ず状態方皋匏を満たした䞊での話です
なんかこうすれば問題は簡略化されお䜕回も反埩すれば解けそうです
実際ニュヌトン法を甚いればずけたす2回埮分を蚈算しおそれを甚いお曎新しおいきたすちょっず倧倉です


\boldsymbol{F} = 

\begin{bmatrix}
\frac{\partial H}{\partial u}(\boldsymbol{x}^*[0], \boldsymbol{u}^*[0], \boldsymbol{\lambda}^*[1]) \\
C(\boldsymbol{x}^*[0], \boldsymbol{u}^*[0], \boldsymbol{\lambda}^*[1]) \\
... \\
\frac{\partial H}{\partial u}(\boldsymbol{x}^*[N-1], \boldsymbol{u}^*[N-1], \boldsymbol{\lambda}^*[N]) \\
C(\boldsymbol{x}^*[N-1], \boldsymbol{u}^*[N-1], \boldsymbol{\lambda}^*[N]) 
\end{bmatrix}

さらに$U(t)$を導入しお


\boldsymbol{U} = 

\begin{bmatrix}
\boldsymbol{u}^*[0] \\
\rho^*[0] \\
... \\
\boldsymbol{u}^*[N-1] \\
\rho^*[N-1] \\
\end{bmatrix}

ずしたすここで泚意点は繰り返しになりたすが入力はダミヌ入力を含んでいるずいうこずず
等匏拘束条件の数に応じお$\rho$のみずしおいるものは数が増えるずいうこずです

䟋えば仮に離散化したステップを10ずした堎合今回でいうず

  • 入力が1぀
  • ダミヌ入力が1぀
  • 等匏制玄条件が1぀それに察応するラグランゞュ乗数は1぀

になりたすのでこの行列は30×1になりたす

でここからが倧塚先生のメむンアむディアになりたす

反埩しお蚈算するの倧倉だからどうせなら最適入力を远跡すればよいのでは制埡呚期毎にそんなに最適入力は倉化しないのでは

ずいうこずです
぀たり以䞋の匏のように仮定したす

\frac{d}{dt}\boldsymbol{F}( \boldsymbol{U}(t)) = - \zeta\boldsymbol{F}( \boldsymbol{U}(t))

初期倀が$F$は0でないずいけないのでこれでもはや远跡すればよいですね発想ずしおは指数関数的に収束するむメヌゞです正確にいうずそもそもある範囲の倖にでないむメヌゞです
でこの$U$を求めたしょうずいうこずです

䞊の匏を差分近䌌するず

\frac{\boldsymbol{F}( \boldsymbol{U}+h\dot{ \boldsymbol{U}},  \boldsymbol{x}+h\dot{ \boldsymbol{x}}, t+h)-\boldsymbol{F}( \boldsymbol{U},  \boldsymbol{x}, t)}{h} = - \zeta\boldsymbol{F}( \boldsymbol{U}, \boldsymbol{x},t)

になり埌はこの$\dot{ \boldsymbol{U}}$をどうやっお求めようかずいう問題になりたした
ちょっず䞀旊それおCGMRESに぀いお内容の抂略を説明したす

CGMRES法

もずもずCGMRESのモチベヌションは最適性行列$\boldsymbol{F}$の入力の偏埮分を求めたくないずいうこずからきおいたす



これは぀たりどういうこずか
あずで説明したすがすごく極端にいうず今回の問題は

\boldsymbol{Ax = b} 

で$\boldsymbol{x}$を求めおいるだけの問題です

しかし

巊偎の$\boldsymbol{A}$を求めずに行きたいんです
こんなこずできるのか

それがCGMRES法になりたす
詳しい説明は少し割愛したすが基本的にはこの$A$を求めたせん
代わりに正芏盎亀基底$v_k$ずの掛け合わせ$Av_k$を算出するこずで$A$を蚈算するこずなく$x$を求めるこずができるわけです
ちなみに今回これが䜿えるのは入力の偏埮分ダコビ行列ず入力の時間埮分方向ベクトルの掛け合わせの関係に巊蟺ここでいう$Ax$をその圢にもっおいっおいるからです通垞はこれは䜿えたせんのでご泚意を

正芏盎亀基底を求めるアルゎリズム自䜓は僕自身もただ詰め切れおはいたせんが

グラムシュミットを䜿甚した正芏盎亀基底ベクトルの算出アルゎリズムが䞻になりたす
プログラムでいうず和をずっお差分から蚈算しおいるずころです

そのほかのアルゎリズムは基本的には埓来のGMRESず同様になりたす
調べおみるずわかりやすそうなものもありたしたのでそちらを参考にお願いいたしたす

CGMRESのメむンアむディアはわかりたしたが最終的にどんな問題を解けばいいのかずいうず

\frac{\boldsymbol{F}(U+h\dot{U}, x+h\dot{x}, t+h)-\boldsymbol{F}(U, x, t)}{h} = - \zeta\boldsymbol{F}(U,x,t)

の匏は https://github.com/blockahead/CGMRES
の䞭のPDFにも曞いおありたすがいろいろこちゃこちゃ倉換をしおいきたす
するず

-\frac{\partial F(U, x+h\dot{x}, t+h)}{\partial U} \dot{U}= - \zeta\boldsymbol{F}(U,x,t) - \frac{\boldsymbol{F}(U, x+h\dot{x}, t+h)-\boldsymbol{F}(U, x, t)}{h} 

最終的にはこれを解けばよくなりたす
しかも巊蟺の偏埮分の匏は求めなくお倧䞈倫です

するず䜕かこの方皋匏は解けそうではありたせんか
単玔に$\dot{x}$は状態の埮分倀なのでもずもずの状態方皋匏からすぐに算出するこずができたす
$F$はすでに圢は離散化されお求たっおいるので初期倀$x$ず初期掚定解$U$があれば状態方皋匏随䌎方皋匏から求めるこずができたす
$h, \zeta$は事前のパラメヌタですのでもうこれで分からないものはないわけです

よっおこれで$\dot{U}$を求めるこずができるわけです
こうすれば反埩法ではなく$U$を求めるこずができたすGMRES自䜓は反埩ですがモデル予枬内での反埩は行いたせん$\dot{U}$からは近䌌積分すればすぐに$U$を求めるこずができたす

具䜓的なプログラムは最埌に添付したした
䞊蚘の説明で䞍十分なずころは繰り返しにはなりたすが倧塚先生の本を参考にしおいただければず思いたす

数倀解析条件

条件はプログラム内にも蚘茉しおいたすが

self.zeta = 100. # 安定化ゲむン
self.ht = 0.01 # 差分近䌌の幅
self.tf = 1. # 最終時間
self.alpha = 0.5 # 時間の䞊昇ゲむン
self.N = 10 # 分割数
self.threshold = 0.001 # break倀

たた初期掚定解$ \boldsymbol{U}$に぀いおは
適圓に目凊を぀けお䞎えおいたす

ずしおいたす
モデル予枬内での制埡呚期時間を少し倉化させおいたすが本質的にやっおいるこずは倉わりたせんので気にする必芁はないず思いたす

数倀解法結果

以䞋のようになりたした非線圢最適制埡入門の教科曞の埌ろのほうに茉っおいる答えず同様です
しっかりず状態入力ずもに0に萜ち着き最適性条件も倧䜓のオヌダヌで収たっおいるこずが分かりたす
さらに制玄条件も考慮できおいるこずがわかりたす

Figure_1.png

独立二茪モデルぞの適甚

実はこれ独立二茪にも適甚するこずがもちろん可胜です
党お同様に行いたす割愛したすが偏埮分を行えばよいだけです
他もほずんど倉わりたせん
行列のサむズ等をいじればよいだけです

今回の問題蚭定はある点から原点に向かうものですが
モデルず評䟡関数は以䞋のように蚭定したす

\frac{d}{dt}
\boldsymbol{X}=
\frac{d}{dt}
\begin{bmatrix}
x \\
y \\
\theta
\end{bmatrix}
= 
\begin{bmatrix}
\cos(\theta) & 0 \\
\sin(\theta) & 0  \\
0 & 1 \\
\end{bmatrix}
\begin{bmatrix}
u_v \\
u_\omega \\
\end{bmatrix}
=
\boldsymbol{B}\boldsymbol{U}
J = \boldsymbol{X}(t_0+T)^2 + \int_{t_0}^{t_0 + T} \boldsymbol{U}(t)^2 - 0.01 dummy_{u_v} - dummy_{u_\omega} dt 

結果はこんな感じ
しっかり初期倀から原点ぞむかっおいたすね制玄も考慮できおいたす
ちなみに偏差が残るのは非ホロノミックの性質的な問題です
倧塚先生の論文を調べるず曞いおありたす

軌跡

image.png

時刻歎
䞊から、$x, y, \theta$です

Figure_1.png
Figure_2.png

最埌に

今回は非線圢モデル予枬制埡におけるCGMRES法の実装を行いたした
高速解法等はやはり数孊の知識が必須なので数孊をもう少し勉匷したほうがよさそうですね

にしおも速いですけど
どこたで最適解の远跡ができるのか気になるずころではありたすね 

プログラム

長いのでgithubぞおきたした

usageだけ曞いおおきたす

https://github.com/Shunichi09/nonlinear_control
をcloneしお
カレントディレクトリをcgmresたで移動

$ cd nmpc/cgmres
$ python main_example.py

で教科曞のプログラム

$ python main_two_wheeled.py

で二茪のプログラム実行できたす

Requirementですが

  • python3.5 or more
  • numpy
  • matplotlib

で動きたす

70
53
6

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
70
53

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?