exponenta event banner

fcn2optimexpr

Преобразовать функцию в выражение оптимизации

Описание

пример

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK) преобразует функцию fcn(in1,in2,...,inK) в выражение оптимизации с N выходы.

пример

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK,Name,Value) указывает дополнительные параметры, использующие один или несколько аргументов пары имя-значение. Например, можно сохранить оценку функции путем передачи OutputSize.

Примеры

свернуть все

Чтобы использовать функцию MATLAB™ в подходе, основанном на задачах, если она не состоит из поддерживаемых функций, сначала преобразуйте ее в выражение оптимизации. См. раздел Поддерживаемые операции с переменными и выражениями оптимизации и преобразование нелинейной функции в выражение оптимизации.

Использование целевой функции gamma (математическая функция Γ (x), расширение факторной функции), создайте переменную оптимизацииx и использовать его в преобразованной анонимной функции.

x = optimvar('x');
obj = fcn2optimexpr(@gamma,x);
prob = optimproblem('Objective',obj);
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       gamma(x)

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

x0.x = 1/2;
sol =  solve(prob,x0)
Solving problem using fminunc.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
sol = struct with fields:
    x: 1.4616

Для более сложных функций преобразуйте файл функций. Файл функций gammabrock.m вычисляет цель двух переменных оптимизации.

type gammabrock
function f = gammabrock(x,y)
f = (10*(y - gamma(x)))^2 + (1 - x)^2;

Включить эту цель в проблему.

x = optimvar('x','LowerBound',0);
y = optimvar('y');
obj = fcn2optimexpr(@gammabrock,x,y);
prob = optimproblem('Objective',obj);
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :
       gammabrock(x, y)


	variable bounds:
       0 <= x

gammabrock функция - сумма квадратов. Более эффективную постановку задачи можно получить, выразив функцию как явную сумму квадратов оптимизационных выражений.

f = fcn2optimexpr(@(x,y)y - gamma(x),x,y);
obj2 = (10*f)^2 + (1-x)^2;
prob2 = optimproblem('Objective',obj2);

Чтобы увидеть разницу в эффективности, решите prob и prob2, и изучить разницу в количестве итераций.

x0.x = 1/2;
x0.y = 1/2;
[sol,fval,~,output] = solve(prob,x0);
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
[sol2,fval2,~,output2] = solve(prob2,x0);
Solving problem using lsqnonlin.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
fprintf('prob took %d iterations, but prob2 took %d iterations\n',output.iterations,output2.iterations)
prob took 21 iterations, but prob2 took 2 iterations

Если функция имеет несколько выходов, их можно использовать в качестве элементов целевой функции. В этом случае u является переменной 2 на 2, v является переменной 2 на 1, и expfn3 имеет три выхода.

type expfn3
function [f,g,mineval] = expfn3(u,v)
mineval = min(eig(u));
f = v'*u*v;
f = -exp(-f);
t = u*v;
g = t'*t + sum(t) - 3;

Создайте переменные оптимизации соответствующего размера и целевую функцию из первых двух выходов.

u = optimvar('u',2,2);
v = optimvar('v',2);
[f,g,mineval] = fcn2optimexpr(@expfn3,u,v);
prob = optimproblem;
prob.Objective = f*g/(1 + f^2);
show(prob)
  OptimizationProblem : 

	Solve for:
       u, v

	minimize :
       ((arg2 .* arg3) ./ (1 + arg1.^2))

       where:

         [arg1,~,~] = expfn3(u, v);
         [arg2,~,~] = expfn3(u, v);
         [~,arg3,~] = expfn3(u, v);

Вы можете использовать mineval вывод в последующем выражении ограничения.

В оптимизации на основе задач ограничения представляют собой два выражения оптимизации с оператором сравнения (==, <=, или >=) между ними. Вы можете использовать fcn2optimexpr для создания одного или обоих оптимизационных выражений. См. раздел Преобразование нелинейной функции в выражение оптимизации.

Создайте нелинейное ограничение, gammafn2 меньше или равно -1/2. Эта функция двух переменных находится в gammafn2.m файл.

type gammafn2
function f = gammafn2(x,y)
f = -gamma(x)*(y/(1+y^2));

Создайте переменные оптимизации, преобразуйте файл функции в выражение оптимизации, а затем выразите ограничение как confn.

x = optimvar('x','LowerBound',0);
y = optimvar('y','LowerBound',0);
expr1 = fcn2optimexpr(@gammafn2,x,y);
confn = expr1 <= -1/2;
show(confn)
  gammafn2(x, y) <= -0.5

Создать другое ограничение, gammafn2 больше или равно x + y.

confn2 = expr1 >= x + y;

Создайте задачу оптимизации и разместите в ней ограничения.

prob = optimproblem;
prob.Constraints.confn = confn;
prob.Constraints.confn2 = confn2;
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :

	subject to confn:
       gammafn2(x, y) <= -0.5

	subject to confn2:
       gammafn2(x, y) >= (x + y)

	variable bounds:
       0 <= x

       0 <= y

Если проблема связана с общей, трудоемкой функцией для вычисления целевого и нелинейного ограничения, можно сэкономить время, используя 'ReuseEvaluation' аргумент пары имя-значение. rosenbrocknorm функция вычисляет как целевую функцию Розенброка, так и норму аргумента для использования в x‖2≤4 ограничения.

