В этом разделе показано, как преобразовать нелинейную функцию в выражение оптимизации или создать выражение из поддерживаемых операций над переменными оптимизации. В разделе также показано, как преобразовать функцию, если необходимо, с помощью fcn2optimexpr.
Как правило, целевые или нелинейные функции ограничения создаются с помощью поддерживаемых операций над переменными и выражениями оптимизации. Это имеет следующие преимущества:
solve включает градиенты, рассчитанные с помощью автоматического дифференцирования. См. раздел Влияние автоматического дифференцирования в оптимизации на основе проблем.
solve имеет более широкий выбор доступных решателей. При использовании fcn2optimexpr, solve использует только fmincon или fminunc.
В целом, поддерживаемые операции включают в себя все элементарные математические операции: сложение, вычитание, умножение, деление, степени и элементарные функции, такие как экспоненциальные и тригонометрические функции и их обратные. Неконтактные операции, такие как max, abs, if, и case не поддерживаются. Полное описание см. в разделе Поддерживаемые операции с переменными и выражениями оптимизации.
Например, предположим, что ваша целевая функция
+ (r-x) 2
где - параметр, который вы предоставляете, и проблема заключается в минимизации над и . Эта целевая функция является суммой квадратов и принимает минимальное значение 0 в точке x r, r2.
Целевая функция является многочленом, поэтому её можно записать в терминах элементарных операций над переменными оптимизации.
r = 2; x = optimvar('x'); y = optimvar('y'); f = 100*(y - x^2)^2 + (r - x)^2; prob = optimproblem("Objective",f); x0.x = -1; x0.y = 2; [sol,fval] = solve(prob,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.
sol = struct with fields:
x: 2.0000
y: 4.0000
fval = 8.0661e-29
Решение той же задачи путем преобразования целевой функции с помощью fcn2optimexpr (не рекомендуется), сначала запишите цель как анонимную функцию.
fun = @(x,y)100*(y - x^2)^2 + (r - x)^2; prob.Objective = fcn2optimexpr(fun,x,y); [sol2,fval2] = 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.
sol2 = struct with fields:
x: 2.0000
y: 3.9998
fval2 = 1.7143e-09
Обратите внимание, что solve использование fminunc на этот раз вместо более эффективного lsqnonlinи сообщенное решение для y несколько отличается от правильного решения 4. Кроме того, сообщается fval около 1e-9 вместо 1e-20 (фактическое значение решения равно ровно 0). Эти незначительные неточности обусловлены solve не использует более эффективный решатель.
В оставшейся части этого примера показано, как преобразовать функцию в выражение оптимизации с помощью fcn2optimexpr.
Чтобы использовать файл функции в подходе, основанном на проблемах, необходимо преобразовать файл в выражение с помощью fcn2optimexpr.
Например, expfn3.m файл содержит следующий код:
type expfn3.mfunction [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;
Эта функция не полностью состоит из поддерживаемых операций из-за min(eig(u)). Поэтому использовать expfn3(u,v) в качестве выражения оптимизации необходимо сначала преобразовать его с помощью fcn2optimexpr.
Использовать expfn3 в качестве выражения оптимизации сначала создайте переменные оптимизации соответствующих размеров.
u = optimvar('u',3,3,'LowerBound',-1,'UpperBound',1); % 3-by-3 variable v = optimvar('v',3,'LowerBound',-2,'UpperBound',2); % 3-by-1 variable
Преобразование файла функции в выражения оптимизации с помощью fcn2optimexpr.
[f,g,mineval] = fcn2optimexpr(@expfn3,u,v);
Поскольку все возвращенные выражения являются скалярными, можно сэкономить вычислительное время, указав размеры выражения с помощью 'OutputSize' аргумент пары имя-значение. Также, потому что expfn3 вычисляет все выходные данные, вы можете сэкономить больше вычислительного времени, используя ReuseEvaluation пара имя-значение.
[f,g,mineval] = fcn2optimexpr(@expfn3,u,v,'OutputSize',[1,1],'ReuseEvaluation',true)
f =
Nonlinear OptimizationExpression
[argout,~,~] = expfn3(u, v)
g =
Nonlinear OptimizationExpression
[~,argout,~] = expfn3(u, v)
mineval =
Nonlinear OptimizationExpression
[~,~,argout] = expfn3(u, v)
Чтобы использовать общий нелинейный дескриптор функции в подходе, основанном на задачах, преобразуйте дескриптор в выражение оптимизации с помощью fcn2optimexpr. Например, записать дескриптор функции, эквивалентный mineval и конвертировать его.
fun = @(u)min(eig(u));
funexpr = fcn2optimexpr(fun,u,'OutputSize',[1,1])funexpr =
Nonlinear OptimizationExpression
anonymousFunction2(u)
where:
anonymousFunction2 = @(u)min(eig(u));
Чтобы использовать целевое выражение в качестве целевой функции, создайте задачу оптимизации.
prob = optimproblem; prob.Objective = f;
Определение ограничения g <= 0 в задаче оптимизации.
prob.Constraints.nlcons1 = g <= 0;
Также определите ограничения, которые u симметричен и .
prob.Constraints.sym = u == u.'; prob.Constraints.mineval = mineval >= -1/2;
Просмотрите проблему.
show(prob)
OptimizationProblem :
Solve for:
u, v
minimize :
[argout,~,~] = expfn3(u, v)
subject to nlcons1:
arg_LHS <= 0
where:
[~,arg_LHS,~] = expfn3(u, v);
subject to sym:
u(2, 1) - u(1, 2) == 0
u(3, 1) - u(1, 3) == 0
-u(2, 1) + u(1, 2) == 0
u(3, 2) - u(2, 3) == 0
-u(3, 1) + u(1, 3) == 0
-u(3, 2) + u(2, 3) == 0
subject to mineval:
arg_LHS >= (-0.5)
where:
[~,~,arg_LHS] = expfn3(u, v);
variable bounds:
-1 <= u(1, 1) <= 1
-1 <= u(2, 1) <= 1
-1 <= u(3, 1) <= 1
-1 <= u(1, 2) <= 1
-1 <= u(2, 2) <= 1
-1 <= u(3, 2) <= 1
-1 <= u(1, 3) <= 1
-1 <= u(2, 3) <= 1
-1 <= u(3, 3) <= 1
-2 <= v(1) <= 2
-2 <= v(2) <= 2
-2 <= v(3) <= 2
Для решения проблемы звоните solve. Установка начальной точки x0.
rng default % For reproducibility x0.u = 0.25*randn(3); x0.u = x0.u + x0.u.'; x0.v = 2*randn(3,1); [sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon. Feasible point with lower objective function value found. 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.
sol = struct with fields:
u: [3x3 double]
v: [3x1 double]
fval = -403.4288
exitflag =
OptimalSolution
output = struct with fields:
iterations: 87
funcCount: 1448
constrviolation: 6.3860e-12
stepsize: 7.4093e-05
algorithm: 'interior-point'
firstorderopt: 0.0012
cgiterations: 172
message: '...'
bestfeasible: [1x1 struct]
objectivederivative: "finite-differences"
constraintderivative: "finite-differences"
solver: 'fmincon'
Просмотрите решение.
disp(sol.u)
0.8419 0.5748 -0.7670
0.5748 0.3745 0.2997
-0.7670 0.2997 0.5667
disp(sol.v)
2.0000
-2.0000
2.0000
Матрица решения u симметричен. Все значения v находятся на границах.
Авторское право 2018-2020 The MathWorks, Inc.