Выражения оптимизации являются полиномиальными или рациональными комбинациями переменных оптимизации.
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
подходит для целевой функции.
Если у вас есть нелинейная функция, которая не является многочленным или рациональным выражением, преобразуйте его в выражение оптимизации при помощи 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 showexpr(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)); showexpr(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, таким образом, эти два выражения сопоставимы.
Если у вас есть нелинейная функция, которая не является многочленным или рациональным выражением, преобразуйте его в выражение оптимизации при помощи fcn2optimexpr
. Смотрите Преобразовывают Нелинейную Функцию в Выражение Оптимизации.
Чтобы включать ограничения в проблему, используйте запись через точку и дайте каждому ограничению другое имя.
prob = optimproblem; prob.Constraints.constr1 = constr1; prob.Constraints.constr2 = constr2; prob.Constraints.constr3 = constr3;
Можно также включать ограничения, когда вы создаете проблему. Например, предположите, что у вас есть 10 пар положительных переменных, суммы которых не больше, чем один.
x = optimvar('x',10,2,'LowerBound',0); prob = optimproblem('Constraints',sum(x,2) <= 1);
Чтобы создать ограничительные выражения в цикле, запустите с пустого ограничительного выражения, как возвращено optimconstr
.
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 showconstr(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))'; showconstr(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
имеют поведение копии указателя. Смотрите Поведение объекта Указателя (MATLAB) и Сравнение Классов Указателя и Значения (MATLAB). Обработайте средние значения поведения копии, что копия OptimizationVariable
указывает на оригинал и не имеет независимого существования. Например, создайте переменную x
, скопируйте ее в y
, затем установите свойство y
. Обратите внимание на то, что x
берет новое значение свойства.
x = optimvar('x','LowerBound',1); y = x; y.LowerBound = 0; showbounds(x)
0 <= x
OptimizationConstraint
| OptimizationExpression
| optimvar
| showconstr
| showexpr
| showproblem
| writeconstr
| writeexpr