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

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

庞特里亚金极小值原理
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

相关文章

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

Redis出现中文乱码的问题及解决

《Redis出现中文乱码的问题及解决》:本文主要介绍Redis出现中文乱码的问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 问题的产生2China编程. 问题的解决redihttp://www.chinasem.cns数据进制问题的解决中文乱码问题解决总结

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

全面解析MySQL索引长度限制问题与解决方案

《全面解析MySQL索引长度限制问题与解决方案》MySQL对索引长度设限是为了保持高效的数据检索性能,这个限制不是MySQL的缺陷,而是数据库设计中的权衡结果,下面我们就来看看如何解决这一问题吧... 目录引言:为什么会有索引键长度问题?一、问题根源深度解析mysql索引长度限制原理实际场景示例二、五大解决

Springboot如何正确使用AOP问题

《Springboot如何正确使用AOP问题》:本文主要介绍Springboot如何正确使用AOP问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录​一、AOP概念二、切点表达式​execution表达式案例三、AOP通知四、springboot中使用AOP导出

Python中Tensorflow无法调用GPU问题的解决方法

《Python中Tensorflow无法调用GPU问题的解决方法》文章详解如何解决TensorFlow在Windows无法识别GPU的问题,需降级至2.10版本,安装匹配CUDA11.2和cuDNN... 当用以下代码查看GPU数量时,gpuspython返回的是一个空列表,说明tensorflow没有找到

深度解析Spring AOP @Aspect 原理、实战与最佳实践教程

《深度解析SpringAOP@Aspect原理、实战与最佳实践教程》文章系统讲解了SpringAOP核心概念、实现方式及原理,涵盖横切关注点分离、代理机制(JDK/CGLIB)、切入点类型、性能... 目录1. @ASPect 核心概念1.1 AOP 编程范式1.2 @Aspect 关键特性2. 完整代码实

解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题

《解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘问题》:本文主要介绍解决未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4... 目录未解析的依赖项:‘net.sf.json-lib:json-lib:jar:2.4‘打开pom.XM