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

The 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' аргумент пары "имя-значение". The rosenbrocknorm функция вычисляет и целевую функцию Розенбрка, и норму аргумента для использования в ограничении x24.

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