代码生成优化的基础知识
生成的代码fmincon
这个例子展示了如何生成代码fmincon
优化求解。代码生成需要MATLAB®编码器™许可证。代码生成需求的细节,请参阅在背景fmincon代码生成。
示例使用以下简单的目标函数。使用这个目标函数在您自己的测试,将代码复制到一个文件命名rosenbrockwithgrad.m
。保存文件在你的MATLAB的道路。
函数(f, g) = rosenbrockwithgrad (x)% f计算目标f = 100 * (x (2) - (1) ^ 2) ^ 2 + (1 - x (1)) ^ 2;如果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选择= optimoptions (“fmincon”,“算法”,“sqp”);[x fval] = fmincon (@rosenbrockwithgrad[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.3346 e-11 ans = 1.0000 - 1.0000
修改示例效率
以下的一些建议优化代码生成实时应用程序,设置的配置生成的代码检查和较少使用静态内存分配。
cfg = coder.config (墨西哥人的);cfg。IntegrityChecks = false;cfg。SaturateOnIntegerOverflow = false;cfg。DynamicMemoryAllocation =“关闭”;
收紧的界限问题(3、3)
来(2,2)
。同时,设置一个宽松的最优比默认的公差1 e-6
。
函数[x, fval] = test_rosen2选择= optimoptions (“fmincon”,“算法”,“sqp”,…“OptimalityTolerance”1 e-5);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1], [], [], [], [],…(2,2),(2,2)[],选择)
生成的代码test_rosen2
文件。
codegen配置cfgtest_rosen2
运行生成的代码。
test_rosen2_mex
x = 1.0000 - 1.0000 fval = 2.0057 e-11 eflag = 2输出=结构体字段:迭代:40 funcCount: 155算法:“sqp”constrviolation: 0 stepsize: 5.9344 e-08 lssteplength: 1 ans = 1.0000 - 1.0000
这个解决方案是几乎一样好前面的解决方案,与fval
输出在2 e-11
比前一1 e-11
。
尝试限制允许迭代的数量一半的在前面的计算。
函数[x, fval] = = optimoptions (test_rosen3选项“fmincon”,“算法”,“sqp”,…“MaxIterations”,20);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1], [], [], [], [],…(2,2),(2,2)[]选项)
运行test_rosen3
在MATLAB。
test_rosen3
x = 0.2852 - 0.0716 fval = 0.5204 eflag = 0 =输出结构体字段:迭代:20 funcCount: 91算法:“sqp”的信息:“↵解决过早地停止。↵↵fmincon停止,因为它超过了迭代极限,↵选项。MaxIterations = 2.000000 e + 01。↵↵constrviolation: 0 stepsize: 0.0225 lssteplength: 1 firstorderopt: 1.9504 ans = 0.2852 - 0.0716
这严重迭代极限,fmincon
没有达到一个很好的解决方案。精度和速度之间的权衡很难管理。
保存功能评估和可能增加精度,使用内置的衍生品通过设置的例子SpecifyObjectiveGradient
选项真正的
。
函数[x, fval] = = optimoptions (test_rosen4选项“fmincon”,“算法”,“sqp”,…“SpecifyObjectiveGradient”,真正的);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1], [], [], [], [],…(2,2),(2,2)[]选项)
生成的代码test_rosen4
使用相同的配置test_rosen2
。
codegen配置cfgtest_rosen4
运行生成的代码。
test_rosen4_mex
x = 1.0000 - 1.0000 fval = 3.3610 e-20 eflag = 2输出=结构体字段:迭代:40 funcCount: 113算法:“sqp”constrviolation: 0 stepsize: 9.6356 e-08 lssteplength: 1 ans = 1.0000 - 1.0000
相比test_rosen2
40岁,迭代的数量是相同的,但是功能评估的数量较低113年
而不是155年
。结果有更好的(低)的目标函数值3 e-20
相比2 e-11
。
另请参阅
fmincon
|codegen
(MATLAB编码器)|optimoptions