type rosenbrocknorm
function [f,c] = rosenbrocknorm(x)
pause(1) % Simulates time-consuming function
c = dot(x,x);
f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

Создание переменной оптимизации 2-D x. Затем преобразовать rosenbrocknorm в выражение оптимизации с помощью fcn2optimexpr и определение 'ReuseEvaluation'.

x = optimvar('x',2);
[f,c] = fcn2optimexpr(@rosenbrocknorm,x,'ReuseEvaluation',true);

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

prob = optimproblem('Objective',f);
prob.Constraints.cineq = c <= 4;
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       [argout,~] = rosenbrocknorm(x)


	subject to cineq:
       arg_LHS <= 4

       where:

         [~,arg_LHS] = rosenbrocknorm(x);
     

Решение проблемы начиная с начальной точки x0.x = [-1;1], хронометраж результата.

x0.x = [-1;1];
tic
[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

<stopping criteria details>
sol = struct with fields:
    x: [2×1 double]

fval = 4.5793e-11
exitflag = 
    OptimalSolution

output = struct with fields:
         iterations: 44
          funcCount: 164
    constrviolation: 0
           stepsize: 4.3124e-08
          algorithm: 'interior-point'
      firstorderopt: 5.1691e-07
       cgiterations: 10
            message: '↵Local minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 5.169074e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.↵↵'
       bestfeasible: [1×1 struct]
             solver: 'fmincon'

toc
Elapsed time is 164.410724 seconds.

Время решения в секундах почти совпадает с числом оценок функций. Этот результат показывает, что решатель повторно использовал значения функций и не тратил время, повторно оценивая одну и ту же точку дважды.

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

Входные аргументы

свернуть все

Функция для преобразования, заданная как дескриптор функции.

Пример: @sin определяет синусоидальную функцию.

Типы данных: function_handle

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

Типы данных: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
Поддержка комплексного номера: Да

Аргументы пары «имя-значение»

Укажите дополнительные пары, разделенные запятыми Name,Value аргументы. Name является именем аргумента и Value - соответствующее значение. Name должен отображаться внутри кавычек. Можно указать несколько аргументов пары имен и значений в любом порядке как Name1,Value1,...,NameN,ValueN.

Пример: [out1,out2] = fcn2optimexpr(@fun,x,y,'OutputSize',[1,1],'ReuseEvaluation',true) указывает, что out1 и out2 - скаляры, которые будут повторно использоваться между функциями цели и ограничения без пересчета.

Размер выходных выражений, указанный как:

  • Целочисленный вектор - если функция имеет один выход out1, OutputSize задает размер out1. Если функция имеет несколько выходов out1,…,outN, OutputSize указывает, что все выходы имеют одинаковый размер.

  • Клеточный массив целочисленных векторов - размер вывода outj - j-й элемент OutputSize.

Примечание

Скаляр имеет размер [1,1].

Если не указать 'OutputSize' аргумент пары имя-значение, затем fcn2optimexpr передает данные в fcn для определения размера выходных сигналов (см. Алгоритмы). Путем указания 'OutputSize', вы включаете fcn2optimexpr чтобы пропустить этот шаг, что экономит время. Кроме того, если не указать 'OutputSize' и оценка fcn не удается по какой-либо причине, то fcn2optimexpr также не удается.

Пример: [out1,out2,out3] = fcn2optimexpr(@fun,x,'OutputSize',[1,1]) указывает, что три выхода [out1,out2,out3] скаляры.

Пример: [out1,out2] = fcn2optimexpr(@fun,x,'OutputSize',{[4,4],[3,5]}) указывает, что out1 имеет размер 4 на 4 и out2 имеет размер 3 на 5.

Типы данных: double | cell

Индикатор повторного использования значений, указанный как false (не использовать повторно) или true (повторное использование).

'ReuseEvaluation' может ускорить выполнение задачи, когда, например, цель и некоторые нелинейные ограничения зависят от общего расчета. В этом случае решатель сохраняет значение для повторного использования там, где это необходимо, и избегает повторного вычисления значения.

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

Пример: [out1,out2,out3] = fcn2optimexpr(@fun,x,'ReuseEvaluation',true) позволяет out1, out2, и out3 используется в нескольких вычислениях, при этом выходные данные вычисляются только один раз для каждой точки оценки.

Типы данных: logical

Выходные аргументы

свернуть все

Выходной аргумент, возвращенный как OptimizationExpression. Размер выражения зависит от входной функции.

Совет

Алгоритмы

Поиск выходного размера каждого возвращаемого выражения, если не указан OutputSize, fcn2optimexpr вычисляет функцию в следующей точке для каждого элемента переменных задачи.

Переменные характеристикиТочка оценки
Конечная верхняя граница ub и конечная нижняя граница lb(lb + ub)/2 + ((ub - lb)/2)*eps
Конечная нижняя граница и без верхней границыlb + max(1,abs(lb))*eps
Конечная верхняя граница и без нижней границыub - max(1,abs(ub))*eps
Без границ1 + eps
Переменная указана как целое числоfloor точки, указанной ранее

Точка оценки может привести к ошибке в оценке функции. Чтобы избежать этой ошибки, укажите 'OutputSize'.

Представлен в R2019a