起点与终点约束定义
起点约束描述了第一个优化变量 的等式约束, 比如在车辆轨迹规划问题中的车辆初始状态约束.
终点约束描述了最后一个优化变量 的等式约束, 比如 在火箭着陆轨迹规划问题中的末端零速度约束.
OPTIMake对起点和终点支持以下类型的等式约束:
- general_equality: 通用类型, 通过表达式直接定义
- external_general_equality: 通用类型, 通过外部C/C++函数定义
在完成约束定义后, 通过以下接口添加起点与终点约束:
prob.start_equality(eq, weight_soft, penalty_type)
prob.end_equality(eq, weight_soft, penalty_type)
其中, start_equality/end_equality接口的函数入参的定义如下 (约束软化下详见 建模接口 > 约束软化) :
- eq: 等式约束, 类型为
general_equality,external_general_equality - weight_soft: 该约束软化时的惩罚权重list, 必须为非负, 可以为常数或关于参数的表达式, 默认值为全inf, 表示硬约束
- penalty_type: 该约束软化的惩罚类型list, 可选值为
'none','quadratic','l1', 默认值为全'none', 表示硬约束
信息
- 当约束类型为
external_general_equality时, 只能调用一次prob.start_equality/end_equality设置约束 - 当约束为其他类型时, 可调用多次prob.start_equality/end_equality添加多个约束
general_equality
下面为通过general_equality定义起点与终点约束的例子:
# x0, y0, phi0为已定义的parameter
start_eq = general_equality(expr = [x - x0, y - y0, phi - phi0])
prob.start_equality(start_eq)
# xN, yN, phiN为已定义的parameter
end_eq = general_equality(expr = [x - xN, y - yN, phi - phiN])
prob.end_equality(end_eq)
其中, 函数入参的定义如下:
- expr: 约束的表达式的list
external_general_equality
下面为通过external_general_equality定义起点与终点约束的例子:
eq_spy_jac = \
[[1, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 1, 0]]
eq_spy_hess = \
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
start_eq = external_general_equality(
dim = 3,
sparsity_jacobian=seq_spy_jac,
sparsity_hessian=seq_spy_hess)
end_eq = external_general_equality(
dim = 3,
sparsity_jacobian=seq_spy_jac,
sparsity_hessian=seq_spy_hess)
其中, external_general_equality接口的入参如下:
- dim: 该约束的维度
- sparsity_jacobian (optional): 的Jacoboian的sparsity pattern, 维度为dim的矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0
- sparsity_hessian (optional): 的Hessian的sparsity pattern (z为维度为dim的拉格朗日乘子), 维度为的对称矩阵, 0代表稀疏, 1代表稠密;其默认值为全1.0