Main Content

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

solve

Resolver un problema de optimización o un problema de ecuación

Descripción

Utilice solve para encontrar la solución a un problema de optimización o un problema de ecuación.

ejemplo

sol = solve(prob) resuelve el problema de optimización o el problema de ecuación prob.

ejemplo

sol = solve(prob,x0) resuelve prob comenzando por el punto o conjunto de valores x0.

ejemplo

sol = solve(prob,x0,ms) resuelve prob utilizando el solver de inicio múltiple ms. Utilice esta sintaxis para buscar una solución mejor que la que se obtiene utilizando el argumento ms.

ejemplo

sol = solve(___,Name,Value) modifica el proceso de resolución utilizando uno o más argumentos de par nombre-valor además de los argumentos de entrada de sintaxis previas.

[sol,fval] = solve(___) también devuelve el valor de la función objetivo en la solución utilizando cualquiera de los argumentos de entrada de sintaxis previas.

ejemplo

[sol,fval,exitflag,output,lambda] = solve(___) también devuelve un indicador de salida que describe la condición de salida, una estructura output que contiene información adicional sobre el proceso de resolución y, para problemas de optimización no enteros, una estructura de multiplicadores de Lagrange.

Ejemplos

contraer todo

Resuelva un problema de programación lineal definido por un problema de optimización.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob)
Solving problem using linprog.

Optimal solution found.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

Encuentre un mínimo de la función peaks, que se incluye en MATLAB®, en la región x2+y24. Para hacerlo, cree las variables de optimización x e y.

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

Cree un problema de optimización con peaks como la función objetivo.

prob = optimproblem("Objective",peaks(x,y));

Incluya la restricción como una desigualdad en las variables de optimización.

prob.Constraints = x^2 + y^2 <= 4;

Establezca el punto inicial para x en 1 y para y en –1 y resuelva el problema.

x0.x = 1;
x0.y = -1;
sol = 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: 0.2283
    y: -1.6255

Las funciones no compatibles requieren fcn2optimexpr

Si las funciones objetivo o las funciones de restricción no lineal no están totalmente compuestas por funciones elementales, deberá convertir las funciones en expresiones de optimización utilizando fcn2optimexpr. Consulte Convert Nonlinear Function to Optimization Expression y Supported Operations for Optimization Variables and Expressions.

Para convertir el presente ejemplo:

convpeaks = fcn2optimexpr(@peaks,x,y);
prob.Objective = convpeaks;
sol2 = 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.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

Copyright 2018–2020 The MathWorks, Inc.

Compare el número de saltos para resolver un problema de programación de enteros tanto con un punto factible inicial como sin él. El problema tiene ocho variables de enteros y cuatro restricciones de igualdad lineales, y todas las variables están restringidas para ser positivas.

prob = optimproblem;
x = optimvar('x',8,1,'LowerBound',0,'Type','integer');

Cree cuatro restricciones de igualdad lineales e inclúyalas en el problema.

Aeq = [22    13    26    33    21     3    14    26
    39    16    22    28    26    30    23    24
    18    14    29    27    30    38    26    26
    41    26    28    36    18    38    16    26];
beq = [ 7872
       10466
       11322
       12058];
cons = Aeq*x == beq;
prob.Constraints.cons = cons;

Cree una función objetivo e inclúyala en el problema.

f = [2    10    13    17     7     5     7     3];
prob.Objective = f*x;

Resuelva el problema sin utilizar un punto inicial y examine la visualización para ver el número de nodos de ramificación y acotación.

[x1,fval1,exitflag1,output1] = solve(prob);
Solving problem using intlinprog.
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
   10000      0.41         0              -              -                                          
   18025      0.71         1   2.906000e+03   4.509804e+01                                          
   21857      0.90         2   2.073000e+03   2.270974e+01                                          
   23544      0.98         3   1.854000e+03   1.180593e+01                                          
   24097      1.00         3   1.854000e+03   1.617251e+00                                          
   24293      1.01         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped because the objective value is within a gap tolerance of the
optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon
variables are integer within tolerance, options.IntegerTolerance = 1e-05 (the
default value).

Encuentre la solución utilizando un punto factible inicial y compare.

x0.x = [8 62 23 103 53 84 46 34]';
[x2,fval2,exitflag2,output2] = solve(prob,x0);
Solving problem using intlinprog.
LP:                Optimal objective value is 1554.047531.                                          

Cut Generation:    Applied 8 strong CG cuts.                                                        
                   Lower bound is 1591.000000.                                                      
                   Relative gap is 59.20%.                                                         

Branch and Bound:

   nodes     total   num int        integer       relative                                          
explored  time (s)  solution           fval        gap (%)                                         
    3627      0.20         2   2.154000e+03   2.593968e+01                                          
    5844      0.29         3   1.854000e+03   1.180593e+01                                          
    6204      0.31         3   1.854000e+03   1.455526e+00                                          
    6400      0.33         3   1.854000e+03   0.000000e+00                                          

Optimal solution found.

Intlinprog stopped because the objective value is within a gap tolerance of the
optimal value, options.AbsoluteGapTolerance = 0 (the default value). The intcon
variables are integer within tolerance, options.IntegerTolerance = 1e-05 (the
default value).
fprintf('Without an initial point, solve took %d steps.\nWith an initial point, solve took %d steps.',output1.numnodes,output2.numnodes)
Without an initial point, solve took 24293 steps.
With an initial point, solve took 6400 steps.

Proporcionar un punto inicial no siempre mejora el problema. Para este problema, utilizar un punto inicial ahorra tiempo y saltos computacionales. Sin embargo, para algunos problemas, un punto inicial puede provocar que solve necesite más saltos.

Para algunos solvers, puede pasar los valores de la función objetivo y la función de restricción, si los hay, a solve en el argumento x0. Esto puede ahorrar tiempo en el solver. Pase un vector de objetos OptimizationValues. Cree este vector con la función optimvalues.

Los solvers que pueden utilizar los valores de la función objetivo son los siguientes:

  • ga

  • gamultiobj

  • paretosearch

  • surrogateopt

Los solvers que pueden utilizar los valores de la función de restricción no lineal son los siguientes:

  • paretosearch

  • surrogateopt

Por ejemplo, minimice la función peaks utilizando surrogateopt, comenzando por valores de una cuadrícula de puntos iniciales. Cree una cuadrícula desde –10 a 10 en la variable x y de –5/2 a 5/2 en la variable y con un espaciado de 1/2. Calcule los valores de la función objetivo en los puntos iniciales.

x = optimvar("x",LowerBound=-10,UpperBound=10);
y = optimvar("y",LowerBound=-5/2,UpperBound=5/2);
prob = optimproblem("Objective",peaks(x,y));
xval = -10:10;
yval = (-5:5)/2;
[x0x,x0y] = meshgrid(xval,yval);
peaksvals = peaks(x0x,x0y);

Pase los valores en el argumento x0 mediante optimvalues. Esto ahorra tiempo para solve, ya que solve no necesita calcular los valores. Pase los valores como vectores fila.

