Оптимизационные выражения

Что такое выражения оптимизации?

Выражения оптимизации являются полиномиальными или рациональными комбинациями переменных оптимизации.

x = optimvar('x',3,3); % a 3-by-3 variable named 'x'
expr1 = sum(x,1) % add the columns of x, get a row vector
expr2 = sum(x,2) % add the rows of x, get a column vector
expr3 = sum(sum(x.*randn(3))) % add the elements of x multiplied by random numbers
expr4 = randn(3)*x % multiply a random matrix times x
expr5 = sum(sum(x*diag(1:3))) % multiply the columns of x by their column number and sum the result
expr6 = sum(sum(x.*x)) % sum of the squares of all the variables

Выражения оптимизации также являются результатом многих MATLAB® использования с переменными оптимизации, такими как транспонирование или конкатенация переменных. Список поддерживаемых операций для выражений оптимизации см. в Поддерживаемые операции для переменных оптимизации и выражений.

Наконец, оптимизационные выражения могут быть результатом применения fcn2optimexpr в функцию MATLAB, действующую на переменные оптимизации. Для получения дополнительной информации смотрите Преобразование нелинейной функции в выражение оптимизации.

Функции моделирования оптимизации не позволяют вам задать комплексные, Inf, или NaN значения. Если вы получаете такое выражение посредством операций, выражение не может быть отображено. См. Выражение содержит Inf или NaN.

Выражения для целевых функций

Целевой функцией является выражение размера 1 на 1.

y = optimvar('y',5,3);
expr = sum(y,2); % a 5-by-1 vector
expr2 = [1:5]*expr;

Выражение expr не подходит для целевой функции, потому что это вектор. Выражение expr2 подходит для целевой функции.

Примечание

Если у вас есть нелинейная функция, которая не состоит из полиномов, рациональных выражений и элементарных функций, таких как exp, затем преобразуйте функцию в выражение оптимизации при помощи fcn2optimexpr. Смотрите Преобразование нелинейной функции в выражение оптимизации и Поддерживаемые Операции над Переменными Оптимизации и Выражениями.

Чтобы включить выражение в качестве целевой функции в задачу, используйте запись через точку или включите цель, когда вы создаете задачу.

prob = optimproblem;
prob.Objective = expr2;
% or equivalently
prob = optimproblem('Objective',expr2);

Чтобы создать выражение в цикле, начните с пустого выражения, возвращенного optimexpr.

