Этот пример показывает, как найти минимум нелинейной целевой функции с нелинейным ограничением с помощью основанного на проблеме подхода. Для видео, показывающего решение подобной задачи, смотрите Основанное на проблеме нелинейное программирование.
Чтобы найти минимальное значение нелинейной целевой функции с помощью основанного на проблеме подхода, сначала запишите целевую функцию как файл или анонимную функцию. Целевой функцией для этого примера является
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);
Создайте нелинейное ограничение, что решение лежит в наклонном эллипсе, заданном как
Создайте ограничение как выражение неравенства в переменных оптимизации.
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
Решения находятся на нелинейных границах ограничений. Контурный график показывает, что это единственные локальные минимумы. График также показывает, что есть стационарная точка около [-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.