x0 = optimvalues(prob,'x',x0x(:)','y',x0y(:)',...
    "Objective",peaksvals(:)');

Resuelva el problema utilizando surrogateopt con los valores iniciales.

[sol,fval,eflag,output] = solve(prob,x0,Solver="surrogateopt")
Solving problem using surrogateopt.

Figure Optimization Plot Function contains an axes object. The axes object with title Best Function Value: -6.55113 contains an object of type line. This object represents Best function value.

surrogateopt stopped because it exceeded the function evaluation limit set by 
'options.MaxFunctionEvaluations'.
sol = struct with fields:
    x: 0.2283
    y: -1.6256

fval = -6.5511
eflag = 
    SolverLimitExceeded

output = struct with fields:
        elapsedtime: 16.5477
          funccount: 200
    constrviolation: 0
               ineq: [1x1 struct]
           rngstate: [1x1 struct]
            message: 'surrogateopt stopped because it exceeded the function evaluation limit set by ...'
             solver: 'surrogateopt'

Encuentre un mínimo local de la función peaks en el rango -5x,y5 comenzando por el punto [–1,2].

x = optimvar("x",LowerBound=-5,UpperBound=5);
y = optimvar("y",LowerBound=-5,UpperBound=5);
x0.x = -1;
x0.y = 2;
prob = optimproblem(Objective=peaks(x,y));
opts = optimoptions("fmincon",Display="none");
[sol,fval] = solve(prob,x0,Options=opts)
sol = struct with fields:
    x: -3.3867
    y: 3.6341

fval = 1.1224e-07

Intente encontrar una solución mejor con el solver GlobalSearch. Este solver ejecuta fmincon varias veces, lo que puede proporcionar una solución mejor.

ms = GlobalSearch;
[sol2,fval2] = solve(prob,x0,ms)
Solving problem using GlobalSearch.

GlobalSearch stopped because it analyzed all the trial points.

All 15 local solver runs converged with a positive local solver exit flag.
sol2 = struct with fields:
    x: 0.2283
    y: -1.6255

fval2 = -6.5511

GlobalSearch encuentra una solución con un valor mejor (más bajo) de la función objetivo. El mensaje de salida muestra que fmincon, el solver local, se ejecuta 15 veces. La solución devuelta tiene un valor de la función objetivo de aproximadamente –6,5511, que es inferior al valor de la primera solución, 1,1224e–07.

Resuelva el problema

minx(-3x1-2x2-x3)subjectto{x3binaryx1,x20x1+x2+x374x1+2x2+x3=12

sin mostrar una visualización iterativa.

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

options = optimoptions('intlinprog','Display','off');

sol = solve(prob,'Options',options)
sol = struct with fields:
     x: [2x1 double]
    x3: 1

Estudie la solución.

sol.x
ans = 2×1

         0
    5.5000

sol.x3
ans = 1

Restrinja solve para que utilice intlinprog como el solver para un problema de programación lineal.

x = optimvar('x');
y = optimvar('y');
prob = optimproblem;
prob.Objective = -x - y/3;
prob.Constraints.cons1 = x + y <= 2;
prob.Constraints.cons2 = x + y/4 <= 1;
prob.Constraints.cons3 = x - y <= 2;
prob.Constraints.cons4 = x/4 + y >= -1;
prob.Constraints.cons5 = x + y >= 1;
prob.Constraints.cons6 = -x + y <= 2;

sol = solve(prob,'Solver', 'intlinprog')
Solving problem using intlinprog.
LP:                Optimal objective value is -1.111111.                                            


Optimal solution found.

No integer variables specified. Intlinprog solved the linear problem.
sol = struct with fields:
    x: 0.6667
    y: 1.3333

Resuelva el problema de programación lineal de enteros mixtos descrito en Resolver un problema de programación de enteros con opciones no predeterminadas y examine todos los datos de salida.

x = optimvar('x',2,1,'LowerBound',0);
x3 = optimvar('x3','Type','integer','LowerBound',0,'UpperBound',1);
prob = optimproblem;
prob.Objective = -3*x(1) - 2*x(2) - x3;
prob.Constraints.cons1 = x(1) + x(2) + x3 <= 7;
prob.Constraints.cons2 = 4*x(1) + 2*x(2) + x3 == 12;

[sol,fval,exitflag,output] = solve(prob)
Solving problem using intlinprog.
LP:                Optimal objective value is -12.000000.                                           


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
sol = struct with fields:
     x: [2x1 double]
    x3: 1

fval = -12
exitflag = 
    OptimalSolution

output = struct with fields:
        relativegap: 0
        absolutegap: 0
      numfeaspoints: 1
           numnodes: 0
    constrviolation: 0
            message: 'Optimal solution found....'
             solver: 'intlinprog'

Para un problema sin restricciones de enteros, también puede obtener una estructura de multiplicadores de Lagrange no vacía como quinta salida.

Cree y resuelva un problema de optimización utilizando variables de índice con nombre. El problema consiste en maximizar el flujo de fruta ponderado según beneficios a varios aeropuertos, sujeto a restricciones en los flujos ponderados.

rng(0) % For reproducibility
p = optimproblem('ObjectiveSense', 'maximize');
flow = optimvar('flow', ...
    {'apples', 'oranges', 'bananas', 'berries'}, {'NYC', 'BOS', 'LAX'}, ...
    'LowerBound',0,'Type','integer');
p.Objective = sum(sum(rand(4,3).*flow));
p.Constraints.NYC = rand(1,4)*flow(:,'NYC') <= 10;
p.Constraints.BOS = rand(1,4)*flow(:,'BOS') <= 12;
p.Constraints.LAX = rand(1,4)*flow(:,'LAX') <= 35;
sol = solve(p);
Solving problem using intlinprog.
LP:                Optimal objective value is -1027.472366.                                         

Heuristics:        Found 1 solution using ZI round.                                                 
                   Upper bound is -1027.233133.                                                     
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).

Encuentre el flujo óptimo de naranjas y bayas a Nueva York y Los Ángeles.

[idxFruit,idxAirports] = findindex(flow, {'oranges','berries'}, {'NYC', 'LAX'})
idxFruit = 1×2

     2     4

idxAirports = 1×2

     1     3

orangeBerries = sol.flow(idxFruit, idxAirports)
orangeBerries = 2×2

         0  980.0000
   70.0000         0

Esta visualización indica que no se envían naranjas a NYC, se envían 70 bayas a NYC, se envían 980 naranjas a LAX y no se envían bayas a LAX.

Enumere el flujo óptimo de las siguientes frutas:

Fruit Airports

----- --------

Berries NYC

Apples BOS

Oranges LAX

idx = findindex(flow, {'berries', 'apples', 'oranges'}, {'NYC', 'BOS', 'LAX'})
idx = 1×3

     4     5    10

optimalFlow = sol.flow(idx)
optimalFlow = 1×3

   70.0000   28.0000  980.0000

Esta visualización indica que se envían 70 bayas a NYC, se envían 28 manzanas a BOS y se envían 980 naranjas a LAX.

Para resolver el sistema de ecuaciones no lineal

exp(-exp(-(x1+x2)))=x2(1+x12)x1cos(x2)+x2sin(x1)=12

utilizando el enfoque basado en problemas, defina primero x como una variable de optimización de dos elementos.

x = optimvar('x',2);

Cree la primera ecuación como una expresión de igualdad de optimización.

eq1 = exp(-exp(-(x(1) + x(2)))) == x(2)*(1 + x(1)^2);

De forma similar, cree la segunda ecuación como una expresión de igualdad de optimización.

eq2 = x(1)*cos(x(2)) + x(2)*sin(x(1)) == 1/2;

Cree un problema de ecuación y coloque las ecuaciones en el problema.

prob = eqnproblem;
prob.Equations.eq1 = eq1;
prob.Equations.eq2 = eq2;

Revise el problema.

show(prob)
  EquationProblem : 

	Solve for:
       x


 eq1:
       exp((-exp((-(x(1) + x(2)))))) == (x(2) .* (1 + x(1).^2))

 eq2:
       ((x(1) .* cos(x(2))) + (x(2) .* sin(x(1)))) == 0.5

Resuelva el problema comenzando por el punto [0,0]. Para el enfoque basado en problemas, especifique el punto inicial como una estructura, con los nombres de variable como campos de la estructura. Para este problema solo existe una variable, x.

x0.x = [0 0];
[sol,fval,exitflag] = solve(prob,x0)
Solving problem using fsolve.

Equation solved.

fsolve completed because the vector of function values is near zero
as measured by the value of the function tolerance, and
the problem appears regular as measured by the gradient.
sol = struct with fields:
    x: [2x1 double]

fval = struct with fields:
    eq1: -2.4070e-07
    eq2: -3.8255e-08

exitflag = 
    EquationSolved

Visualice el punto de solución.

disp(sol.x)
    0.3532
    0.6061

Las funciones no compatibles requieren fcn2optimexpr

Si las funciones de la ecuación no están compuestas por funciones elementales, deberá convertir las funciones en expresiones de optimización utilizando fcn2optimexpr. Para el presente ejemplo:

ls1 = fcn2optimexpr(@(x)exp(-exp(-(x(1)+x(2)))),x);
eq1 = ls1 == x(2)*(1 + x(1)^2);
ls2 = fcn2optimexpr(@(x)x(1)*cos(x(2))+x(2)*sin(x(1)),x);
eq2 = ls2 == 1/2;

Consulte Supported Operations for Optimization Variables and Expressions y Convert Nonlinear Function to Optimization Expression.

Argumentos de entrada

contraer todo

Problema de optimización o problema de ecuación, especificado como objeto OptimizationProblem u objeto EquationProblem. Cree un problema de optimización con optimproblem; cree un problema de ecuación con eqnproblem.

Advertencia

El enfoque basado en problemas no es compatible con valores complejos en una función objetivo, igualdades no lineales o desigualdades no lineales. Si el cálculo de una función tiene un valor complejo, incluso como valor intermedio, el resultado final puede ser incorrecto.

Ejemplo: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

Ejemplo: prob = eqnproblem; prob.Equations = eqs;

Punto inicial, especificado como estructura con nombres de campo idénticos a los nombres de variables de prob.

Para algunos solvers de Global Optimization Toolbox, x0 puede ser un vector de objetos OptimizationValues que representa varios puntos iniciales. Cree los puntos utilizando la función optimvalues. Estos solvers son:

  • ga (Global Optimization Toolbox), gamultiobj (Global Optimization Toolbox), paretosearch (Global Optimization Toolbox) y particleswarm (Global Optimization Toolbox). Estos solvers aceptan varios puntos de inicio como miembros de la población inicial.

  • MultiStart (Global Optimization Toolbox). Este solver acepta varios puntos iniciales para un solver local como fmincon.

  • surrogateopt (Global Optimization Toolbox). Este solver acepta varios puntos iniciales para ayudar a crear un sustituto inicial.

Para ver un ejemplo donde se utiliza x0 con variables de índice con nombre, consulte Create Initial Point for Optimization with Named Index Variables.

Ejemplo: Si prob tiene variables llamadas x e y: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3].

