| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Python知识库 -> 数值法求解最优控制问题(一)——梯度法 -> 正文阅读 |
|
[Python知识库]数值法求解最优控制问题(一)——梯度法 |
最优控制问题可以使用变分法来进行求解,当问题是有约束的最优控制问题时,可以采用极小值原理求解该最优控制问题。上述方法称为解析法。但是,一旦问题约束条件或目标函数复杂,使用解析法求解最优控制问题面临着极大困难,也有可能出现解析解难以求解的问题。 为此,研究者将目光转向了数值解法。 数值解法的本质就是代替了人用脑和手计算最优控制问题的过程,采用数值优化技术完成控制结果的求解。 下面介绍一种实现简单的数值解法,即梯度法(gradient method,GM)。 梯度法梯度法的另一个名字是最速下降法(steepest descent method,SDM),基本思想是先根据Pontryagin极大值原理(后文简称极大值原理)推导一阶最优必要性条件,求取最优控制 u ? u^* u? 使得哈密顿函数 H H H 最小。 算法流程是首先根据经验猜测一个初始控制量 u 0 u^0 u0,再通过数值算法求出 H 0 H^0 H0 。随后根据求出的 H 0 H^0 H0 来修改 u u u ,使得 H H H 继续减小,直到趋近最小值停止。修改 u u u 的目的就是为了让 H H H 逐渐减少,修改方向为 H H H 的“最陡下降”方向,即负梯度方向。这就是被称为梯度法的原因。 讨论一类控制不受约束的最优控制问题。 给定系统状态方程为 x ˙ = f ( x , u , t ) , (1) \boldsymbol{\dot x} = f(\boldsymbol{x},\boldsymbol{u},t), \tag{1} x˙=f(x,u,t),(1) 初始条件为 x ( t 0 ) = x 0 , (2) \boldsymbol x(t_0) = \boldsymbol{x}_0, \tag{2} x(t0?)=x0?,(2) 性能指标为 J ( u ) = Φ ( x T , T ) + ∫ T t 0 L ( x , u , t ) , (3) J(\boldsymbol u) = \Phi(\boldsymbol x_T,T) + \int_{T}^{t_0}L(\boldsymbol x, \boldsymbol u, t), \tag{3} J(u)=Φ(xT?,T)+∫Tt0??L(x,u,t),(3) 其中, Φ ( x T , T ) \Phi(\boldsymbol x_T,T) Φ(xT?,T) 被称为Mayer型性能指标(或称常值型性能指标), ∫ T t 0 L ( x , u , t ) \int_{T}^{t_0}L(\boldsymbol x, \boldsymbol u, t) ∫Tt0??L(x,u,t) 被称为Lagrange型性能指标,(或称积分型性能指标)。既有Mayer型,又有Lagrange型的性能指标 ( 3 ) (3) (3) 被称为Bolza型性能指标(或称复合型性能指标)。 在这里,最优控制的目标就是寻找一个 u ? u^* u? 使得 J J J 最小。 构造哈密顿函数为 H ( t , x , u , λ ) = L ( t , x , u ) + λ T ( t ) f ( x , u , t ) , (4) H(t,\boldsymbol{x},\boldsymbol{u},\boldsymbol{\lambda})=L(t,\boldsymbol{x},\boldsymbol{u}) + \boldsymbol{\lambda}^{\rm T}(t)f(\boldsymbol{x},\boldsymbol{u},t), \tag{4} H(t,x,u,λ)=L(t,x,u)+λT(t)f(x,u,t),(4) 省去推导步骤1,得到泛函 J k ( u ) J^k(\boldsymbol{u}) Jk(u) 在 u k ( t ) \boldsymbol{u}^k(t) uk(t) 处的梯度,即 ? J ( u k ) = ? H ? u k . (5) \nabla J(\boldsymbol{u^k}) = \frac{\partial H}{\partial \boldsymbol{u^k}}. \tag{5} ?J(uk)=?uk?H?.(5) 根据极大值原理,在 J ( u ) J(\boldsymbol{u}) J(u) 的极小点处满足下式,为 λ ˙ = ? ? H ? x , λ ( T ) = ? K ? x T , (6) \boldsymbol{\dot \lambda} = -\frac{\partial H}{\partial \boldsymbol{x}}, \quad \boldsymbol{\lambda}(T) = \frac{\partial K}{\partial \boldsymbol{x}_T}, \tag{6} λ˙=??x?H?,λ(T)=?xT??K?,(6) ? H ? u = 0. (7) \frac{\partial H}{\partial \boldsymbol{u}} = 0. \tag{7} ?u?H?=0.(7) 至此,求解最优控制问题变为联立求解方程 ( 1 ) (1) (1) 、 ( 2 ) (2) (2)、 ( 5 ) (5) (5)、 ( 6 ) (6) (6) 的两点边值问题(two-point boundary value problem,TPBVP)。 算法步骤下面给出梯度法的步骤。
下面会先给一个算例,再根据算例详细解释梯度法步骤,随后给出代码。 算例该算例选自《最优化与最优控制》第2版第257页例13.1。 设由状态方程及初始条件 x ˙ = ? x 2 + u \dot x = -x^2+u x˙=?x2+u , x 0 = 10 x_0=10 x0?=10 ,性能指标 J ( u ) = 0.5 ∫ 0 1 ( x 2 + u 2 ) d t J(u)=0.5\int_{0}^{1}(x^2+u^2)\text{d}t J(u)=0.5∫01?(x2+u2)dt ,求解最优控制使 J J J 为极小。 详细解释下面根据算例对梯度法步骤进行详细解释。 1)首先需要推导出哈密顿函数 ( 4 ) (4) (4) 、伴随方程 ( 5 ) (5) (5) 和梯度 ( 6 ) (6) (6) 的表达式,为 H = 0.5 ? ( x 2 + u 2 ) ? λ ( x 2 + u ) , λ ˙ = ? ? H ? x = ? x + 2 λ x , λ ( 1 ) = 1 , ? J = ? H ? u = u + λ . \begin{aligned} &H = 0.5*(x^2+u^2) - \lambda (x^2+u), \\ &\boldsymbol{\dot \lambda} = -\frac{\partial H}{\partial x} = -x + 2\lambda x, \quad \lambda(1) = 1, \\ &\nabla J = \frac{\partial H}{\partial u} = u+\lambda. \end{aligned} ?H=0.5?(x2+u2)?λ(x2+u),λ˙=??x?H?=?x+2λx,λ(1)=1,?J=?u?H?=u+λ.? 2)猜测第 0 步的控制量。因为 λ ( 1 ) = 1 \lambda(1) = 1 λ(1)=1 ,要让 ? J = u ( 1 ) + λ ( 1 ) = 0 \nabla J = u(1)+\lambda(1) = 0 ?J=u(1)+λ(1)=0,那么有 u ( 1 ) = 0 u(1)=0 u(1)=0。不妨先设 u 0 ( t ) = 0 u^0(t)=0 u0(t)=0。 代码实现如下。
3)正向积分求 x ( t ) x(t) x(t)。把 u 0 ( t ) = 0 u^0(t)=0 u0(t)=0 代入状态方程中,为 x 0 = ? ( x 0 ) 2 x^0 = -(x^0)^2 x0=?(x0)2。随后进行积分,并结合初值 x 0 ( 0 ) = 10 x^0(0)=10 x0(0)=10,求得 x 0 ( t ) = 10 1 + 10 t . x^0(t)=\frac{10}{1+10t}. x0(t)=1+10t10?. 代码实现如下。
4)反向积分求 λ ( t ) \lambda(t) λ(t)。把 x 0 ( t ) = 10 1 + 10 t x^0(t)=\frac{10}{1+10t} x0(t)=1+10t10? 代入伴随方程中,得到 λ ˙ 0 ( t ) = 20 1 + 10 t λ 0 ? 10 1 + 10 t , \dot \lambda^0(t) = \frac{20}{1+10t}\lambda^0 - \frac{10}{1+10t}, λ˙0(t)=1+10t20?λ0?1+10t10?, 结合末值条件 λ ( 1 ) = 0 \lambda(1) = 0 λ(1)=0,得到 λ 0 ( t ) = 0.5 [ 1 ? ( 1 + 10 t ) 2 121 ] . \lambda^0(t) = 0.5 \left[1 - \frac{(1+10t)^2}{121} \right]. λ0(t)=0.5[1?121(1+10t)2?]. 代码实现如下。
5)计算梯度。将 u 0 ( t ) = 0 u^0(t)=0 u0(t)=0 和 λ 0 ( t ) = 0.5 [ 1 ? ( 1 + 10 t ) 2 121 ] \lambda^0(t)=0.5 \left[1 - \frac{(1+10t)^2}{121} \right] λ0(t)=0.5[1?121(1+10t)2?] 代入 ? J = u + λ \nabla J = u+\lambda ?J=u+λ 中,得到 ? J ( u 0 ) = 0.5 [ 1 ? ( 1 + 10 t ) 2 121 ] . \nabla J(u^0) = 0.5 \left[1 - \frac{(1+10t)^2}{121} \right]. ?J(u0)=0.5[1?121(1+10t)2?]. 代码实现如下。
6)确定步长和修改量。在本算例中,将步长定为 K = 0.55 K=0.55 K=0.552,那么控制修改量为 Δ u 0 ( t ) = ? 0.275 [ 1 ? ( 1 + 10 t ) 2 121 ] . \Delta u^0(t) = - 0.275 \left[1 - \frac{(1+10t)^2}{121} \right]. Δu0(t)=?0.275[1?121(1+10t)2?]. 计算性能指标,为 ? J ( u 0 ) = ? 1 4 ∫ 0 1 [ 1 ? ( 1 + 10 t ) 2 121 ] 2 d t . \nabla J(u^0) = -\frac{1}{4}\int_{0}^{1} \left[1 - \frac{(1+10t)^2}{121} \right]^2 \text{d}t. ?J(u0)=?41?∫01?[1?121(1+10t)2?]2dt. 代码实现如下。
7)更新控制量。按照 u 1 ( t ) = u 0 ( t ) + Δ u 0 ( t ) u^1(t)=u^0(t)+\Delta u^0(t) u1(t)=u0(t)+Δu0(t) 更新控制量,为 u 1 ( t ) = ? 0.275 [ 1 ? ( 1 + 10 t ) 2 121 ] . u^1(t) = - 0.275 \left[1 - \frac{(1+10t)^2}{121} \right]. u1(t)=?0.275[1?121(1+10t)2?]. 代码在第6)步已经给出。 8)循环迭代。按照上述步骤循环迭代3)—7)步,直至满足条件要求 代码前面给的代码是部分代码,在这里给出完整代码。 此代码我做了一些修改,主要有:
结果仿真结果图如下。 状态量和控制量变化曲线为 性能指标变化曲线为 从性能指标的结果来看,梯度法迭代了5步就已经找到最优控制量 u ? ( t ) u^*(t) u?(t) 。 对比为了不同算法、步长对于最优控制问题结果的影响,这里分别给出了3个对比实验的例子,分别是:
梯度法和共轭梯度法对比共轭梯度法在完整代码中已经给出。共轭梯度法与梯度法的不同在于更新控制量的修改方向。梯度法是沿着负梯度方向修改控制量,共轭梯度法是沿着共轭梯度方向3修改控制量。《最优化与最优控制》第2版第268页中指出,“用共轭梯度法求最优控制,计算程序容易实现,计算可靠性好,收敛速度比梯度法快,特别是对于二次泛函性能指标的最优控制问题更为有效。” 出于对这句话的好奇,本文用matlab编写了共轭梯度法代码,与梯度法进行对比,验证共轭梯度法是不是真的“收敛速度比梯度法快”。 因为前面已经做过仿真了,可以看到最优控制 u ? ( 0 ) ≈ ? 0.5 u^*(0) \approx -0.5 u?(0)≈?0.5,所以在代码是实现时令第1次迭代的控制量 u 0 ( t ) = ? 0.5 u^0(t)=-0.5 u0(t)=?0.5。代码如下。
在这里步长更新不用
仿真结果如下。 状态量变化曲线为 控制量变化曲线为 性能指标变化曲线为 可以看出,梯度法和共轭梯度法在求解本例最优控制问题中,所求得的控制量基本一致。所以由控制量决定的状态量也基本一致。 迭代次数也都是6次,不过共轭梯度法的性能指标下降速度更快一些,在第4步的时候甚至求得一个更小的性能指标。但因为在此步中没有满足终止条件,所以没有取到这个性能指标而是选择继续迭代。最终梯度法和共轭梯度法的性能指标都收敛于同一个值。 从上面的数值数值实验中,我们目前无法推断出“共轭梯度法收敛速度比梯度法快”的结论。原因可能在于步长选择得不太合适,或者该问题比较简单,无法突显共轭梯度法的优越性。 不同步长条件下的两种算法结果对比这里分别选取步长为 0.01、0.1 和 0.55 进行实验,实验过程中分别使用梯度法和共轭梯度法求解最优控制问题。 因为梯度法和共轭梯度法在不同步长下得到的控制量与状态量变化曲线差异较小,可以参考前面部分的图,所以这里不再给出状态量和控制量的图。仅给出性能指标迭代图,专注于迭代次数和收敛速度的分析。 仿真结果如下。 注: g m gm gm 代表梯度法, c g m cgm cgm 代表共轭梯度法。 从图中可以看出,步长为0.55时,梯度法和共轭梯度法的迭代次数均为6次。 如果缩小迭代步长,例如将步长设置为0.01、0.1,共轭梯度法的优势就体现出来了。 步长为0.01时,梯度法迭代次数为50次4,且性能指标没有收敛到最优值;共轭梯度法迭代次数为2次,性能指标收敛。 步长为0.1时,梯度法迭代次数为37次,共轭梯度法迭代次数为3次,性能指标均收敛。 通过对比不同步长条件下梯度法和共轭梯度法的仿真结果,可以发现,当步长取得比较小的时候,共轭梯度法的收敛速度更快,梯度法则需要一步一步地迭代,收敛速度慢;当步长取得比较大的时候,梯度法和共轭梯度法的收敛速度相差不大。 是否使用armijo准则搜索步长的两种算法结果对比下面设置初始步长为 0.55, 仿真结果如下。 注:
g
m
gm
gm 代表梯度法,
c
g
m
cgm
cgm 代表共轭梯度法;
a
r
m
i
j
o
armijo
armijo 代表使用 从上面两张图可以看出,对于这个算例来说,两种算法使用和不使用 梯度法中,使用 对于是否使用 思考一开始准备用matlab的数学工具箱来求这个最优控制问题的解析解的,但是发现这样一个简单的最优控制问题,用解析法来求都十分地困难,更不用说状态方程和约束条件更加复杂的最优控制问题了。所以开始考虑用数值解法来解这些问题。 选了最简单的梯度法尝试求解最优控制问题。但是在求解过程中发现自己从头到尾写代码就很难写对,一直报错。于是转换思路在网络上找找有没有开源的代码用,真的在mathwork的file exchange里找到了梯度法的代码。研究了一下代码,改换成了我要解决的问题,发现这个代码效果挺好的。 我发现了,当自己代码写不出来的时候,就该在网络上找找有没有合用的代码。开源这件事情很重要,能够帮助到有同样问题的后来者少走弯路,所以决心把自己解决这个问题的过程记录下来,把代码分享出去。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 | -2024/12/27 2:13:13- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |
数据统计 |