转移等式约束定义
转移等式约束描述了相邻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, 必须为非负, 可以为常数或关于参数的表达式, 默认值为全inf, 表示硬约束
- penalty_type: 该约束软化的惩罚类型list, 可选值为
'none'
,'quadratic'
,'l1'
, 默认值为全'none'
, 表示硬约束
信息
- 当约束类型为
external_discrete_equation
或differential_equation
(discretization_method
为'irk2'
或'irk4'
) 时, 只能调用一次prob.equality设置约束 - 当约束为其他类型时, 可调用多次prob.equality添加多个约束
differential_equation
differential_equation定义了的形式的转移等式约束, 需要指定离散步长与离散方法将其离散化.
下面为通过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: 状态量, 对应, 类型为优化变量的list
-
state_dot: 状态微分量, 对应, 类型为list
-
stepsize: 离散步长, 可以为常数, 关于参数的表达式, 或者关于优化变量的表达式
-
discretization_method: 离散方法, 可选值为:
- 'forward_euler': 显式欧拉
- 'erk4': 显式四阶龙格库塔
- 'backward_euler': 隐式欧拉
- 'trapezoid': 梯形积分 (trapezoidal rule)
- 'irk2': 隐式二阶龙格库塔 (midpoint rule)
- 'irk4': 隐式四阶龙格库塔
discrete_equation
discrete equation为 , 下面为通过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的函数表达式, 对应 , 类型为list
- expr_next_stage: 下一个stage的函数表达式, 对应 , 类型为list
信息
若只需要描述当前stage内优化变量的等式关系, 可将expr_this_stage
或expr_next_stage
设置为全零.
external_discrete_equation
通过外部C/C++函数定义的discrete_equation, 其形式为. 在建模时, 可以指定其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): 的Jacoboian的sparsity pattern, 维度为dim的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
- sparsity_jacobian_next_stage (optional): 的Jacoboian的sparsity pattern, 维度为dim的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
- sparsity_hessian_this_stage (optional): 的Hessian的sparsity pattern (y为维度为dim的拉格朗日乘子), 维度为的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
- sparsity_hessian_next_stage (optional): 的Hessian的sparsity pattern, 维度为的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0