Выражения оптимизации являются полиномиальными или рациональными комбинациями переменных оптимизации.
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
OptimizationConstraint
| OptimizationExpression
| optimvar
| show