Main Content

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

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

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 de 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

xy2+(x+2)2+(y-2)222.

Cree la restricción como una expresión de desigualdad de 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

Figure contains an axes object. The axes object contains 4 objects of type implicitfunctionline, functioncontour, line. One or more of the lines displays its values using only markers These objects represent Constraint, f Contours, Global Solution, Local Solution.

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 Operaciones compatibles con variables y expresiones de optimización y Convertir una función no lineal en una expresión de optimización. 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.

Consulte también

Temas relacionados