exponenta event banner

Решение ограниченной нелинейной оптимизации на основе проблем

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

Чтобы найти минимальное значение нелинейной целевой функции, используя подход, основанный на задачах, сначала запишите целевую функцию как файловую или анонимную функцию. Целевая функция для этого примера:

f (x, y) = ex (4x2 + 2y2 + 4xy + 2y-1).

type objfunx
function f = objfunx(x,y)
f = exp(x).*(4*x.^2 + 2*y.^2 + 4*x.*y + 2*y - 1);
end

Создание переменных проблемы оптимизации x и y.

x = optimvar('x');
y = optimvar('y');

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

obj = objfunx(x,y);

Создать проблему оптимизации с помощью obj в качестве целевой функции.

prob = optimproblem('Objective',obj);

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

xy2 + (x + 2) 2 + (y-2) 22≤2.

Создайте ограничение как выражение неравенства в переменных оптимизации.

TiltEllipse = x.*y/2 + (x+2).^2 + (y-2).^2/2 <= 2;

Включите ограничение в проблему.

prob.Constraints.constr = TiltEllipse;

Создание структуры, представляющей начальную точку как x = –3, y = 3.

x0.x = -3;
x0.y = 3;

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

show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :
       (exp(x) .* (((((4 .* x.^2) + (2 .* y.^2)) + ((4 .* x) .* y))
     + (2 .* y)) - 1))


	subject to constr:
       ((((x .* y) ./ 2) + (x + 2).^2) + ((y - 2).^2 ./ 2)) <= 2
     

Решите проблему.

[sol,fval] = 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:
    x: -5.2813
    y: 4.6815

fval = 0.3299

Попробуйте использовать другую начальную точку.

x0.x = -1;
x0.y = 1;
[sol2,fval2] = 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.
sol2 = struct with fields:
    x: -0.8210
    y: 0.6696

fval2 = 0.7626

Постройте график эллипса, контуров целевой функции и двух решений.

f = @objfunx;
g = @(x,y) x.*y/2+(x+2).^2+(y-2).^2/2-2;
rnge = [-5.5 -0.25 -0.25 7];
fimplicit(g,'k-')
axis(rnge);
hold on
fcontour(f,rnge,'LevelList',logspace(-1,1))
plot(sol.x,sol.y,'ro','LineWidth',2)
plot(sol2.x,sol2.y,'ko','LineWidth',2)
legend('Constraint','f Contours','Global Solution','Local Solution','Location','northeast');
hold off

Figure contains an axes. The axes contains 4 objects of type implicitfunctionline, functioncontour, line. These objects represent Constraint, f Contours, Global Solution, Local Solution.

Решения находятся на границе нелинейной зависимости. Контурный график показывает, что это единственные локальные минимумы. График также показывает, что существует стационарная точка около [-2,3/2], а локальные максимумы около [-2,0] и [-1,4].

Преобразовать целевую функцию с помощью fcn2optimexpr

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

obj = fcn2optimexpr(@objfunx,x,y);

Создать проблему оптимизации с помощью obj в качестве целевой функции, как и раньше.

prob = optimproblem('Objective',obj);

Остальная часть процесса решения идентична.

Авторское право 2018-2020 The MathWorks, Inc.

См. также

Связанные темы