You are on page 1of 3

探索与交流

基于Python工具库的最优控制问题求解研究
度 巍 吴轶杰 陈昊泽 何坤泳

(南通大学交通与土木工程学院 江苏南通 226019)

摘 要:最优控制理论广泛应用于对交通工程、经济管理等领域的复杂动态系统优化。由于最优控制模型包括控制决策、
状态、协态乘子等诸多变量,通常在求解上十分复杂。在对最优控制模型基本概念介绍基础上,重点针对固定终
端时间下的三类问题,通过构建哈密顿函数,得到相应的最优解必要条件,推导出状态与协态所满足的微分方程
组,进一步利用Python的符号工具库(Sympy),对微分方程组以及系数进行了求解,最后绘制了相应的最优控制策
略以及状态轨迹图,案例求解为控制类专业相关课程的教学提供了素材。
关键词:最优控制理论 哈密顿函数 Python语言 Sympy工具库

引言 数,第二项表示了整个控制时期内的累积性能。当对控制
最优控制理论在交通工程、经济金融等诸多领域都有 策略存在取值约束时,需要通过极小值原理等方法来确定
着广泛的应用,成为高校应用数学类、控制类专业高年级 模型的最优性条件,本文重点探讨以下形式的最优控制模
本科生或者研究生相关课程内容。由于最优控制涉及对随 型及相应的Python求解步骤:
时间变化的动态系统性能进行优化,模型包含控制策略、
协态乘子等抽象概念,最优性条件推导繁琐复杂,往往需 min J [U (t )] (5)
要借助相关计算机语言编程才能更好地实现求解。 dX (t )
= f ( X (t ), U (t ), t )
Python作为近十年来新兴的编程语言,通过开源的大 dt
量工具库,使其在数值计算方面性能日益卓越,逐渐受到 =X (t0 ) X= 0 , N (t f , X (t f )) 0
高校师生的青睐,在Python的符号工具库(Sympy)中,可实 二、 固 定 终 端 时 间 下 的 最 优 控 制 模 型 案 例 及Python
现各种符号计算操作,同时包含对微分方程组、线性方程 求解
组等问题求解的相关函数。本文针对最常见的固定终止时 从(5)式可以看出,控制的起始时刻 t0 与终端时刻 t f
间的三种最优控制模型,展示如何利用Python语言实现最 固定,终端状态受到约束,假设系统的状态转移方程为:
优控制策略的求解,并绘制出相应的状态轨迹图,为相关 dx1 (t ) (6)
= x2 (t )
概念的讲授提供Python教学素材。 dt
一、最优控制模型 (7)
dx2 (t )
在考虑时间变化的动态系统中,相关要素状态变化率 = u (t )
dt
通常用微分方程或者方程组表示[1]: 接下来分析如下三种情形:
dX (t ) (1) 类型1:考虑性能泛函为:
= f ( X (t ), U (t ), t )
dt 1 2 2 (8)
2 ∫0
J (u ) = u (t )dt
其中 X (t ) 表示 n 维状态向量, f = ( f1 , f 2 , f n )T 是 n 维
向量函数, U (t ) 表示 m 维控制向量 U = (u1 , u2 ,um )T 。在实 同时边界条件为:
际的问题中,有时对控制策略有如下取值范围约束: x1 (0) 0,=
= x2 (0) 0,=
x1 (2) 5,=
(9) x2 (2) 2
U min ≤ U (t ) ≤ U max (2) 类型1求解分析:利用模型对应的最优性条件,设与状
同时对终端时刻和终端状态也有约束: 态转移方程(6)(7)对应的协态乘子分别为 p1 (t ), p2 (t ) .构造哈
N (t f , X (t f )) = 0 (3) 密顿函数:
系统的性能指标是一个泛函,与系统转移过程中的控 1 (10)
H ( x, u , p, t ) =u 2 (t ) + p1 ( x) x2 (t ) + p2 ( x)u (t )
2
制 U (t ) 与状态轨迹 X (t ) 有关。通常性能指标可以表达为:
*
(4) 最优控制策略 u (t ) 以及对应的协态乘子 p1* (t ), p2* (t )
t

J [U (t )] θ [t f , X (t f )] + L( X (t ), U (t ), t )dt
f
=
t0

满足如下必要条件[1]:
(4)式的右端第一项表示了与终端时刻状态相关的函

**基金项目:2022年南通大学大学生创新训练项目(项目编号:2022204);2022年南通大学大学生创新训练项目(项目
编号:2022211);2022年南通大学研究生在线课程建设项目(项目编号:ZXKC22_07)。

205
世纪之星

