optimineq

Создайте пустой массив неравенства оптимизации

Описание

Использование optimineq инициализировать набор выражений неравенства.

Совет

Для полного рабочего процесса смотрите Основанный на проблеме Рабочий процесс Оптимизации.

пример

constr = optimineq(N) создает N- 1 массив пустых неравенств оптимизации. Используйте constr инициализировать цикл, который создает выражения неравенства.

пример

constr = optimineq(cstr) создает массив пустых ограничений оптимизации, которые индексируются cstr, массив ячеек из символьных векторов или векторы строки.

Если cstr 1 ncstr, где n cstr число элементов cstr, затем constr также 1 ncstr. В противном случае, constr n cstr- 1.

constr = optimineq(cstr1,N2,...,cstrk) или constr = optimineq({cstr1,cstr2,...,cstrk}) или constr = optimineq([N1,N2,...,Nk]), для любой комбинации cstr и N аргументы, создает cstr n1 N2-by-...-by-ncstrk массив пустых неравенств оптимизации, где n cstr число элементов в cstr.

Примеры

свернуть все

Создайте ограничение что двухэлементная переменная x должен лечь в пересечениях многих дисков, центры которых и радиусы находятся в массивах centers и radii.

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-...-by-Nk.

Пример 5

Типы данных: double

Имена для индексации в виде массива ячеек из символьных векторов или вектора строки.

Пример: {'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

Советы

  • Обычно более эффективно создать ограничения по векторизованным выражениям, а не циклам. Смотрите Создают Эффективные Задачи оптимизации.

  • Можно использовать optimconstr вместо optimineq создать ограничения неравенства для задач оптимизации.

Введенный в R2019b