Generación de código en segundo plano de fmincon
¿Qué es la generación de código?
La generación de código es la conversión de código de MATLAB® a código C utilizando MATLAB Coder™. La generación de código requiere una licencia de MATLAB Coder.
Habitualmente, la generación de código se utiliza para implementar código en hardware que no está ejecutando MATLAB. Por ejemplo, puede implementar código en un robot, utilizando fmincon
para optimizar el movimiento o la planificación.
Para ver un ejemplo, consulte Generar código para fmincon. Para obtener información sobre la generación de código en otros solvers de optimización, consulte Generar código para fsolve, Generate Code for quadprog o Generate Code for lsqcurvefit or lsqnonlin.
Requisitos para la generación de código
fmincon
admite generar código utilizando la funcióncodegen
(MATLAB Coder) o la app MATLAB Coder. Debe disponer de una licencia de MATLAB Coder para generar código.El hardware de destino debe ser compatible con los cálculos estándar de punto flotante de doble precisión. No puede generar código para cálculos de precisión simple o de punto fijo.
Los destinos de generación de código no utilizan las mismas bibliotecas del núcleo matemático que los solvers de MATLAB. Por ello, las soluciones de generación de código pueden variar con respecto a las soluciones de solver, especialmente en problemas que no están bien condicionados.
Todo el código que se vaya a generar debe ser código de MATLAB. En particular, no puede utilizar una función de caja negra personalizada como una función objetivo para
fmincon
. Puede utilizarcoder.ceval
para evaluar una función personalizada con código C o C++. No obstante, la función personalizada debe llamarse en una función de MATLAB.fmincon
no es compatible con el argumentoproblem
para generar código.[x,fval] = fmincon(problem) % Not supported
Debe especificar la función objetivo y todas las funciones de restricción no lineales utilizando identificadores de función, no cadenas ni nombres de caracteres.
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon) % Supported % Not supported: fmincon('fun',...) or fmincon("fun",...)
Todas las matrices de entrada
fmincon
, comoA
,Aeq
,lb
yub
, deben ser matrices llenas, no dispersas. Puede convertir las matrices dispersas en matrices llenas mediante la funciónfull
.Los argumentos
lb
yub
deben tener el mismo número de entradas que el argumentox0
o deben estar vacíos[]
.Si su hardware de destino no admite límites infinitos, utilice
optim.coder.infbound
.Para optimizar código de manera avanzada con procesadores integrados, también necesita una licencia de Embedded Coder®.
Debe incluir opciones para
fmincon
y especificarlas utilizandooptimoptions
. Las opciones deben incluir la opciónAlgorithm
, establecida en'sqp'
o en'sqp-legacy'
.options = optimoptions('fmincon','Algorithm','sqp'); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
La generación de código es compatible con estas opciones:
Algorithm
: debe ser'sqp'
o'sqp-legacy'
ConstraintTolerance
FiniteDifferenceStepSize
FiniteDifferenceType
MaxFunctionEvaluations
MaxIterations
ObjectiveLimit
OptimalityTolerance
ScaleProblem
SpecifyConstraintGradient
SpecifyObjectiveGradient
StepTolerance
TypicalX
El código generado tiene verificación de errores limitada para opciones. La forma recomendada para actualizar una opción es utilizar
optimoptions
, no notación de puntos.opts = optimoptions('fmincon','Algorithm','sqp'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
No cargue opciones desde un archivo, ya que la generación de código podría fallar. En su lugar, cree opciones en el código.
Normalmente, si especifica una opción no compatible, dicha opción se ignora silenciosamente durante la generación de código. No obstante, si especifica una función de gráfica o una función de salida utilizando notación de puntos, la generación de código puede emitir un error. Para una mayor fiabilidad, especifique únicamente opciones compatibles.
Dado que las funciones de salida y las funciones de gráfica no son compatibles,
fmincon
no devuelve el indicador de salida –1.El código generado a partir de
fmincon
no contiene el campobestfeasible
en una estructuraoutput
devuelta.
Generar código no multiproceso
De forma predeterminada, el código generado para su uso fuera de el entorno de MATLAB utiliza bibliotecas de álgebra lineal que no son multiproceso. Por tanto, este código se puede ejecutar significativamente más despacio que el código del entorno de MATLAB.
Si su hardware de destino tiene procesadores de varios núcleos, puede lograr un rendimiento mejor utilizando las bibliotecas multiproceso LAPACK y BLAS personalizadas. Para incorporar estas bibliotecas al código generado, consulte Speed Up Linear Algebra in Generated Standalone Code by Using LAPACK Calls (MATLAB Coder).
Consulte también
fmincon
| codegen
(MATLAB Coder) | optimoptions
| optim.coder.infbound