∂H (11) eqr1 = C1 + C2*t + C3*t**2/2 + C4*t**3/6


=0
∂u * eqr2 = C2 + C3*t + C4*t**2/2

dpi* (t ) ∂H (12) eqr21 = -C3 - C4*t;


=
− ,i =
1, 2
dt ∂xi eqr3 = eqr1.subs(t, 0)
*
(t ) 关于协态乘子与状态轨迹
利用(11)式可以得到 u eqr4 = eqr1.subs(t, 2)
*
的表达式,而由(12)式可得到协态 pi (t ) 的微分表达式。 eqr5 = eqr2.subs(t, 0)
相应的Python求解代码为: eqr6 = eqr2.subs(t, 2)
import sympy as sym solution1=solve([eqr3,eqr4-5,eqr5,eqr6-
x1 = sym.Symbol(“x1”) 2],[C1,C2,C3,C4])
x2 = sym.Symbol(“x2”) print(solution1)
p1 = sym.Symbol(“p1”) eqr1 = eqr1.subs(solution1)
p2 = sym.Symbol(“p2”) eqr2 = eqr2.subs(solution1)
u = sym.Symbol(“u”) eqr21=eqr21.subs(solution1)
11 9
Dx1=x2 运行得到 C1 = 0, C2 = 0, C3 = 2 , C4 = 2 ,最终得到类型1的最

Dx2=u 优策略与对应的状态方程为:
g = sym.Symbol(“g”) u * (t=
)
11 9
− t (14)
2 2
g=0.5*u**2 *
x1= (t )
11 2 3 3
t − t
4 4
H = sym.Symbol(“H”) 11 9 2
x2* =
(t ) t− t
2 4
H=g+p1*Dx1+p2*Dx2
Dp1=-sym.diff(H,x1) 画出对应的轨迹如图1所示:
Dp2=-sym.diff(H,x2)
du=sym.diff(H,u)
sol_u=sym.solve(du,u)
print(sol_u)
运行上面代码可以解出 u* (t ) = − p2* (t ) ,将该表达式替换
(6),(7),(12)式中的 u (t ) ,可得到最优状态与协态乘子所满
足的微分方程组,应用Sympy工具库的dsolve函数解此微分
方程组,相应的Python代码如下: 图1 类型1对应的最优控制策略与状态轨迹图
x1,x2,p1,p2 = symbols(‘x1 x2 p1 p2’,real=True,nonzero 类型2:考虑性能泛函为:
=True,positive=True,cls=Function) J (=
u)
1 1 1 2
( x1 (2) − 2) 2 + ( x2 (2) − 5) 2 + ∫ u 2 (t )dt (15)
2 2 2 0
eq1=Eq(diff(x1(t),t,1),x2(t)) 同时边界条件为:
eq2=Eq(diff(x2(t),t,1),-p2(t)) (16)
x1 (0) 0,=
= x2 (0) 0, x1 (2)自
由 , x2 (2)
eq3=Eq(diff(p1(t),t,1),0)
eq4=Eq(diff(p2(t),t,1),-p1(t)) 求解过程:该类型属于终端状态自由的类型,由于性
sol =dsolve([eq1,eq2,eq3,eq4]) 能泛函(15)的积分部分与类型1对应(8)式相同,对应的哈密
print(sol) 顿函数也与类型1相同,从而求解出的最优状态与协态表达
运行上面代码,即可得到最优状态与协态的表达式如下: 式同(13)式,设(15)中的终端状态函数为 θ [ x1 (2), x2 (2)] ,即:
1 1
x1* (t ) =C1 + C2t + C3t 2 + C4t 3 1 1 (17)
2 6 (13) θ [ x (2), x (2)]
= ( x (2) − 2) 2 + ( x (2) − 5) 2
1 2 1 2
* 1 2
2 2
x2 (t ) = C2 + C3t + C4t
2
p1* (t ) = C4 考虑协态乘子的边界条件得:
p2* (t ) =−C3 − C4t *
1 (2)
p=
∂θ [ x1* (2), x2* (2)]
= x1* (2) − 2 (18)
∂x1* (2)
其中 C1 , C2 , C3 , C4 为待定的系数。接下来根据边界条件
(9),构建待定系数需要满足的线性方程组,应用solve函数 * ∂θ [ x1* (2), x2* (2)] (19)
2 (2)
p= = x2* (2) − 5
∂x2* (2)
可求解出待定系数值,相应代码为:
C1 = symbols(‘C1’) 将(18),(19)与状态在 t = 0 的边界条件一起考虑,形
C2 = symbols(‘C2’) 成求解类型2的待定系数线性方程组,同样应用Sympy工具
C3 = symbols(‘C3’) 库的solve函数求解,相应的Python代码如下:
C4 = symbols(‘C4’)

