优化基础代码生成
生成代码fmincon
方法生成代码fmincon
优化求解。代码生成需要一个MATLAB®编码器™许可证。有关代码生成要求的详细信息,请参见在fmincon后台生成代码.
该示例使用以下简单的目标函数。要在您自己的测试中使用此目标函数,请将代码复制到一个名为rosenbrockwithgrad.m
.将文件保存在MATLAB路径上。
函数[f,g] = rosenbrockwithgrad(x)计算目标fF = 100*(x(2) - x(1)²)²+ (1 - x(1))²;如果Nargout > 1所需梯度百分比G = [-400*(x(2) - x(1)^2)*x(1) - 2*(1 - x(1));200*(x(2) - x(1)^2)];结束
方法生成代码rosenbrockwithgrad
目标函数,创建一个名为test_rosen.m
包含以下代码:
函数[x,fval] = test_rosen opts = optimoptions(“fmincon”,“算法”,“sqp”);[x fval] = fmincon (@rosenbrockwithgrad [1,1 ],[],[],[],[],[- 3, 3, 3, 3,[],选择)
为test_rosen
文件。
codegen配置:墨西哥人test_rosen
过了一段时间,codegen
创建一个名为test_rosen_mex.mexw64
(文件扩展名会有所不同,这取决于你的系统)。您可以通过输入运行生成的C代码test_rosen_mex
.结果如下或类似:
X = 1.0000 1.0000 fval = 1.3346e- 11ans = 1.0000 1.0000
修改效率示例
下面的一些建议实时应用程序的优化代码生成,将生成代码的配置设置为具有更少的检查,并使用静态内存分配。
CFG = code .config(墨西哥人的);cfg。IntegrityChecks = false;cfg。饱和onintegeroverflow = false;cfg。DynamicMemoryAllocation =“关闭”;
把问题的范围从(3、3)
来(2, 2)
.另外,设置一个比默认值更宽松的优化容错1 e-6
.
函数[x,fval] = test_rosen2 opts = optimoptions(“fmincon”,“算法”,“sqp”,...“OptimalityTolerance”1 e-5);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[],选择)
为test_rosen2
文件。
codegen配置cfgtest_rosen2
运行结果代码。
test_rosen2_mex
x = 1.0000 1.0000 fval = 2.0057e-11 eflag = 2 output = struct with fields: iterations: 40 funcCount: 155 algorithm: 'sqp' constrviolation: 0 stepsize: 5.9344e-08 lssteplth: 1 ans = 1.0000 1.0000
这个解决方案几乎和以前的解决方案一样好,使用fval
输出在2 e-11
与之前相比1 e-11
.
尝试将允许的迭代次数限制为前一个计算中的一半。
函数[x,fval] = test_rosen3 options = optimoptions(“fmincon”,“算法”,“sqp”,...“MaxIterations”, 20);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[]选项)
运行test_rosen3
在MATLAB。
test_rosen3
x = 0.2852 0.0716 fval = 0.5204 eflag = 0 output = struct with fields: iterations: 20 funcCount: 91 algorithm: 'sqp' message: '(解算器过早停止。)(() fmincon停止,因为它超过了迭代限制,()选项。MaxIterations = 2.000000e+01。(() ' constrviolation: 0 stepsize: 0.0225 lssteplth: 1 firstorderopt: 1.9504 ans = 0.2852 0.0716
在这个严格的迭代限制下,fmincon
没有达成一个好的解决方案。准确和速度之间的权衡很难处理。
为保存函数求值并可能提高精度,请使用示例的内置导数SpecifyObjectiveGradient
选项真正的
.
函数[x,fval] = test_rosen4 options = optimoptions(“fmincon”,“算法”,“sqp”,...“SpecifyObjectiveGradient”,真正的);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[]选项)
为test_rosen4
使用与中的相同的配置test_rosen2
.
codegen配置cfgtest_rosen4
运行结果代码。
test_rosen4_mex
x = 1.0000 1.0000 fval = 3.3610e-20 eflag = 2 output = struct with fields: iterations: 40 funcCount: 113 algorithm: 'sqp' constrviolation: 0 stepsize: 9.6356e-08 lssteplth: 1 ans = 1.0000 1.0000
相比test_rosen2
时迭代次数相同,为40,但函数求值的次数较低113
而不是155
.结果具有较好的(较低的)目标函数值3 e-20
相比2 e-11
.
另请参阅
fmincon
|codegen
(MATLAB编码器)|optimoptions