Чтобы использовать нелинейную функцию в качестве объективной или нелинейной ограничительной функции в подходе, основанном на проблеме, преобразуйте функцию в выражение оптимизации с помощью 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;
Чтобы использовать этот файл функции в качестве выражения оптимизации, сначала создайте переменные оптимизации соответствующих размеров.
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. Например, запишите указатель на функцию, эквивалентный f и преобразуйте его.
fun = @(x,y)-exp(-y'*x*y);
funexpr = fcn2optimexpr(fun,u,v,'OutputSize',[1,1])funexpr =
Nonlinear OptimizationExpression
anonymousFunction1(u, v)
where:
anonymousFunction1 = @(x,y)-exp(-y'*x*y);
Чтобы использовать любое выражение в качестве целевой функции, создайте задачу оптимизации.
prob = optimproblem;
prob.Objective = f;
% Or, equivalently, prob.Objective = funexpr;Задайте ограничение 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. 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: 71
funcCount: 1009
constrviolation: 7.4196e-13
stepsize: 1.1179e-05
algorithm: 'interior-point'
firstorderopt: 0.0013
cgiterations: 59
message: '...'
solver: 'fmincon'
Просмотрите решение.
disp(sol.u)
0.9119 0.8112 -0.6007
0.8112 0.7544 0.4432
-0.6007 0.4432 0.5439
disp(sol.v)
2.0000
-2.0000
2.0000
Матрица решения u issymmetric. Все значения v в границах.