Выражения оптимизации являются полиномиальными или рациональными комбинациями переменных оптимизации.
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. Внутренний синтаксический анализатор распознает только явные суммы квадратов. Пример см. в разделе Неотрицательные линейные наименьшие квадраты, основанные на проблемах.
Ограничения - это любые два сравнимых выражения, которые включают один из следующих операторов сравнения: ==, <=, или >=. Уравнения - это два сопоставимых выражения, использующих оператор сравнения ==. Сопоставимые выражения имеют одинаковый размер, или одно из выражений должно быть скалярным, что означает размер 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 объекты имеют режим копирования дескриптора. См. раздел Поведение объекта-дескриптора и сравнение классов дескрипторов и значений. Поведение обработки копирования означает, что копия OptimizationVariable указывает на оригинал и не имеет самостоятельного существования. Например, создайте переменную x, скопируйте его в y, затем задайте свойство y. Обратите внимание, что x принимает новое значение свойства.
x = optimvar('x','LowerBound',1); y = x; y.LowerBound = 0; showbounds(x)
0 <= xOptimizationConstraint | OptimizationExpression | optimvar | show