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