Tipos de datos: struct

Solver de inicio múltiple, especificado como objeto MultiStart (Global Optimization Toolbox) u objeto GlobalSearch (Global Optimization Toolbox). Cree ms utilizando los comandos MultiStart o GlobalSearch.

En este momento GlobalSearch solo es compatible con el solver local fmincon y MultiStart solo es compatible con los solvers locales fmincon, fminunc y lsqnonlin.

Ejemplo: ms = MultiStart;

Ejemplo: ms = GlobalSearch(FunctionTolerance=1e-4);

Argumentos de par nombre-valor

Especifique pares de argumentos opcionales Name1=Value1,...,NameN=ValueN, donde Name es el nombre del argumento y Value el valor correspondiente. Los argumentos nombre-valor deben aparecer tras otros argumentos, aunque no importa el orden de los pares.

En versiones anteriores a R2021a, utilice comas para separar cada nombre y valor, y encierre Name entre comillas.

Ejemplo: solve(prob,'Options',opts)

Número mínimo de puntos iniciales para MultiStart (Global Optimization Toolbox), especificado como entero positivo. Este argumento se aplica únicamente cuando llama a solve con el argumento ms. solve utiliza todos los valores de x0 como puntos de inicio. Si MinNumStartPoints es mayor que el número de valores de x0, solve genera más puntos de inicio de forma uniforme y aleatoria dentro de los límites del problema. Si un componente está desacotado, solve genera puntos utilizando los límites artificiales predeterminados para MultiStart.

Ejemplo: solve(prob,x0,ms,MinNumStartPoints=50)

Tipos de datos: double

Opciones de optimización, especificadas como objeto creado por optimoptions o estructura de opciones como la creada por optimset.

Internamente la función solve llama a un solver relevante, como se detalla en la referencia del argumento 'solver'. Asegúrese de que options es compatible con el solver. Por ejemplo, intlinprog no permite que las opciones sean una estructura y lsqnonneg no permite que las opciones sean un objeto.

Para sugerencias sobre ajustes de opciones para mejorar una solución intlinprog o la velocidad de una solución, consulte Tuning Integer Linear Programming. Para linprog, el algoritmo 'dual-simplex' predeterminado es normalmente rápido y eficiente en lo que se refiere a la memoria. Ocasionalmente, linprog resuelve un problema grande más rápidamente cuando la opción Algorithm es 'interior-point'. Para sugerencias sobre ajustes de opciones para mejorar la solución a un problema no lineal, consulte Options in Common Use: Tuning and Troubleshooting y Mejorar los resultados.

Ejemplo: options = optimoptions('intlinprog','Display','none')

Solver de optimización, especificado como nombre de un solver de la lista. En el caso de los problemas de optimización, esta tabla contiene los solvers disponibles para cada tipo de problema, incluyendo solvers de Global Optimization Toolbox. Los detalles de los problemas de ecuación aparecen debajo de los detalles del solver de optimización.

Para convertir problemas no lineales con restricciones de enteros mediante prob2struct, la estructura de problema resultante puede depender del solver elegido. Si no cuenta con licencia para Global Optimization Toolbox, deberá especificar el solver. Consulte Integer Constraints in Nonlinear Problem-Based Optimization.

El solver predeterminado para cada tipo de problema de optimización se enumera aquí.

Tipo de problemaSolver predeterminado
Programación lineal (LP)linprog
Programación lineal de enteros mixtos (MILP)intlinprog
Programación cuadrática (QP)quadprog
Programación de cono de segundo orden (SOCP)coneprog
Mínimos cuadrados linealeslsqlin
Mínimos cuadrados no linealeslsqnonlin
Programación no lineal (NLP)

fminunc para problemas sin restricciones, de lo contrario fmincon

Programación no lineal de enteros mixtos (MINLP)ga (Global Optimization Toolbox)
Multiobjetivogamultiobj (Global Optimization Toolbox)

En esta tabla, Yes indica que el solver está disponible para el tipo de problema, x indica que el solver no está disponible.

Tipo de problema

LPMILPQPSOCPMínimos cuadrados linealesMínimos cuadrados no linealesNLPMINLP
Solver
linprog

Yes

xxxxxxx
intlinprog

Yes

Yes

xxxxxx
quadprog

Yes

x

Yes

Yes

Yes

xxx
coneprog

Yes

xx

Yes

xxxx
lsqlinxxxx

Yes

xxx
lsqnonnegxxxx

Yes

xxx
lsqnonlinxxxx

Yes

Yes

xx
fminunc

Yes

x

Yes

x

Yes

Yes

Yes

x
fmincon

Yes

x

Yes

Yes

Yes

Yes

Yes

