ã¯ããã«
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$ãæå°åããåé¡ã¯ïŒäºç¹å¢çå€åé¡ã«èœãšãããšãã§ããããã§ãïŒ
ã¡ãªã¿ã«ãã®æµãããã¹ãŠã®æé©å¶åŸ¡åé¡ã§åæ§ã®æµãã§ãïŒãªã«ããã§äžç¬ã§è§£ããŠããŸãç¡éæéæé©å¶åŸ¡åé¡ããã®æµããå¿ èŠã«ãªãã®ã«å€ãã®å Žå岿ãããŠèª¬æãããŠããŸãïŒïŒæ²ããã§ãïŒ
ãããïŒããã©ã®ããã«ããã°è§£ããã®ã§ãããã
è§£æçã«è§£ãã®ã¯é£ããã®ã§ïŒå埩æ³ã§è§£ããŸãïŒ
åºæ¬çãªã¢ã«ãŽãªãºã ã¯ä»¥äžã®éãã§ãïŒ
- ãŸãïŒåæç¶æ $\boldsymbol{x}$ãååŸãã
- åææšå®è§£$\boldsymbol{u}(t)$ãé©åœã«æ±ºå®ãã
- 1,æšå®è§£$\boldsymbol{u}(t)$ãçšããŠïŒæªæ¥ã®ç¶æ ãšéäŒŽç¶æ ãç¶æ æ¹çšåŒïŒé䌎æ¹çšåŒããæ±ãã
- æé©æ§æ¡ä»¶ãæºããã確èª
- æšå®è§£$\boldsymbol{u}(t)$ãäœããã®æéã§æ¹å
- 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ã«èœã¡çãïŒæé©æ§æ¡ä»¶ã倧äœã®ãªãŒããŒã§åãŸã£ãŠããããšãåãããŸãïŒ
ããã«ïŒå¶çŽæ¡ä»¶ãèæ
®ã§ããŠããããšãããããŸãïŒ
ç¬ç«äºèŒªã¢ãã«ãžã®é©çš
å®ã¯ããç¬ç«äºèŒªã«ãé©çšããããšããã¡ããå¯èœã§ãïŒ
å
šãŠåæ§ã«è¡ããŸãïŒïŒå²æããŸããïŒå埮åãè¡ãã°ããã ãã§ãïŒ
ä»ãã»ãšãã©å€ãããŸãã
è¡åã®ãµã€ãºçããããã°ããã ãã§ã
ä»åã®åé¡èšå®ã¯ããç¹ããåç¹ã«åãããã®ã§ããïŒ
ã¢ãã«ãšè©äŸ¡é¢æ°ã¯ä»¥äžã®ããã«èšå®ããŸãïŒ
\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
çµæã¯ãããªæãïŒ
ãã£ããåæå€ããïŒåç¹ãžããã£ãŠããŸããïŒå¶çŽãèæ
®ã§ããŠããŸã
ã¡ãªã¿ã«åå·®ãæ®ãã®ã¯éãããããã¯ã®æ§è³ªçãªåé¡ã§ã
ïŒå€§å¡å
çã®è«æã調ã¹ããšæžããŠãããŸãïŒ
è»è·¡
æå»æŽ
äžããã$x, y, \theta$ã§ã
æåŸã«
ä»åã¯éç·åœ¢ã¢ãã«äºæž¬å¶åŸ¡ã«ããã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
ã§åããŸã



