用庞特里亚金极小值原理求解二阶系统的最优控制问题

本文主要是介绍用庞特里亚金极小值原理求解二阶系统的最优控制问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

庞特里亚金极小值原理
1
庞特里亚金极小值原理是在控制向量u(t)受限制的情况下,使得目标函数J取极小,从而求解最优控制问题的原理和方法,又称极大值原理。λ是协态向量,系统模型有多少个变量就有多少个协态。s和u都是省略了符号t的,代表某一时刻的最优状态和最优控制,是一个常数。利用庞特里亚金极小值原理求解最优控制问题首先需要求解协态方程,也就是λ,然后再求解最优控制u*,求解完u*之后,即可得到最优状态。
下面以一个简单的二阶系统为例,简单说明如何用庞特里亚金极小值原理求解二阶系统的最优控制问题。

1. 问题描述

二阶系统的状态s为: s = [ x x ˙ ] s = \left[ \begin{array} { l } { x } \\ { \dot { x } } \end{array} \right] s=[xx˙],控制量u为: u = [ x ¨ ] u = [ \ddot { x } ] u=[x¨],可以将状态s想象成x方向的位移以及x方向上的速度,将控制量u想象成x方向上的加速度,通过输入控制量来改变系统的状态。将问题定义为:试求控制u,将系统在t=2时转移到零态,并使得J取极小值。

系统模型为:
s ˙ = [ 0 1 0 0 ] s + [ 0 1 ] u = [ 0 1 0 0 ] [ x x ˙ ] + [ 0 1 ] x ¨ \begin{aligned} \dot { s } & = \left[ \begin{array} { l l } { 0 } & { 1 } \\ { 0 } & { 0 } \end{array} \right] s + \left[ \begin{array} { l } { 0 } \\ { 1 } \end{array} \right] u = \left[ \begin{array} { l l } { 0 } & { 1 } \\ { 0 } & { 0 } \end{array} \right] \left[ \begin{array} { l } { x } \\ \dot { x } \end{array} \right] + \left[ \begin{array} { l } { 0 } \\ { 1 } \end{array} \right] \ddot { x } \end{aligned} s˙=[0010]s+[01]u=[0010][xx˙]+[01]x¨
目标函数为:
J = 1 2 ∫ 0 2 u 2 d t J = \frac { 1 } { 2 } \int _ { 0 } ^ { 2 } u ^ { 2 } d t J=2102u2dt

2. 求解协态方程

根据庞特里亚金极小值原理中的:
λ ˙ ( t ) = − ∇ s H ( s ∗ ( t ) , u ∗ ( t ) , λ ( t ) ) \dot { \lambda } ( t ) = - \nabla _ { s } H \left( s ^ { * } ( t ) , u ^ { * } ( t ) , \lambda ( t ) \right) λ˙(t)=sH(s(t),u(t),λ(t))
先写出哈密顿函数,然后根据哈密顿函数列出协态方程,并求解。
哈密顿函数为:
H = 1 2 u 2 + λ 1 s 2 + λ 2 u H = \frac { 1 } { 2 } u ^ { 2 } + \lambda _ { 1 } s_ { 2 } + \lambda _ { 2 } u H=21u2+λ1s2+λ2u
两个λ分别乘上对应的系统模型 s ˙ \dot { s } s˙中的两个元素s2和u,其中s2就代表s的第二行的元素(同时也是 s ˙ \dot { s } s˙中第一行的元素),也就是x方向的速度。u即为控制量(同时也是 s ˙ \dot { s } s˙中第二行的元素),这样就得到了哈密顿函数。
将哈密顿函数分别对s1和s2(状态矩阵 s {s} s中的元素)求导,并将s和u这两个常量代入可得协态方程:
λ ˙ 1 ( t ) = − ∂ H ∂ s 1 = 0 ⇒ λ 1 ( t ) = a 1 \dot { \lambda } _ { 1 } ( t ) = - \frac { \partial H } { \partial s _ { 1 } } = 0 \quad \Rightarrow \lambda _ { 1 } ( t ) = a _ { 1 } λ˙1(t)=s1H=0λ1(t)=a1

λ ˙ 2 ( t ) = − ∂ H ∂ s 2 = − λ 1 ( t ) ⇒ λ 2 ( t ) = − a 1 t + a 2 \dot { \lambda } _ { 2 } ( t ) = - \frac { \partial H } { \partial s _ { 2 } } = - \lambda _ { 1 } ( t ) \Rightarrow \lambda _ { 2 } ( t ) = - a _ { 1 } t + a _ { 2 } λ˙2(t)=s2H=λ1(t)λ2(t)=a1t+a2
通过求解上述的微分方程即可求得λ。

3. 求解最优控制

根据庞特里亚金极小值原理中的:
u ∗ ( t ) = arg ⁡ min ⁡ u ( t ) H ( s ∗ ( t ) , u ( t ) , λ ( t ) ) u ^ { * } ( t ) = \arg \min _ { u ( t ) } H \left( s ^ { * } ( t ) , u ( t ) , \lambda ( t ) \right) u(t)=argu(t)minH(s(t),u(t),λ(t))

最优的u*的选取是,当哈密顿函数中的s取最优时,能够使得哈密顿函数最小的那个u即为最优控制量。令导数等于0即可:
∂ H ∂ u = u + λ 2 = 0 ⇒ u = − λ 2 = a 1 t − a 2 \frac { \partial H } { \partial u } = u + \lambda _ { 2 } = 0 \quad \Rightarrow u = - \lambda _ { 2 } = a _ { 1 } t - a _ { 2 } uH=u+λ2=0u=λ2=a1ta2
求得u的表达式之后,对u进行两次积分可以得到s1和s2(状态矩阵 s {s} s中的元素):
s 1 = 1 6 a 1 t 3 − 1 2 a 2 t 2 + a 3 t + a 4 s 2 = 1 2 a 1 t 2 − a 2 t + a 3 \begin{array} { l } {s _ { 1 } = \frac { 1 } { 6 } a _ { 1 } t ^ { 3 } - \frac { 1 } { 2 } a _ { 2 } t ^ { 2 } + a _ { 3 } t + a _ { 4 } } \\ { s _ { 2 } = \frac { 1 } { 2 } a _ { 1 } t ^ { 2 } - a _ { 2 } t + a _ { 3 } } \end{array} s1=61a1t321a2t2+a3t+a4s2=21a1t2a2t+a3

将初始条件和终端条件代入可求得:
u ∗ ( t ) = 9 2 t − 5 u ^ { * } ( t ) = \frac { 9 } { 2 } t - 5 u(t)=29t5

这篇关于用庞特里亚金极小值原理求解二阶系统的最优控制问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/179977

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明