x
patternsearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x
ga (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

particleswarm (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
simulannealbnd (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
surrogateopt (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

gamultiobj (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

paretosearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x

Nota

Si elige lsqcurvefit como solver para un problema de mínimos cuadrados, solve utiliza lsqnonlin. Los solvers lsqcurvefit y lsqnonlin son idénticos para solve.

Precaución

En problemas de maximización (prob.ObjectiveSense es "max" o "maximize"), no especifique un solver de mínimos cuadrados (uno con un nombre que comience por lsq). Si lo hace, solve genera un error porque estos solvers no pueden realizar una maximización.

Para resolución de ecuaciones, esta tabla contiene los solvers disponibles para cada tipo de problema. En esta tabla,

  • * indica el solver predeterminado para el tipo de problema.

  • Y indica un solver disponible.

  • N indica un solver no disponible.

Solvers compatibles para ecuaciones

Tipo de ecuaciónlsqlinlsqnonnegfzerofsolvelsqnonlin
Lineal*NY (solo escalar)YY
Lineal con límites*YNNY
Escalar no linealNN*YY
Sistema no linealNNN*Y
Sistema no lineal con límitesNNNN*

Ejemplo: 'intlinprog'

Tipos de datos: char | string

Indicación para utilizar diferenciación automática (AD) para la función objetivo no lineal, especificada como 'auto' (utilice AD si es posible), 'auto-forward' (utilice AD progresiva si es posible), 'auto-reverse' (utilice AD inversa si es posible), o 'finite-differences' (no utilice AD). Las opciones que incluyen auto provocan que el solver subyacente utilice información de gradiente al resolver el problema, siempre que sea compatible con la función objetivo, como se describe en Supported Operations for Optimization Variables and Expressions. Para ver un ejemplo, consulte Effect of Automatic Differentiation in Problem-Based Optimization.

Los solvers eligen de forma predeterminada el siguiente tipo de AD:

  • Para una función objetivo no lineal general, fmincon recurre de forma predeterminada a la AD inversa para la función objetivo. fmincon recurre de forma predeterminada a la AD inversa para la función de restricción no lineal cuando el número de restricciones no lineales es inferior al número de variables. De lo contrario, fmincon recurre de forma predeterminada a la AD progresiva para la función de restricción no lineal.

  • Para una función objetivo no lineal general, fminunc recurre de forma predeterminada a la AD inversa.

  • Para una función objetivo de mínimos cuadrados, fmincon y fminunc recurren de forma predeterminada a la AD progresiva para la función objetivo. Para ver la definición de una función objetivo de mínimos cuadrados basada en problemas, consulte Write Objective Function for Problem-Based Least Squares.

  • lsqnonlin recurre de forma predeterminada a la AD progresiva cuando el número de elementos del vector objetivo es mayor que o igual al número de variables. De lo contrario, lsqnonlin recurre de forma predeterminada a la AD inversa.

  • fsolve recurre de forma predeterminada a la AD progresiva cuando el número de ecuaciones es mayor que o igual al número de variables. De lo contrario, fsolve recurre de forma predeterminada a la AD inversa.

Ejemplo: 'finite-differences'

Tipos de datos: char | string

Indicación para utilizar diferenciación automática (AD) para funciones de restricción no lineal, especificada como 'auto' (utilice AD si es posible), 'auto-forward' (utilice AD progresiva si es posible), 'auto-reverse' (utilice AD inversa si es posible), o 'finite-differences' (no utilice AD). Las opciones que incluyen auto provocan que el solver subyacente utilice información de gradiente al resolver el problema, siempre que sea compatible con las funciones de restricción, como se describe en Supported Operations for Optimization Variables and Expressions. Para ver un ejemplo, consulte Effect of Automatic Differentiation in Problem-Based Optimization.

Los solvers eligen de forma predeterminada el siguiente tipo de AD:

  • Para una función objetivo no lineal general, fmincon recurre de forma predeterminada a la AD inversa para la función objetivo. fmincon recurre de forma predeterminada a la AD inversa para la función de restricción no lineal cuando el número de restricciones no lineales es inferior al número de variables. De lo contrario, fmincon recurre de forma predeterminada a la AD progresiva para la función de restricción no lineal.

  • Para una función objetivo no lineal general, fminunc recurre de forma predeterminada a la AD inversa.

  • Para una función objetivo de mínimos cuadrados, fmincon y fminunc recurren de forma predeterminada a la AD progresiva para la función objetivo. Para ver la definición de una función objetivo de mínimos cuadrados basada en problemas, consulte Write Objective Function for Problem-Based Least Squares.

  • lsqnonlin recurre de forma predeterminada a la AD progresiva cuando el número de elementos del vector objetivo es mayor que o igual al número de variables. De lo contrario, lsqnonlin recurre de forma predeterminada a la AD inversa.

  • fsolve recurre de forma predeterminada a la AD progresiva cuando el número de ecuaciones es mayor que o igual al número de variables. De lo contrario, fsolve recurre de forma predeterminada a la AD inversa.

Ejemplo: 'finite-differences'

Tipos de datos: char | string

Indicación para utilizar diferenciación automática (AD) para funciones de restricción no lineal, especificada como 'auto' (utilice AD si es posible), 'auto-forward' (utilice AD progresiva si es posible), 'auto-reverse' (utilice AD inversa si es posible), o 'finite-differences' (no utilice AD). Las opciones que incluyen auto provocan que el solver subyacente utilice información de gradiente al resolver el problema, siempre que sea compatible con las funciones de ecuación, como se describe en Supported Operations for Optimization Variables and Expressions. Para ver un ejemplo, consulte Effect of Automatic Differentiation in Problem-Based Optimization.

Los solvers eligen de forma predeterminada el siguiente tipo de AD:

  • Para una función objetivo no lineal general, fmincon recurre de forma predeterminada a la AD inversa para la función objetivo. fmincon recurre de forma predeterminada a la AD inversa para la función de restricción no lineal cuando el número de restricciones no lineales es inferior al número de variables. De lo contrario, fmincon recurre de forma predeterminada a la AD progresiva para la función de restricción no lineal.

  • Para una función objetivo no lineal general, fminunc recurre de forma predeterminada a la AD inversa.

  • Para una función objetivo de mínimos cuadrados, fmincon y fminunc recurren de forma predeterminada a la AD progresiva para la función objetivo. Para ver la definición de una función objetivo de mínimos cuadrados basada en problemas, consulte Write Objective Function for Problem-Based Least Squares.

  • lsqnonlin recurre de forma predeterminada a la AD progresiva cuando el número de elementos del vector objetivo es mayor que o igual al número de variables. De lo contrario, lsqnonlin recurre de forma predeterminada a la AD inversa.

  • fsolve recurre de forma predeterminada a la AD progresiva cuando el número de ecuaciones es mayor que o igual al número de variables. De lo contrario, fsolve recurre de forma predeterminada a la AD inversa.

Ejemplo: 'finite-differences'

Tipos de datos: char | string

Argumentos de salida

contraer todo

Solución, devuelta como una estructura o un vector OptimizationValues. sol es un vector OptimizationValues cuando el problema es multiobjetivo. Para problemas de un único objetivo, los campos de la estructura devuelta son los nombres de las variables de optimización del problema. Consulte optimvar.

Valor de la función objetivo en la solución, devuelto como una de las siguientes opciones:

Tipo de problemaValor(es) devuelto(s)
Optimizar función objetivo escalar f(x)Número real f(sol)
Mínimos cuadradosNúmero real, la suma de cuadrados de los valores residuales en la solución
Resolver ecuaciónSi prob.Equations es una entrada única: vector real de valores de función en la solución, es decir, el lado izquierdo de las ecuaciones menos el lado derecho
Si prob.Equations tiene múltiples campos con nombre: estructura con mismo nombre que prob.Equations, donde cada valor de campo es el lado izquierdo de las ecuaciones nombradas menos el lado derecho
MultiobjetivoMatriz con una fila para cada componente de la función objetivo y una columna para cada punto de solución.

Sugerencia

Si olvida pedir fval para un objetivo definido como una expresión de optimización o expresión de ecuación, puede calcularlo utilizando

fval = evaluate(prob.Objective,sol)

Si el objetivo se define como una estructura con un solo campo,

fval = evaluate(prob.Objective.ObjectiveName,sol)

Si el objetivo es una estructura con varios campos, escriba un bucle.

fnames = fields(prob.Equations);
for i = 1:length(fnames)
    fval.(fnames{i}) = evaluate(prob.Equations.(fnames{i}),sol);
end

Razón por la que el solver se ha detenido, devuelta como una variable de enumeración. Puede convertir exitflag a su equivalente numérico utilizando double(exitflag) y a su equivalente de cadena utilizando string(exitflag).

Esta tabla describe los indicadores de salida para el solver intlinprog.

Indicador de salida para intlinprogEquivalente numéricoSignificado
OptimalWithPoorFeasibility3

La solución es factible con respecto a la tolerancia ConstraintTolerance relativa, pero no es factible en lo que respecta a la tolerancia absoluta.

IntegerFeasible2intlinprog se ha detenido prematuramente y ha encontrado un punto factible de enteros.
OptimalSolution

1

El solver ha convergido a una solución x.

SolverLimitExceeded

0

intlinprog sobrepasa una de las siguientes tolerancias:

  • LPMaxIterations

  • MaxNodes

  • MaxTime

  • RootLPMaxIterations

Consulte Tolerancias y criterios de detención. solve también devuelve este indicador de salida cuando se acaba la memoria en el nodo raíz.

OutputFcnStop-1intlinprog detenido por una función de salida o una función de gráfica.
NoFeasiblePointFound

-2

No se ha encontrado ningún punto factible.

Unbounded

-3

El problema está desacotado.

FeasibilityLost

-9

El solver ha perdido factibilidad.

Los exitflag 3 y -9 están relacionados con soluciones que tienen infactibilidades amplias. Estas normalmente surgen de matrices de restricciones lineales que tienen un elevado número de condiciones, o de problemas que tienen un elevado número de componentes de solución. Para corregir estos problemas, intente escalar las matrices de coeficientes, eliminar las restricciones lineales redundantes o establecer límites más estrictos en las variables.

Esta tabla describe los indicadores de salida para el solver linprog.

Indicador de salida para linprogEquivalente numéricoSignificado
OptimalWithPoorFeasibility3

La solución es factible con respecto a la tolerancia ConstraintTolerance relativa, pero no es factible en lo que respecta a la tolerancia absoluta.

OptimalSolution1

El solver ha convergido a una solución x.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations.

NoFeasiblePointFound-2

No se ha encontrado ningún punto factible.

Unbounded-3

El problema está desacotado.

FoundNaN-4

Se ha encontrado un valor NaN durante la ejecución del algoritmo.

PrimalDualInfeasible-5

Ni el problema primal ni el dual son factibles.

DirectionTooSmall-7

La dirección de búsqueda es demasiado pequeña. No se puede seguir progresando.

FeasibilityLost-9

El solver ha perdido factibilidad.

Los exitflag 3 y -9 están relacionados con soluciones que tienen infactibilidades amplias. Estas normalmente surgen de matrices de restricciones lineales que tienen un elevado número de condiciones, o de problemas que tienen un elevado número de componentes de solución. Para corregir estos problemas, intente escalar las matrices de coeficientes, eliminar las restricciones lineales redundantes o establecer límites más estrictos en las variables.

Esta tabla describe los indicadores de salida para el solver lsqlin.

Indicador de salida para lsqlinEquivalente numéricoSignificado
FunctionChangeBelowTolerance3

El cambio en el valor residual es menor que la tolerancia especificada options.FunctionTolerance. (Algoritmo trust-region-reflective)

StepSizeBelowTolerance

2

Tamaño de salto menor que options.StepTolerance, se cumplen las restricciones. (Algoritmo interior-point)

OptimalSolution1

El solver ha convergido a una solución x.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations.

NoFeasiblePointFound-2

Para problemas de optimización, el problema no es factible. O, para el algoritmo interior-point, tamaño de salto menor que options.StepTolerance, pero no se cumplen las restricciones.

No se ha encontrado ninguna solución para los problemas de ecuación.

IllConditioned-4

Las condiciones mal definidas no permiten seguir optimizando.

NoDescentDirectionFound-8

La dirección de búsqueda es demasiado pequeña. No se puede seguir progresando. (Algoritmo interior-point)

Esta tabla describe los indicadores de salida para el solver quadprog.

Indicador de salida para quadprogEquivalente numéricoSignificado
LocalMinimumFound4

Mínimo local encontrado; el mínimo no es único.

FunctionChangeBelowTolerance3

El cambio en el valor de la función objetivo es menor que la tolerancia especificada options.FunctionTolerance. (Algoritmo trust-region-reflective)

StepSizeBelowTolerance

2

Tamaño de salto menor que options.StepTolerance, se cumplen las restricciones. (Algoritmo interior-point-convex)

OptimalSolution1

El solver ha convergido a una solución x.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations.

NoFeasiblePointFound-2

El problema no es factible. O, para el algoritmo interior-point, tamaño de salto menor que options.StepTolerance, pero no se cumplen las restricciones.

IllConditioned-4

Las condiciones mal definidas no permiten seguir optimizando.

Nonconvex

-6

Problema no convexo detectado. (Algoritmo interior-point-convex)

NoDescentDirectionFound-8

No se ha podido calcular una dirección de salto. (Algoritmo interior-point-convex)

Esta tabla describe los indicadores de salida para el solver coneprog.

Indicador de salida para coneprogEquivalente numéricoSignificado
OptimalSolution1

El solver ha convergido a una solución x.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations o el tiempo de resolución en segundos ha sobrepasado options.MaxTime.

NoFeasiblePointFound-2

El problema no es factible.

Unbounded-3

El problema está desacotado.

DirectionTooSmall

-7

La dirección de búsqueda se ha vuelto demasiado pequeña. No se puede seguir progresando.

Unstable-10

El problema es numéricamente inestable.

Esta tabla describe los indicadores de salida para el solver lsqcurvefit o lsqnonlin.

Indicador de salida para lsqnonlinEquivalente numéricoSignificado
SearchDirectionTooSmall 4

La magnitud de la dirección de búsqueda era menor que options.StepTolerance.

FunctionChangeBelowTolerance3

El cambio en el valor residual era inferior a options.FunctionTolerance.

StepSizeBelowTolerance

2

Tamaño de salto menor que options.StepTolerance.

OptimalSolution1

El solver ha convergido a una solución x.

SolverLimitExceeded0

El número de iteraciones ha sobrepasado options.MaxIterations o el número de evaluaciones de función ha sobrepasado options.MaxFunctionEvaluations.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

Para problemas de optimización, el problema no es factible: los límites lb y ub son inconsistentes.

No se ha encontrado ninguna solución para los problemas de ecuación.

Esta tabla describe los indicadores de salida para el solver fminunc.

Indicador de salida para fminuncEquivalente numéricoSignificado
NoDecreaseAlongSearchDirection5

La reducción prevista en la función objetivo es inferior a la tolerancia options.FunctionTolerance.

FunctionChangeBelowTolerance3

El cambio en el valor de la función objetivo es inferior a la tolerancia options.FunctionTolerance.

StepSizeBelowTolerance

2

El cambio en x es menor que la tolerancia options.StepTolerance.

OptimalSolution1

La magnitud del gradiente es menor que la tolerancia options.OptimalityTolerance.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations o el número de evaluaciones de función sobrepasa options.MaxFunctionEvaluations.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

Unbounded-3

La función objetivo en la iteración actual está por debajo de options.ObjectiveLimit.

Esta tabla describe los indicadores de salida para el solver fmincon.

Indicador de salida para fminconEquivalente numéricoSignificado
NoDecreaseAlongSearchDirection5

La magnitud de la derivada direccional en la dirección de búsqueda es inferior a 2*options.OptimalityTolerance y la vulneración de restricciones máxima es inferior a options.ConstraintTolerance.

SearchDirectionTooSmall4

La magnitud de la dirección de búsqueda es inferior a 2*options.StepTolerance y la vulneración de restricciones máxima es inferior a options.ConstraintTolerance.

FunctionChangeBelowTolerance3

El cambio en el valor de la función objetivo es inferior a options.FunctionTolerance y la vulneración de restricciones máxima es inferior a options.ConstraintTolerance.

StepSizeBelowTolerance

2

El cambio en x es inferior a options.StepTolerance y la vulneración de restricciones máxima es inferior a options.ConstraintTolerance.

OptimalSolution1

La medida de optimalidad de primer orden es inferior a options.OptimalityTolerance y la vulneración de restricciones máxima es inferior a options.ConstraintTolerance.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations o el número de evaluaciones de función sobrepasa options.MaxFunctionEvaluations.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

No se ha encontrado ningún punto factible.

Unbounded-3

La función objetivo en la iteración actual está por debajo de options.ObjectiveLimit y la vulneración de restricciones máxima es inferior a options.ConstraintTolerance.

Esta tabla describe los indicadores de salida para el solver fsolve.

Indicador de salida para fsolveEquivalente numéricoSignificado
SearchDirectionTooSmall4

La magnitud de la dirección de búsqueda es inferior a options.StepTolerance, ecuación resuelta.

FunctionChangeBelowTolerance3

El cambio en el valor de la función objetivo es inferior a la tolerancia options.FunctionTolerance, ecuación resuelta.

StepSizeBelowTolerance

2

El cambio en x es inferior a options.StepTolerance, ecuación resuelta.

OptimalSolution1

La medida de optimalidad de primer orden es inferior a options.OptimalityTolerance, ecuación resuelta.

SolverLimitExceeded0

El número de iteraciones sobrepasa options.MaxIterations o el número de evaluaciones de función sobrepasa options.MaxFunctionEvaluations.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

Ha convergido a un punto que no es una raíz.

TrustRegionRadiusTooSmall-3

Ecuación no resuelta. El radio de la región de confianza se ha vuelto demasiado pequeño (algoritmo trust-region-dogleg).

Esta tabla describe los indicadores de salida para el solver fzero.

Indicador de salida para fzeroEquivalente numéricoSignificado
OptimalSolution1

Ecuación resuelta.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

FoundNaNInfOrComplex-4

Se ha encontrado NaN, Inf o un valor complejo durante la búsqueda de un intervalo que contiene un cambio de signo.

SingularPoint-5

Puede haber convergido a un punto singular.

CannotDetectSignChange-6No ha encontrado dos puntos con signos opuestos del valor de función.

Esta tabla describe los indicadores de salida para el solver patternsearch.

Indicador de salida para patternsearchEquivalente numéricoSignificado
SearchDirectionTooSmall4

La magnitud del salto es inferior a la precisión de máquina y la vulneración de restricciones es inferior a ConstraintTolerance.

FunctionChangeBelowTolerance3

Tanto el cambio en fval como el tamaño de malla son inferiores a la tolerancia especificada y la vulneración de restricciones inferior a ConstraintTolerance.

StepSizeBelowTolerance

2

Tanto el cambio en x como el tamaño de malla son inferiores a StepTolerance y la vulneración de restricciones inferior a ConstraintTolerance.

SolverConvergedSuccessfully1

Sin restricciones no lineales: la magnitud del tamaño de malla es inferior a la tolerancia especificada y la vulneración de restricciones es inferior a ConstraintTolerance.

Con restricciones no lineales: la magnitud de la medida de complementariedad (definida después de esta tabla) es inferior a sqrt(ConstraintTolerance), el subproblema se resuelve utilizando una malla más fina que MeshTolerance y la vulneración de restricciones es inferior a ConstraintTolerance.

SolverLimitExceeded0

Se ha alcanzado el número máximo de evaluaciones de función o de iteraciones.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

No se ha encontrado ningún punto factible.

En el solver de restricción no lineal, la medida de complementariedad es la norma del vector cuyos elementos son ciλi, donde ci es la vulneración de la restricción de desigualdad no lineal y λi es el correspondiente multiplicador de Lagrange.

Esta tabla describe los indicadores de salida para el solver ga.

Indicador de salida para gaEquivalente numéricoSignificado
MinimumFitnessLimitReached5

Se ha alcanzado el límite de aptitud mínimo FitnessLimit y la vulneración de restricciones es inferior a ConstraintTolerance.

SearchDirectionTooSmall4

La magnitud del salto es inferior a la precisión de máquina y la vulneración de restricciones es inferior a ConstraintTolerance.

FunctionChangeBelowTolerance3

El valor de la función de aptitud no ha cambiado en MaxStallGenerations generaciones y la vulneración de restricciones es inferior a ConstraintTolerance.

SolverConvergedSuccessfully1

Sin restricciones no lineales: el cambio acumulativo promedio en el valor de la función de aptitud a lo largo de MaxStallGenerations generaciones es inferior a FunctionTolerance y la vulneración de restricciones es inferior a ConstraintTolerance.

Con restricciones no lineales: la magnitud de la medida de complementariedad (consulte Complementarity Measure (Global Optimization Toolbox)) es inferior a sqrt(ConstraintTolerance), el subproblema se resuelve utilizando una tolerancia inferior a FunctionTolerance y la vulneración de restricciones es inferior a ConstraintTolerance.

SolverLimitExceeded0

Se ha sobrepasado el número máximo de generaciones MaxGenerations.

OutputFcnStop-1

Detenido por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

No se ha encontrado ningún punto factible.

StallTimeLimitExceeded-4

Se ha sobrepasado el límite de tiempo de detención MaxStallTime.

TimeLimitExceeded-5

Se ha sobrepasado el límite de tiempo MaxTime.

Esta tabla describe los indicadores de salida para el solver particleswarm.

Indicador de salida para particleswarmEquivalente numéricoSignificado
SolverConvergedSuccessfully1

El cambio relativo en el valor objetivo a lo largo de las últimas options.MaxStallIterations iteraciones es inferior a options.FunctionTolerance.

SolverLimitExceeded0

El número de iteraciones ha sobrepasado options.MaxIterations.

OutputFcnStop-1

Iteraciones detenidas por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

Los límites son inconsistentes: para algunos i, lb(i) > ub(i).

Unbounded-3

El mejor valor de la función objetivo está por debajo de options.ObjectiveLimit.

StallTimeLimitExceeded-4

El mejor valor de la función objetivo no ha cambiado en un intervalo de options.MaxStallTime.

TimeLimitExceeded-5

El tiempo de ejecución ha sobrepasado options.MaxTime segundos.

Esta tabla describe los indicadores de salida para el solver simulannealbnd.

Indicador de salida para simulannealbndEquivalente numéricoSignificado
ObjectiveValueBelowLimit5

El valor de la función objetivo es inferior a options.ObjectiveLimit.

SolverConvergedSuccessfully1

El cambio promedio en el valor de la función objetivo a lo largo de options.MaxStallIterations iteraciones es inferior a options.FunctionTolerance.

SolverLimitExceeded0

Se ha sobrepasado el número máximo de generaciones MaxGenerations.

OutputFcnStop-1

Optimización terminada por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

No se ha encontrado ningún punto factible.

TimeLimitExceeded-5

Se ha sobrepasado el límite de tiempo.

Esta tabla describe los indicadores de salida para el solver surrogateopt.

Indicador de salida para surrogateoptEquivalente numéricoSignificado
BoundsEqual10

El problema tiene una solución factible única debido a uno de los siguientes motivos:

  • Todos los límites superiores ub (Global Optimization Toolbox) son idénticos a los límites inferiores lb (Global Optimization Toolbox).

  • Las restricciones de igualdad lineales Aeq*x = beq y los límites tienen un punto de solución único.

surrogateopt devuelve el punto factible y el valor de la función sin realizar ningún tipo de optimización.

FeasiblePointFound3Punto factible encontrado. El solver se ha detenido porque no se han encontrado suficientes puntos factibles nuevos para continuar.
ObjectiveLimitAttained1

El valor de la función objetivo es inferior a options.ObjectiveLimit. Este indicador de salida tiene precedencia frente al indicador de salida 10 cuando ambos se aplican.

SolverLimitExceeded0

El número de evaluaciones de función sobrepasa options.MaxFunctionEvaluations o el tiempo transcurrido sobrepasa options.MaxTime. Si el problema tiene desigualdades no lineales, la solución es factible.

OutputFcnStop-1

Optimización terminada por una función de salida o una función de gráfica.

NoFeasiblePointFound-2

No se ha encontrado ningún punto factible debido a uno de los siguientes motivos:

  • Un límite inferior lb(i) sobrepasa el correspondiente límite superior ub(i). Uno o más ceil(lb(i)) sobrepasan el correspondiente floor(ub(i)) para i en intcon (Global Optimization Toolbox). En este caso, solve devuelve x = [] y fval = [].

  • lb = ub y el punto lb no es factible. En este caso, x = lb, y fval = objconstr(x).Fval.

  • Las restricciones lineales y, si están presentes, las restricciones de enteros no son factibles junto con los límites. En este caso, solve devuelve x = [] y fval = [].

  • Los límites, las restricciones de enteros y las restricciones lineales son factibles, pero no se ha encontrado ninguna solución factible con restricciones no lineales. En este caso, x es el punto de menor infactibilidad máxima de restricciones no lineales y fval = objconstr(x).Fval.

Esta tabla describe los indicadores de salida para los solvers MultiStart y GlobalSearch.

Indicador de salida para MultiStart o GlobalSearchEquivalente numéricoSignificado
LocalMinimumFoundSomeConverged2Se ha encontrado al menos un mínimo local. Algunas ejecuciones del solver local han convergido.
LocalMinimumFoundAllConverged1Se ha encontrado al menos un mínimo local. Todas las ejecuciones del solver local han convergido.
SolverLimitExceeded0No se ha encontrado ningún mínimo local. El solver local se ha llamado al menos una vez y al menos una llamada de solver ha agotado las iteraciones.
OutputFcnStop–1Detenido por una función de salida o una función de gráfica.
NoFeasibleLocalMinimumFound–2No se ha encontrado ningún mínimo local factible.
TimeLimitExceeded–5Límite MaxTime sobrepasado.
NoSolutionFound–8No se ha encontrado ninguna solución. Todas las ejecuciones tenían indicador de salida de solver local –2 o inferior, pero no todos iguales a –2.
FailureInSuppliedFcn–10Se han encontrado fallos en la función objetivo o de restricción lineal.

Esta tabla describe los indicadores de salida para el solver paretosearch.

Indicador de salida para paretosearchEquivalente numéricoSignificado
SolverConvergedSuccessfully1

Se cumple una de las siguientes condiciones:

  • El tamaño de malla de todas las incumbentes es inferior a options.MeshTolerance y las restricciones (si existen) se cumplen dentro de options.ConstraintTolerance.

  • El cambio relativo en la distribución del frente de Pareto es inferior a options.ParetoSetChangeTolerance y las restricciones (si existen) se cumplen dentro de options.ConstraintTolerance.

  • El cambio relativo en el volumen del frente de Pareto es inferior a options.ParetoSetChangeTolerance y las restricciones (si existen) se cumplen dentro de options.ConstraintTolerance.

SolverLimitExceeded0El número de iteraciones sobrepasa options.MaxIterations o el número de evaluaciones de función sobrepasa options.MaxFunctionEvaluations.
OutputFcnStop–1Detenido por una función de salida o una función de gráfica.
NoFeasiblePointFound–2El solver no puede encontrar un punto que cumpla todas las restricciones.
TimeLimitExceeded–5El tiempo de optimización sobrepasa options.MaxTime.

Esta tabla describe los indicadores de salida para el solver gamultiobj.

Indicador de salida para paretosearchEquivalente numéricoSignificado
SolverConvergedSuccessfully1El promedio geométrico del cambio relativo en el valor de la distribución a lo largo de options.MaxStallGenerations generaciones es inferior a options.FunctionTolerance y la distribución final es inferior a la distribución promedio a lo largo de las últimas options.MaxStallGenerations generaciones.
SolverLimitExceeded0El número de generaciones sobrepasa options.MaxGenerations.
OutputFcnStop–1Detenido por una función de salida o una función de gráfica.
NoFeasiblePointFound–2El solver no puede encontrar un punto que cumpla todas las restricciones.
TimeLimitExceeded–5El tiempo de optimización sobrepasa options.MaxTime.

Información sobre el proceso de optimización, devuelta como estructura. La estructura de salida contiene los campos del campo de salida del solver subyacente relevante, en función del solver solve al que se llama:

  • 'ga' output (Global Optimization Toolbox)

  • 'gamultiobj' output (Global Optimization Toolbox)

  • 'paretosearch' output (Global Optimization Toolbox)

  • 'particleswarm' output (Global Optimization Toolbox)

  • 'patternsearch' output (Global Optimization Toolbox)

  • 'simulannealbnd' output (Global Optimization Toolbox)

  • 'surrogateopt' output (Global Optimization Toolbox)

  • 'MultiStart' y 'GlobalSearch' devuelven la estructura de salida del solver local. Asimismo, la estructura de salida contiene los siguientes campos:

    • globalSolver: o 'MultiStart' o 'GlobalSearch'.

    • objectiveDerivative: toma los valores descritos al final de esta sección.

    • constraintDerivative: toma los valores descritos al final de esta sección o "auto" cuando prob no tiene restricción no lineal.

    • solver: el solver local, como 'fmincon'.

    • local: estructura que contiene información adicional sobre la optimización.

      • sol: soluciones locales devueltas como un vector de objetos OptimizationValues.

      • x0: puntos iniciales para el solver local, devueltos como un arreglo de celdas.

      • exitflag: indicadores de salida de soluciones locales, devueltos como un vector de enteros.

      • output: arreglo de estructura, con una fila para cada solución local. Cada fila es la estructura de salida local que corresponde a una solución local.

solve incluye el campo adicional Solver de la estructura output para identificar al solver utilizado, como 'intlinprog'.

Cuando Solver es un solver no lineal de Optimization Toolbox™, solve incluye uno o dos campos adicionales que describen el tipo de estimación de derivada. Los campos objectivederivative y, si fuera apropiado, constraintderivative pueden tomar los siguientes valores:

  • "reverse-AD" para diferenciación automática inversa

  • "forward-AD" para diferenciación automática progresiva

  • "finite-differences" para estimación de diferencias finitas

  • "closed-form" para funciones lineales o cuadráticas

Multiplicadores de Lagrange en la solución, devueltos como una estructura.

Nota

solve no devuelve lambda para problemas de resolución de ecuaciones.

Para los solvers intlinprog y fminunc, lambda está vacía, []. Para los otros solvers, lambda tiene estos campos:

  • Variables: contiene campos para cada variable del problema. Cada nombre de variable del problema es una estructura con dos campos:

    • Lower: multiplicadores de Lagrange asociados a la variable propiedad LowerBound, devueltos como un arreglo del mismo tamaño que la variable. Las entradas distintas de cero indican que la solución se encuentra en el límite inferior. Estos multiplicadores tienen la estructura lambda.Variables.variablename.Lower.

    • Upper: multiplicadores de Lagrange asociados a la variable propiedad UpperBound, devueltos como un arreglo del mismo tamaño que la variable. Las entradas distintas de cero indican que la solución se encuentra en el límite superior. Estos multiplicadores tienen la estructura lambda.Variables.variablename.Upper.

  • Constraints: contiene un campo para cada restricción del problema. Cada restricción del problema tiene una estructura cuyo nombre es el nombre de la restricción y cuyo valor es un arreglo numérico del mismo tamaño que la restricción. Las entradas distintas de cero indican que la restricción se encuentra activa en la solución. Estos multiplicadores tienen la estructura lambda.Constraints.constraintname.

    Nota

    Todos los elementos de un arreglo de restricción tienen la misma comparación (<=, == o >=) y todos son del mismo tipo (lineales, cuadráticos o no lineales).

Algoritmos

contraer todo

Conversión a formato de solver

Internamente, la función solve resuelve problemas de optimización llamando a un solver. Para saber cuál es el solver predeterminado para el problema y cuáles son los solvers compatibles para el problema, consulte el argumento 'solver'.

Antes de que solve pueda llamar a un solver, los problemas deben convertirse a formato de solver, ya sea mediante solve o a través de algún otro objeto o función asociados. Esta conversión implica, por ejemplo, que las restricciones lineales tengan una representación de matriz en lugar de una expresión de variable de optimización.

El primer salto del algoritmo tiene lugar cuando se colocan expresiones de optimización en el problema. Un objeto OptimizationProblem tiene una lista interna de las variables utilizadas en sus expresiones. Cada variable cuenta con un índice lineal en la expresión y con un tamaño. Por ello, las variables del problema tienen un formato de matriz implícito. La función prob2struct realiza la conversión de formato de problema a formato de solver. Para ver un ejemplo, consulte Convert Problem to Structure.

Para problemas de optimización no lineales, solve utiliza diferenciación automática para calcular los gradientes de la función objetivo y de las funciones de restricción no lineal. Estas derivadas se aplican cuando la función objetivo y la función de restricción están compuestas por Supported Operations for Optimization Variables and Expressions y no utilizan la función fcn2optimexpr. Cuando la diferenciación automática no se aplica, los solvers estiman derivadas utilizando diferencias finitas. Para ver detalles sobre la diferenciación automática, consulte Automatic Differentiation Background.

Para ver los solvers predeterminados y permitidos a los que llama solve, dependiendo del objetivo del problema y las restricciones, consulte 'solver'. Puede anular el valor predeterminado utilizando el argumento de par nombre-valor 'solver' al llamar a solve.

Para ver el algoritmo que intlinprog utiliza para resolver problemas MILP, consulte intlinprog Algorithm. Para ver los algoritmos que linprog utiliza para resolver problemas de programación lineal, consulte Linear Programming Algorithms. Para ver los algoritmos que quadprog utiliza para resolver problemas de programación cuadrática, consulte Quadratic Programming Algorithms. Para ver algoritmos de solver de mínimos cuadrados lineales o no lineales, consulte Least-Squares (Model Fitting) Algorithms. Para ver algoritmos de solver no lineales, consulte Unconstrained Nonlinear Optimization Algorithms y Constrained Nonlinear Optimization Algorithms.

Para la resolución de ecuaciones no lineales, solve representa internamente cada ecuación como la diferencia entre el lado izquierdo y el lado derecho. Entonces, solve intenta minimizar la suma de cuadrados de los componentes de la ecuación. Para ver los algoritmos para resolver sistemas de ecuaciones no lineales, consulte Equation Solving Algorithms. Cuando el problema también tiene límites, solve llama a lsqnonlin para minimizar la suma de cuadrados de los componentes de la ecuación. Consulte Least-Squares (Model Fitting) Algorithms.

Nota

Si su función objetivo es una suma de cuadrados y desea que solve la reconozca como tal, escríbala como norm(expr)^2 o sum(expr.^2) y no como expr'*expr o cualquier otro formato. El analizador interno reconoce una suma de cuadrados solo cuando se representa como el cuadrado de una norma o una suma explícita de cuadrados. Para obtener más detalles, consulte Write Objective Function for Problem-Based Least Squares. Para ver un ejemplo, consulte Nonnegative Linear Least Squares, Problem-Based.

Diferenciación automática

La diferenciación automática (AD) se aplica a las funciones solve y prob2struct en las siguientes condiciones:

  • La función objetivo y la función de restricción son compatibles, como se describe en Supported Operations for Optimization Variables and Expressions. No necesitan utilizar la función fcn2optimexpr.

  • El solver al que llama solve es fmincon, fminunc, fsolve o lsqnonlin.

  • Para problemas de optimización, los argumentos de par nombre-valor 'ObjectiveDerivative' y 'ConstraintDerivative' para solve o prob2struct se establecen en 'auto' (predeterminado), 'auto-forward' o 'auto-reverse'.

  • Para problemas de ecuación, la opción 'EquationDerivative' está establecida en 'auto' (predeterminado), 'auto-forward' o 'auto-reverse'.

Cuando se aplica ADSon compatibles todas las funciones de restricciónHay una o más restricciones no compatibles
Función objetivo compatibleAD utilizada para objetivo y restriccionesAD utilizada solo para objetivo
Función objetivo no compatibleAD utilizada solo para restriccionesAD no utilizada

Cuando no se cumplen estas condiciones, solve estima gradientes mediante diferencias finitas y prob2struct no crea gradientes en sus archivos de función generados.

Los solvers eligen de forma predeterminada el siguiente tipo de AD:

  • Para una función objetivo no lineal general, fmincon recurre de forma predeterminada a la AD inversa para la función objetivo. fmincon recurre de forma predeterminada a la AD inversa para la función de restricción no lineal cuando el número de restricciones no lineales es inferior al número de variables. De lo contrario, fmincon recurre de forma predeterminada a la AD progresiva para la función de restricción no lineal.

  • Para una función objetivo no lineal general, fminunc recurre de forma predeterminada a la AD inversa.

  • Para una función objetivo de mínimos cuadrados, fmincon y fminunc recurren de forma predeterminada a la AD progresiva para la función objetivo. Para ver la definición de una función objetivo de mínimos cuadrados basada en problemas, consulte Write Objective Function for Problem-Based Least Squares.

  • lsqnonlin recurre de forma predeterminada a la AD progresiva cuando el número de elementos del vector objetivo es mayor que o igual al número de variables. De lo contrario, lsqnonlin recurre de forma predeterminada a la AD inversa.

  • fsolve recurre de forma predeterminada a la AD progresiva cuando el número de ecuaciones es mayor que o igual al número de variables. De lo contrario, fsolve recurre de forma predeterminada a la AD inversa.

Nota

Para utilizar derivadas automáticas en un problema convertido por prob2struct, pase opciones que especifiquen estas derivadas.

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

En este momento, la AD funciona únicamente para primeras derivadas; no se aplica a segundas derivadas o superiores. De este modo, por ejemplo, si desea utilizar una matriz hessiana analítica para acelerar la optimización, no puede utilizar solve directamente y en su lugar deberá utilizar el enfoque descrito en Supply Derivatives in Problem-Based Workflow.

Capacidades ampliadas

Historial de versiones

Introducido en R2017b

expandir todo