x = optimvar('x',3,3,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',3,3);
expr = optimexpr;
for i = 1:3
    for j = 1:3
        expr = expr + y(j,i) - x(i,j);
    end
end
show(expr)
  y(1, 1) + y(2, 1) + y(3, 1) + y(1, 2) + y(2, 2) + y(3, 2) + y(1, 3) + y(2, 3) + y(3, 3)
- x(1, 1) - x(2, 1) - x(3, 1) - x(1, 2) - x(2, 2) - x(3, 2) - x(1, 3) - x(2, 3) - x(3, 3)

Можно создавать expr без циклов:

x = optimvar('x',3,3,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',3,3);
expr = sum(sum(y' - x));
show(expr)
  y(1, 1) + y(2, 1) + y(3, 1) + y(1, 2) + y(2, 2) + y(3, 2) + y(1, 3) + y(2, 3) + y(3, 3)
- x(1, 1) - x(2, 1) - x(3, 1) - x(1, 2) - x(2, 2) - x(3, 2) - x(1, 3) - x(2, 3) - x(3, 3)

Примечание

Если ваша целевая функция является суммой квадратов, и вы хотите solve чтобы распознать его как таковой, запишите его как sum(expr.^2), а не как expr'*expr. Внутренний анализатор распознает только явные суммы квадратов. Для получения примера смотрите Неотрицательные линейные задачи для метода наименьших квадратов, Основанные на проблеме.

Выражения для ограничений и уравнений

Ограничениями являются любые две comparable expressions, которые включают один из следующих операторов сравнения: ==, <=, или >=. Уравнения являются двумя сопоставимыми выражениями, которые используют оператор сравнения ==. Сопоставимые выражения имеют тот же размер, или одно из выражений должно быть скаляр, то есть размер 1 на 1.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',2,4);
z = optimvar('z');

constr1 = sum(x,2) >= z;

x имеет размер 3 на 2, так что sum(x,2) имеет размер 3 на 1. Это выражение сопоставимо с z потому что z является скалярной переменной.

constr2 = y <= z;

y имеет размер 2 на 4. Снова, y сопоставим с z потому что z является скалярной переменной.

constr3 = (sum(x,1))' <= sum(y,2);

sum(x,1) имеет размер 1 на 2, так что (sum(x,1))' имеет размер 2 на 1. sum(y,2) имеет размер 2 на 1, поэтому два выражения сопоставимы.

Примечание

Если у вас есть нелинейная функция, которая не состоит из полиномов, рациональных выражений и элементарных функций, таких как exp, затем преобразуйте функцию в выражение оптимизации при помощи fcn2optimexpr. Смотрите Преобразование нелинейной функции в выражение оптимизации и Поддерживаемые Операции над Переменными Оптимизации и Выражениями.

Чтобы включить ограничения в задачу, используйте запись через точку и присвойте каждому ограничению другое имя.

prob = optimproblem;
prob.Constraints.constr1 = constr1;
prob.Constraints.constr2 = constr2;
prob.Constraints.constr3 = constr3;

Точно так же, чтобы включить уравнения в задачу, используйте запись через точку и дайте каждому уравнению другое имя.

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq12

Можно также включать ограничения или уравнения, когда вы создаете задачу. Например, предположим, что у вас есть 10 пар положительных переменных, суммы которых не более единицы.

x = optimvar('x',10,2,'LowerBound',0);
prob = optimproblem('Constraints',sum(x,2) <= 1);

Чтобы создать ограничения или выражения уравнения в цикле, начните с пустого выражения ограничения, как возвращено optimconstr, optimeq, или optimineq.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',2,4);
z = optimvar('z');
const1 = optimconstr(2);
for i = 1:2
    const1(i) = x(1,i) - x(3,i) + 2*z >= 4*(y(i,2) + y(i,3) + 2*y(i,4));
end
show(const1)
(1, 1)

  x(1, 1) - x(3, 1) + 2*z - 4*y(1, 2) - 4*y(1, 3) - 8*y(1, 4) >= 0

(2, 1)

  x(1, 2) - x(3, 2) + 2*z - 4*y(2, 2) - 4*y(2, 3) - 8*y(2, 4) >= 0

Можно создавать const1 без циклов.

x = optimvar('x',3,2,'Type','integer','LowerBound',0,'UpperBound',1);
y = optimvar('y',2,4);
z = optimvar('z');
const1 = x(1,:) - x(3,:) + 2*z >= 4*(y(:,1) + y(:,3) + 2*y(:,4))';
show(const1)
(1, 1)

  x(1, 1) - x(3, 1) + 2*z - 4*y(1, 1) - 4*y(1, 3) - 8*y(1, 4) >= 0

(1, 2)

  x(1, 2) - x(3, 2) + 2*z - 4*y(2, 1) - 4*y(2, 3) - 8*y(2, 4) >= 0

Совет

Для наилучшей эффективности включите границы переменных в определения переменных, а не в выражения ограничений. Кроме того, эффективность обычно повышается, когда вы создаете ограничения, не используя циклы. См. «Создание эффективных задач оптимизации».

Внимание

Каждое выражение ограничения в задаче должно использовать одно и то же сравнение. Например, следующий код приводит к ошибке, потому что cons1 использует <= сравнение, cons2 использует >= сравнение и cons1 и cons2 находятся в том же выражении.

prob = optimproblem;
x = optimvar('x',2,'LowerBound',0);
cons1 = x(1) + x(2) <= 10;
cons2 = 3*x(1) + 4*x(2) >= 2;
prob.Constraints = [cons1;cons2]; % This line throws an error

Можно избежать этой ошибки, используя отдельные выражения для ограничений.

prob.Constraints.cons1 = cons1;
prob.Constraints.cons2 = cons2;

Переменные оптимизации имеют поведение указателя

  • OptimizationVariable объекты имеют поведение копирования указателя. Смотрите Поведение Объекта указатель и Сравнение Классов Handle и Value. Поведение копирования указатель означает, что копия OptimizationVariable указывает на оригинал и не имеет самостоятельного существования. Например, создайте переменную x, скопируйте его в y, затем установите свойство y. Обратите внимание, что x принимает новое значение свойства.

    x = optimvar('x','LowerBound',1);
    y = x;
    y.LowerBound = 0;
    showbounds(x)
        0 <= x

См. также

| | |

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте