线性约束
什么是线性约束?
有几个优化求解器接受线性约束,这些线性约束对解 x 进行限制以满足线性等式或不等式。接受线性约束的求解器包括 fmincon、intlinprog、linprog、lsqlin、quadprog、多目标求解器,以及一些 Global Optimization Toolbox 求解器。
线性不等式约束
线性不等式约束的形式为 A·x ≤ b。当 A 为 m×n 时,表示对包含 n 个分量的变量 x 有 m 个约束。您需要提供 m×n 形式的矩阵 A 和包含 m 个分量的向量 b。
在 A 和 b 参量中传递线性不等式约束。
例如,假设您有以下线性不等式作为约束:
x1 + x3 ≤ 4,
2x2 – x3 ≥ –2,
x1 – x2 + x3 – x4 ≥ 9。
此处,m = 3 且 n = 4。
请使用下面的矩阵 A 和向量 b 编写这些约束:
请注意,需要先将“大于”不等式乘以 –1 以转换为“小于”不等式形式。在 MATLAB® 语法中:
A = [1 0 1 0;
0 -2 1 0;
-1 1 -1 1];
b = [4;2;-9];您不需要为线性约束提供梯度;求解器会自动计算它们。线性约束对黑塞函数没有影响。
即使您将初始点 x0 作为矩阵进行传递,求解器也会将当前点 x 作为列向量传递给线性约束。请参阅矩阵参量。
有关线性约束的更复杂示例,请参阅基于求解器设置线性规划。
中间迭代可能违反线性约束。请参阅迭代可能违反约束。
线性范围约束
从 R2026a 版本开始,您可以使用一个包含两个元素的元胞数组,为 linprog 和 intlinprog 求解器指定下界和上界线性不等式。将 A、{ 和 b} 作为线性约束传递,意味着求解器将强制执行
例如,考虑以下不等式。
| –2 ≤ x1 + 2 x3 ≤ 4, x2 – 3 x3 ≥ –2, x1 – x2 + x3 – x4 ≤ 8。 | (1) |
通过输入这些数组来指定不等式。
A = [1 0 2 0;
0 1 -3 0;
1 -1 1 -1];
bl = [-2 -2 -inf];
b = [4 inf 8]; % Pass the range constraints as {bl,b}对于每个未指定的下限区间(例如不等式组的第三行),应将 -inf 指定为 bl 的值。同样地,对于每个未指定的上界范围(例如不等式组的第二行),应将 inf 指定为 b 的值。
除了使用元胞数组语法外,您还可以对每个不等式使用 ≤ 形式。例如,下面的两个不等式是等价的。
| –2 ≤ x1 + 2 x3 | (2) |
| – x1 – 2 x3 ≤ 2。 | (3) |
当每个线性表达式同时存在下限和上限时,范围约束的语法尤为方便,例如不等式中的第一行。
| –2 ≤ x1 + 2 x3 ≤ 4。 | (4) |
若要表明 bl 或 b 不适用于某个问题,请传入一个空数组,例如 {bl []}。
线性等式约束
线性等式的形式为 Aeq·x = beq,表示 m 个方程,其中的向量 x 包含 n 个分量。您需要提供 m×n 形式的矩阵 Aeq 和包含 m 个分量的向量 beq。
按照线性不等式约束中对 A 和 b 参量的相同方式,在 Aeq 和 beq 参量中传递线性等式约束。