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

Чтобы использовать нелинейную функцию в качестве объективной или нелинейной ограничительной функции в основанном на проблеме подходе, преобразуйте функцию в выражение оптимизации с помощью fcn2optimexpr. Этот пример показывает, как преобразовать функцию с помощью и файла функции и анонимной функции.

Файл функции

Чтобы использовать файл функции в основанном на проблеме подходе, необходимо преобразовать файл в выражение с помощью fcn2optimexpr.

Например, файл expfn3.m содержит следующий код:

type expfn3.m
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',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 симметричен и это mineval-1/2.

prob.Constraints.sym = u == u.';
prob.Constraints.mineval = mineval >= -1/2;

Просмотрите проблему.

showproblem(prob)
  OptimizationProblem : 

	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 = randn(3);
x0.u = x0.u + x0.u.';
x0.v = 2*randn(3,1);
[sol,fval,exitflag,output] = solve(prob,x0)
Solver stopped prematurely.

fmincon stopped because it exceeded the function evaluation limit,
options.MaxFunctionEvaluations = 3.000000e+03.
sol = struct with fields:
    u: [3x3 double]
    v: [3x1 double]

fval = -276.0978
exitflag = 
    SolverLimitExceeded

output = struct with fields:
         iterations: 176
          funcCount: 3000
    constrviolation: 0.0035
           stepsize: 0.3984
          algorithm: 'interior-point'
      firstorderopt: 347.7391
       cgiterations: 376
            message: '...'
             solver: 'fmincon'

Просмотрите решение.

disp(sol.u)
    0.9661    1.0000   -0.7093
    1.0000    0.2724   -0.4667
   -0.7093   -0.4667   -0.1584
disp(sol.v)
    2.0000
   -2.0000
    2.0000

Матрица решения u симметрична. Вектор решения v имеет все записи при связанных ограничениях.

Смотрите также

Похожие темы

Для просмотра документации необходимо авторизоваться на сайте