206
探索与交流

eqr1 = C1 + C2*t + C3*t**2/2 + C4*t**3/6 eqr11 = C4;


eqr2 = C2 + C3*t + C4*t**2/2 eqr21 = -C3 - C4*t;
eqr11 = C4; eqr3 = eqr1.subs(t, 0)
eqr21 = -C3 - C4*t; eqr4 = eqr1.subs(t, 2)
eqr3 = eqr1.subs(t, 0) eqr5 = eqr2.subs(t, 0)
eqr4 = eqr1.subs(t, 2) eqr6 = eqr2.subs(t, 2)
eqr5 = eqr2.subs(t, 0) eqr7 = eqr11.subs(t, 2)
eqr6 = eqr2.subs(t, 2) eqr8 = eqr21.subs(t, 2)
eqr7 = eqr11.subs(t, 2) solution1=solve([eqr3,eqr4-17+4*eqr6,eqr5,4*eqr6-
eqr8 = eqr21.subs(t, 2) eqr8],[C1,C2,C3,C4])
solution1=solve([eqr3,eqr4-2-eqr7,eqr5,eqr6-5- print(solution1)
eqr8],[C1,C2,C3,C4]) 运行得到 C1 = 0, C2 = 0, C3 =
85
, C4 = −
153
,得到类型3对应的最优策
8 16
print(solution1) 略与对应的状态方程为:
19 4 85 153
运行得到 =
C1 0,=
C2 0,=
C3
21
, C4
=
7
,得到类型2的最优策略与 u * (=
t) −
8 16
t (19)
对应的状态方程为: * 85 2 153 3
1 (t )
x= t − t
16 96
u * (=
t)
19 4
+ t
(20) * 85 153 2
21 7 x2=(t ) t− t
8 32
* 19 2
1 (t )
x= t2 + t3
42 21 相应的轨迹如图3所示:
19 2 2
x2*=(t ) t+ t
21 7
对应的轨迹如图2所示:

图3 问题3对应的最优控制策略与状态轨迹图
结语
图2 类型2对应的最优控制策略与状态轨迹图 在高校的数值计算软件中,过去MATLAB长期处于主
类型3考虑性能泛函为: 导地位。作为近十年来新兴的编程语言,Python通过开源
1 2 2 (21) 的大量工具库,在数值计算,网络爬虫,深度学习等方面
2 ∫0
J (u ) = u (t )dt

表现出卓越的性能,同时包含对微分方程组、线性方程组
同时边界条件为: 等问题求解的相关函数。本文针对最常见的固定终止时间
x1 (0) = 0, x2 (0) = 0, x1 (2) + 4 x2 (2) = 17 (22) 的三种最优控制模型,展示如何利用Python语言实现最优
求解过程:问题3属于终端状态受约束类型,由于性 控制策略的求解,并绘制出相应的状态轨迹图,为相关概
能泛函的积分项同问题1、2一样,通过最优性条件得到的 念的讲授提供Python教学素材。
最优状态与协态表达式同(13)式,设(22)中的终端状态受约 参考文献
束表示为 N [ x1 (2), x2 (2)] = 0 ,即: [1]D.E.Kirk.Optimal control theory: an introduction[M].
N [ x1 (2), x2 (2)] =x1 (2) + 4 x2 (2) − 17 (23) Dover Publications Inc,2004.
考虑类型3协态乘子的边界条件得: [2]D.S.Naidu.Optimal control systems[M].CRC Press
p1* (2)
=
p2* (2)
(24) LLC,2013.
∂N [ x1* (2), x2* (2)] ∂N [ x1* (2), x2* (2)]
∂x1* (2) ∂x2* (2) [3]胡寿松,王执铨,胡维礼.最优控制理论与系统[M].科学
即: 4 p1* (2) = p2* (2) (25) 出版社,2010.
将(25)与 边 界 条 件(22)作 为 求 解 类 型3待 定 系 数 的 特 [4]余本国.Python数据分析课程教学课件制作与设计[J].
值条件,同样应用Sympy工具库的solve函数求解,相应的 电脑知识与技术,53-55.
Python代码如下: 作者简介
eqr1 = C1 + C2*t + C3*t**2/2 + C4*t**3/6 度巍,(1982.5-),男,汉族,湖北荆州人,博士,副
eqr2 = C2 + C3*t + C4*t**2/2 教授,研究方向:从事交通系统工程方面研究。

207

You might also like