代码生成fmincon
背景
什么是代码生成?
代码生成是MATLAB的转换®代码转换为C代码使用MATLAB编码器™.代码生成需要一个MATLAB编码器许可证。
通常,您使用代码生成在没有运行MATLAB的硬件上部署代码。例如,您可以使用fmincon
用于优化运动或计划。
有关示例,请参见为fmincon生成代码.有关其他优化求解器中的代码生成,请参见为fsolve生成代码,为quadprog生成代码,或生成lsqcurvefit或lsqnonlin的代码.
代码生成要求
fmincon
方法支持代码生成codegen
(MATLAB编码器)函数或MATLAB编码器你必须有一个MATLAB编码器生成代码的许可。目标硬件必须支持标准的双精度浮点计算。不能为单精度或定点计算生成代码。
代码生成目标不使用与MATLAB求解器相同的数学内核库。因此,代码生成解决方案可能与求解器解决方案不同,特别是对于条件较差的问题。
所有用于生成的代码必须为MATLAB代码。特别是,不能使用自定义黑盒函数作为目标函数
fmincon
.你可以使用coder.ceval
计算用C或c++编写的自定义函数。然而,自定义函数必须在MATLAB函数中调用。fmincon
不支持问题
用于代码生成的参数。[x,fval] = fmincon(问题)%不支持
必须使用函数句柄(而不是字符串或字符名)指定目标函数和任何非线性约束函数。
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon)%的支持%不支持:fmincon(‘有趣的’,…)或fmincon(“有趣”,…)
所有
fmincon
输入矩阵,例如一个
,Aeq
,磅
,乌兰巴托
一定要满,不能疏。方法可以将稀疏矩阵转换为完整矩阵完整的
函数。的
磅
而且乌兰巴托
参数的项数必须与x0
参数或必须为空[]
.如果您的目标硬件不支持无限边界,请使用
optim.coder.infbound
.对于涉及嵌入式处理器的高级代码优化,还需要一个嵌入式编码器®许可证。
您必须包含的选项
fmincon
并使用optimoptions
.选项必须包括算法
选项,设置为“sqp”
或“sqp-legacy”
.选项= optimoptions(“fmincon”,“算法”,“sqp”);[x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
代码生成支持以下选项:
算法
-肯定是“sqp”
或“sqp-legacy”
ConstraintTolerance
FiniteDifferenceStepSize
FiniteDifferenceType
MaxFunctionEvaluations
MaxIterations
ObjectiveLimit
OptimalityTolerance
ScaleProblem
SpecifyConstraintGradient
SpecifyObjectiveGradient
StepTolerance
TypicalX
生成的代码具有有限的选项错误检查。更新选项的推荐方法是使用
optimoptions
,不是点表示法。Opts = optimoptions(“fmincon”,“算法”,“sqp”);Opts = optimoptions(Opts,“MaxIterations”1 e4);%推荐选择。MaxIterations = 1e4;%不推荐
不要从文件中加载选项。这样做会导致代码生成失败。相反,在代码中创建选项。
通常,如果您指定了一个不受支持的选项,那么在代码生成期间,该选项将被无声地忽略。但是,如果使用点表示法指定绘图函数或输出函数,则代码生成可能会产生错误。为了可靠性,请只指定支持的选项。
由于不支持输出函数和绘图函数,
fmincon
不返回退出标志-1。生成的代码
fmincon
不包含bestfeasible
返回的字段输出
结构。
生成的代码不是多线程的
默认情况下,在MATLAB环境之外使用的生成代码使用非多线程的线性代数库。因此,此代码的运行速度比MATLAB环境中的代码慢得多。
如果您的目标硬件有多个核,您可以通过使用自定义多线程LAPACK和BLAS库来获得更好的性能。若要在生成的代码中合并这些库,请参见通过使用LAPACK调用加速生成的独立代码中的线性代数(MATLAB编码器).
另请参阅
fmincon
|codegen
(MATLAB编码器)|optimoptions
|optim.coder.infbound