Main Content

optimineq

创建空优化不等式数组

自 R2019b 起

说明

使用 optimineq 初始化一组不等式表达式。

提示

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

示例

constr = optimineq(N) 创建一个空的 N×1 优化不等式数组。使用 constr 初始化一个用于创建不等式表达式的循环。

示例

constr = optimineq(cstr) 创建一个按 cstr 进行索引的空优化约束数组,该数组是字符向量元胞数组或字符串向量。

如果 cstr 是 1×ncstr,其中 ncstrcstr 的元素数,则 constr 也是 1×ncstr。否则,constr 是 ncstr×1。

对于 cstrN 参量的任意组合,constr = optimineq(cstr1,N2,...,cstrk)constr = optimineq({cstr1,cstr2,...,cstrk})constr = optimineq([N1,N2,...,Nk]) 会创建一个空的 ncstrN2×...×ncstrk 优化不等式数组,其中 ncstrcstr 中的元素数。

示例

全部折叠

创建一个约束,即二元素变量 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{1}:

     1    -2


  extraParams{2}:

     3    -4


  extraParams{3}:

    -2     3

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

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

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

创建索引不等式和变量来表示饮食中所含的卡路里。每餐都有不同的卡路里限制。创建表示餐名、食物和每种食物所含卡路里的数组。

meals = ["breakfast","lunch","dinner"];
foods = ["cereal","oatmeal","yogurt","peanut butter sandwich","pizza","hamburger",...
    "salad","steak","casserole","ice cream"];
calories = [200,175,150,450,350,800,150,650,350,300]';

创建表示每餐食物的优化变量,按食物名称和餐名进行索引。

diet = optimvar('diet',foods,meals,'LowerBound',0);

设置不等式约束,即每餐的卡路里都有上界。

constr = optimineq(meals);
for i = 1:3
    constr(i) = diet(:,i)'*calories <= 250*i;
end

查看 dinner 的不等式。

show(constr("dinner"))
  200*diet('cereal', 'dinner') + 175*diet('oatmeal', 'dinner') + 150*diet('yogurt', 'dinner') + 450*diet('peanut butter sandwich', 'dinner') + 350*diet('pizza', 'dinner') + 800*diet('hamburger', 'dinner') + 150*diet('salad', 'dinner') + 650*diet('steak', 'dinner') + 350*diet('casserole', 'dinner') + 300*diet('ice cream', 'dinner') <= 750

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

constr2 = diet'*calories <= 250*(1:3)';

通过设置 IndexNames 属性,为不等式包含适当的索引名称。

constr2.IndexNames = {meals, {}};

显示 dinner 的新不等式。请注意,它们与前面的不等式相同。

show(constr2("dinner"))
  200*diet('cereal', 'dinner') + 175*diet('oatmeal', 'dinner') + 150*diet('yogurt', 'dinner') + 450*diet('peanut butter sandwich', 'dinner') + 350*diet('pizza', 'dinner') + 800*diet('hamburger', 'dinner') + 150*diet('salad', 'dinner') + 650*diet('steak', 'dinner') + 350*diet('casserole', 'dinner') + 300*diet('ice cream', 'dinner') <= 750

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

输入参数

全部折叠

约束维度的大小,指定为正整数。

  • constr = optimineq(N) 的大小为 N×1。

  • constr = optimineq(N1,N2) 的大小为 N1×N2

  • constr = optimineq(N1,N2,...,Nk) 的大小为 N1×N2×...×Nk

示例: 5

数据类型: double

用于索引的名称,指定为字符向量元胞数组或字符串向量。

注意

cstr 不能为诸如 "Tp" 之类的字符串标量,而必须为诸如 ["Tp" "ul"] 之类的向量。要指定单个名称,请使用 {'Tp'} 或等效的 cellstr("Tp")

示例: {'red','orange','green','blue'}

示例: ["red";"orange";"green";"blue"]

数据类型: string | cell

输出参量

全部折叠

约束,以空 OptimizationInequality 数组形式返回。使用 constr 初始化用于创建约束表达式的循环。

例如,

x = optimvar('x',8);
constr = optimineq(4);
for k = 1:4
    constr(k) = 5*k*(x(2*k) - x(2*k-1)) <= 10 - 2*k;
end

提示

版本历史记录

在 R2019b 中推出