跳到主要内容

转移等式约束定义

转移等式约束描述了相邻stage之间优化变量的等式关系, OPTIMake支持以下类型的转移等式约束:

  • differential_equation: 微分方程
  • discrete_equation: 离散方程
  • external_discrete_equation: 离散方程, 通过外部C/C++函数定义

在完成约束定义后, 通过以下接口添加该约束:

prob.equality(eq, weight_soft, penalty_type)

其中, equality接口的函数入参的定义如下 (约束软化详见 建模接口 > 约束软化) :

  • eq: 转移等式约束, 类型为differential_equation, discrete_equation, external_discrete_equation
  • weight_soft: 该约束软化时的惩罚权重list, 必须为非负, 可以为常数或关于参数pp的表达式, 默认值为全inf, 表示硬约束
  • penalty_type: 该约束软化的惩罚类型list, 可选值为'none', 'quadratic', 'l1', 默认值为全'none', 表示硬约束
信息
  • 当约束类型为external_discrete_equationdifferential_equation (discretization_method'irk2''irk4') 时, 只能调用一次prob.equality设置约束
  • 当约束为其他类型时, 可调用多次prob.equality添加多个约束

differential_equation

differential_equation定义了x˙=h(v,p)\dot x = h(v,p)的形式的转移等式约束, 需要指定离散步长与离散方法将其离散化.

下面为通过differential_equation接口定义转移等式约束的例子:

# ts, length为已定义的parameter
eq = differential_equation(
state=[x, y, phi],
state_dot=[v * cos(phi), v * sin(phi), v * tan(delta) / length],
stepsize=ts,
discretization_method='forward_euler')
prob.equality(eq)

其中, differential_equation接口的函数入参的定义如下:

  • state: 状态量, 对应xx, 类型为优化变量的list

  • state_dot: 状态微分量, 对应h(v,p)h(v,p), 类型为list

  • stepsize: 离散步长, 可以为常数, 关于参数pp的表达式, 或者关于优化变量vv的表达式

  • discretization_method: 离散方法, 可选值为:

    • 'forward_euler': 显式欧拉
    • 'erk4': 显式四阶龙格库塔
    • 'backward_euler': 隐式欧拉
    • 'trapezoid': 梯形积分 (trapezoidal rule)
    • 'irk2': 隐式二阶龙格库塔 (midpoint rule)
    • 'irk4': 隐式四阶龙格库塔

discrete_equation

discrete equation为 hnext(vi+1,pi+1)=hthis(vi,p)h_{next}(v_{i+1}, p_{i+1}) = h_{this}(v_i, p), 下面为通过discrete equation接口定义转移等式约束的例子 (使用'forward_euler'方法的离散系统) :

# ts, length为已定义的parameter
eq = discrete_equation(
expr_this_stage=[
x + ts * v * cos(phi),
y + ts * v * sin(phi),
phi + ts * v * tan(delta) / length],
expr_next_stage=[x, y, phi])
prob.equality(eq)

其中, discrete equation接口的入参如下:

  • expr_this_stage: 当前stage的函数表达式, 对应 hthis(vi,p)h_{this}(v_i, p), 类型为list
  • expr_next_stage: 下一个stage的函数表达式, 对应 hnext(vi+1,pi+1)h_{next}(v_{i+1}, p_{i+1}), 类型为list
信息

若只需要描述当前stage内优化变量的等式关系, 可将expr_this_stageexpr_next_stage设置为全零.

external_discrete_equation

通过外部C/C++函数定义的discrete_equation, 其形式为hnext(vi+1,pi+1)=hthis(vi,p)h_{next}(v_{i+1}, p_{i+1}) = h_{this}(v_i, p). 在建模时, 可以指定其Jacobian & Hessian的稀疏性加速运算.

下面为external_discrete_equation的例子:

eq_spy_jac_this = \
[[1, 0, 1, 1],
[0, 1, 1, 1],
[0, 0, 1, 1]]

eq_spy_jac_next = \
[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]

eq_spy_hess_this = \
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 1, 1],
[0, 0, 1, 1]]

eq_spy_hess_next = \
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]

eq = external_discrete_equation(
dim = 3,
sparsity_jacobian_this_stage=eq_spy_jac_this,
sparsity_jacobian_next_stage=eq_spy_jac_next,
sparsity_hessian_this_stage=eq_spy_hess_this,
sparsity_hessian_next_stage=eq_spy_hess_next)
prob.equality(eq)

其中, external_discrete_equation接口的入参如下:

  • dim: 该约束的维度
  • sparsity_jacobian_this_stage (optional): hthis(vi,p)h_{this}(v_i, p)的Jacoboian的sparsity pattern, 维度为dim×nv\times n_{v}的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
  • sparsity_jacobian_next_stage (optional): hnext(vi+1,pi+1)h_{next}(v_{i+1}, p_{i+1})的Jacoboian的sparsity pattern, 维度为dim×nv\times n_{v}的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
  • sparsity_hessian_this_stage (optional): yThthis(vi,p)y^T h_{this}(v_i, p)的Hessian的sparsity pattern (y为维度为dim×1\times 1的拉格朗日乘子), 维度为nv×nvn_{v} \times n_{v}的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
  • sparsity_hessian_next_stage (optional): yThnext(vi+1,pi+1)y^T h_{next}(v_{i+1}, p_{i+1})的Hessian的sparsity pattern, 维度为nv×nvn_{v} \times n_{v}的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0