GPOPS-II教程
GPOPS结构
自定义函数
为了指定要解决的最优控制问题,用户必须编写以下MATLAB
函数
- 端点函数
endpoint fucntion
,端点函数定义了阶段的起始点和/或终止点、阶段的积分以及静态参数之间的相互关系,还定义了要最小化的成本 - 连续函数,连续函数定义了动力学,计算任意阶段的积分所需要的被积函数,以及问题任意阶段的路径约束
还要指定一些下限和上限
- 每个阶段的起始时间和终止时间
- 每个阶段的起始状态、过程状态和终止状态
- 每个阶段的控制
- 路径约束
- 事件约束
- 静态参数
setup
output = gpops2(setup);
- 输入是一个用户定义的结构,其中包含要解决的最优控制问题的所有信息
- 输出是一个结构,其中包含通过解决最优控制问题获得的信息
setup
结构体
name
: 无空格的字符串,通常是对控制问题的一定程度的描述function
: 包含端点函数endpoint function
和连续函数continuous function
的结构体bounds
: 包含变量上下限的结构体guess
: 包含对问题中的时间、状态、控制、积分和静态参数的猜测,time/state/control/integrals/static parameters
可选项
auxdata
: 包含可能用到的auxiliary data
的结构体derivatives
derivatives.supplier
: 指定NLP
求解器使用的导数近似,默认sparseFD
,还有sparseBD/sparseCD
derivatives.derivativelevel
: NLP求解器使用的导数阶first/second
scales
: 指定如何缩放的结构体scales.method
:none/automatic-bounds/automatic-guess
method
: 定义在解决问题时要使用的配置版本的字符串,微分:RPM-Differentiation
,积分:RPM-Integration
mesh
: 指定要使用的网格划分方法和网格划分精度公差信息的结构体mesh.method
: 网络细化方法,hp-PattersonRao
orhp-DarbyRao
orhp-LiuRao
orhp-LiuRao-Legendre
mesh.tolerance
: 0到1的正数,默认$10^{-3}$mesh.maxiteration
: 最大迭代次数,默认10mesh.colpointsmin
: 指定网格间隔中允许的配置点的最小数量,默认3mesh.colpointsmax
: 指定网格间隔中允许的配置点的最大数量,默认10phase
: 给定阶段的初始网络间隔和配置点mesh.phase.fraction
: 每个阶段的网络间隔,是一个0到1的缩放区间,N个间隔,行向量加起来等于1,默认0.1*ones(1,10)
mesh.phase.colpoints
: 每个阶段的配置点,也是行向量,默认4*ones(1,10)
nlp
: 指定要使用的NLP
求解程序和所选NLP
求解程序中要使用的选项的结构体nlp.solver
: 求解器,snopt
oripopt
nlp.ipoptoptions
nlp.ipoptoptions.linear_solver
:mumps
orma57
nlp.ipoptoptions.tolerance
: 默认$10^{-7}$nlp.ipoptoptions.maxiterations
: 默认2000
nlp.snoptoptions
nlp.snoptoptions.tolerance
: 默认$10^{-6}$nlp.snoptoptions.maxiterations
: 默认2000
displaylevel
: 提供GPOPS-II
执行期间发送到MATLAB
命令窗口的输出量,0或1或2,默认2
setup.function
在setup
中指定MATLAB
函数名称的语法
setup.functions.continuous = @continuousfun
setup.functions.endpoint = @endpointfun
setup.functions.continuousfun
格式
输入包括
input.phase(p).time
: p阶段N个配置点的时间,向量长度为$N^{(p)}$input.phase(p).state
: N个配置点*状态维度的矩阵,$N^{(p)} \times n_y^{(p)}$input.phase(p).control
: N个配置点*控制维度的矩阵,$N^{(p)} \times n_u^{(p)}$input.phase(p).parameter
: N个配置点*静态参数数量的矩阵,$N^{(p)} \times n_s$
输出是一个长度为$P$的结构向量,包括
output.dynamics
: N个配置点*状态维度的矩阵,$N^{(p)} \times n_y^{(p)}$output.path
: N个配置点*路径约束维度的矩阵,$N^{(p)} \times n_c^{(p)}$output.integrand
: N个配置点*积分维度的矩阵,$N^{(p)} \times n_d^{(p)}$
setup.functions.endpoint
格式
输入包括
input.phase(p).initialtime
: 阶段p的起始时间input.phase(p).finaltime
: 阶段p的起始时间input.phase(p).initialstate
: 阶段p的起始状态input.phase(p).finalstate
: 阶段p的终止状态input.phase(p).integral
: 阶段p的积分input.parameter
: 阶段p的静态参数
输出包括两个成员
output.objective
: 标量,计算目标函数结果output.eventgroup
setup.bounds
包括3个成员:
bounds.phase
: 指定了时间、状态、控制、路径约束和每个阶段的积分的界限phase.initialtime.lower
: 起始时间的下界phase.initialtime.upper
: 起始时间的上界phase(p).finaltime.lower
: 终止时间的下界phase(p).finaltime.upper
: 终止时间的上界phase(p).initialstate.lower
: 初始状态的下界phase(p).initialstate.upper
: 初始状态的上界phase(p).state.lower
: 每个阶段状态的下界phase(p).state.upper
: 每个阶段状态的上界phase(p).finalstate.lower
: 终止状态的下界phase(p).finalstate.upper
: 终止状态的上界phase(p).control.lower
: 每个阶段控制的下界phase(p).control.upper
: 每个阶段控制的上界phase(p).path.lower
: 每个阶段路径约束的下界phase(p).path.upper
: 每个阶段路径约束的上界phase(p).integral.lower
: 每个阶段积分的下界phase(p).integral.upper
: 每个阶段积分的上界phase(p).duration.lower
: 每个阶段时间的下界phase(p).duration.upper
: 每个阶段时间的上界
bounds.parameters
: 包含问题中静态参数的下界和上界bounds.eventgroup
: 长度为G
的结构数组,其中G
是问题中事件组的数量
setup.guess
guess
结构体里面的值代表了整个求解过程的初始值
guess.phase(p).time
: 长度为$M^{(p)}$的列向量,单调递增guess.phase(p).state
: $M^{(p)} \times n_y^{(p)}$的矩阵guess.phase(p).control
: $M^{(p)} \times n_u^{(p)}$的矩阵guess.phase(p).integral
: 长度为$n_d^{(p)}$的行向量guess.parameter
: 长度为$n_s$的行向量
output
gpops2
的输出包括
result
result.solution
: 最优的时间、状态和控制以及静态参数solution.phase(p).time
solution.phase(p).state
solution.phase(p).control
solution.parameter
result.objective
: 最优值result.setup
: 问题设置result.nextsetup
meshhistory
: 对每个求解NLP
的网格进行求解和误差估计meshiterations
: 迭代次数