Resolver optimización no lineal restringida, basada en problemas
Este ejemplo muestra cómo encontrar el mínimo de una función objetivo no lineal con una restricción no lineal utilizando el enfoque basado en problemas. Si desea ver un vídeo que muestra la solución a un problema similar, consulte Programación no lineal basada en problemas.
Para encontrar el valor mínimo de una función objetivo no lineal utilizando el enfoque basado en problemas, primero escriba la función objetivo como un archivo o una función anónima. La función objetivo para este ejemplo es
type objfunx
function f = objfunx(x,y) f = exp(x).*(4*x.^2 + 2*y.^2 + 4*x.*y + 2*y - 1); end
Cree las variables x
e y
del problema de optimización.
x = optimvar('x'); y = optimvar('y');
Cree la función objetivo como una expresión en las variables de optimización.
obj = objfunx(x,y);
Cree un problema de optimización con obj
como la función objetivo.
prob = optimproblem('Objective',obj);
Cree una restricción no lineal para que la solución se encuentre en una elipse inclinada, especificada como
Cree la restricción como una expresión de desigualdad en las variables de optimización.
TiltEllipse = x.*y/2 + (x+2).^2 + (y-2).^2/2 <= 2;
Incluya la restricción en el problema.
prob.Constraints.constr = TiltEllipse;
Cree una estructura que represente el punto inicial como x = –3
, y = 3
.
x0.x = -3; x0.y = 3;
Revise el problema.
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
Resuelva el problema.
[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
Pruebe un punto de inicio diferente.
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
Represente la elipse, los contornos de la función objetivo y las dos soluciones.
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
Las soluciones se encuentran en el límite de la restricción no lineal. El contorno muestra que estos son los únicos mínimos locales. También muestra que existe un punto estacionario cerca de [–2,3/2] y máximos locales cerca de [–2,0] y [–1,4].
Convertir una función objetivo utilizando fcn2optimexpr
Para algunas funciones objetivo o versiones del software, debe convertir funciones no lineales en expresiones de optimización utilizando fcn2optimexpr
. Consulte Supported Operations for Optimization Variables and Expressions y Convert Nonlinear Function to Optimization Expression. Pase las variables x
e y
en la llamada a fcn2optimexpr
para indicar qué variable de optimización corresponde a cada entrada objfunx
.
obj = fcn2optimexpr(@objfunx,x,y);
Cree un problema de optimización con obj
como la función objetivo igual que antes.
prob = optimproblem('Objective',obj);
El resto del proceso de resolución es idéntico.
Copyright 2018–2020 The MathWorks, Inc.