主要内容

OptimizationInequality

不等式约束

说明

OptimizationInequality 对象包含关于 OptimizationVariable 对象或 OptimizationExpression 对象的不等式约束。不等式约束使用比较运算符 <=>=

一条语句可以表示一个不等式数组。例如,您可以在下面这条语句中表示矩阵变量 x 的每行总和不大于 1 的不等式:

constrsum = sum(x,2) <= 1

OptimizationProblem 中使用 OptimizationInequality 对象作为约束。

提示

有关完整的工作流,请参阅基于问题的优化工作流

创建对象

使用具有比较运算符 <=>= 的优化表达式创建不等式。

通过使用圆点表示法,在优化问题的 Constraints 属性中包含不等式。

prob = optimproblem;
x = optimvar('x',4,6);
SumLessThanOne = sum(x,2) <= 1;
prob.Constraints.SumLessThanOne = SumLessThanOne;

您也可以使用 optimineqoptimconstr 创建一个空的优化不等式。接下来,您通常可以使用循环方式设置不等式。有关示例,请参阅使用循环方式创建不等式。但是,为了最高效地进行问题表示,请避免使用循环方式设置不等式。请参阅创建有效的优化问题

属性

全部展开

索引名称,指定为字符串元胞数组或字符向量。有关使用索引名称的信息,请参阅优化变量的命名索引

数据类型: cell

此 属性 为只读。

对象中的优化变量,指定为 OptimizationVariable 对象的结构体。

数据类型: struct

对象函数

evaluate计算问题中的优化表达式或目标和约束
infeasibility一个点处的约束违反值
issatisfied优化问题在一组点上的约束约束
show显示有关优化对象的信息
write保存优化对象描述

示例

全部折叠

创建一个名为 x 的 4×6 优化变量矩阵。

x = optimvar('x',4,6);

创建使 x 的每行总和不大于 1 的不等式。

constrsum = sum(x,2) <= 1
constrsum = 
  4×1 Linear OptimizationInequality array with properties:

    IndexNames: {{}  {}}
     Variables: [1×1 struct] containing 1 OptimizationVariable

  See inequality formulation with show.

查看不等式。

show(constrsum)
(1, 1)

  x(1, 1) + x(1, 2) + x(1, 3) + x(1, 4) + x(1, 5) + x(1, 6) <= 1

(2, 1)

  x(2, 1) + x(2, 2) + x(2, 3) + x(2, 4) + x(2, 5) + x(2, 6) <= 1

(3, 1)

  x(3, 1) + x(3, 2) + x(3, 3) + x(3, 4) + x(3, 5) + x(3, 6) <= 1

(4, 1)

  x(4, 1) + x(4, 2) + x(4, 3) + x(4, 4) + x(4, 5) + x(4, 6) <= 1

要在优化问题中包含不等式,请使用圆点表示法将 Constraints 属性设置为 constrsum

prob = optimproblem;
prob.Constraints.constrsum = constrsum
prob = 
  OptimizationProblem with properties:

       Description: ''
    ObjectiveSense: 'minimize'
         Variables: [1×1 struct] containing 1 OptimizationVariable
         Objective: [0×0 OptimizationExpression]
       Constraints: [1×1 struct] containing 1 OptimizationConstraint

  See problem formulation with show.

创建一个约束,即二元素变量 x 必须位于多个圆盘的交叉部分,这些圆盘的心和数据在数组 centersradii 范围内。

x = optimvar('x',1,2);
centers = [1 -2;3 -4;-2 3];
radii = [6 7 8];
constr = optimineq(length(radii));
for i = 1:length(constr)
    constr(i) = sum((x - centers(i,:)).^2) <= radii(i)^2;
end

查看不等式表达式。

show(constr)
  arg_LHS <= arg_RHS

  where:

        arg1 = zeros(3, 1);
        arg1(1) = sum((x - extraParams{1}).^2);
        arg1(2) = sum((x - extraParams{2}).^2);
        arg1(3) = sum((x - extraParams{3}).^2);
        arg_LHS = arg1(:);
        arg1 = zeros(3, 1);
        arg1(1) = 36;
        arg1(2) = 49;
        arg1(3) = 64;
        arg_RHS = arg1(:);

  extraParams

您也可以不使用循环,而是通过对变量使用矩阵运算来创建相同的约束。

constr2 = sum(([x;x;x] - centers).^2,2) <= radii'.^2;

使用循环方式创建不等式可能比使用矩阵运算创建不等式更耗时。

检查结构指定点处的不等式约束的值和等式约束的满足情况。

x = optimvar("x");
y = optimvar("y");
ineq = x^2 + y^2/4 <= 2;
eq = 4*x^2 + y^2 == 5;
x0.x = 1;
x0.y = 1;
evaluate(ineq,x0) % Value = L - R, where L =  x^2 + y^2/4 and R = 2
ans = 
-0.7500
issatisfied(eq,x0) % Checks whether 4*x^2 + y^2 = 5
ans = logical
   1

版本历史记录

在 R2019b 中推出

全部展开