主要内容

代码生成优化的基础知识

生成的代码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_rosen240岁,迭代的数量是相同的,但是功能评估的数量较低113年而不是155年。结果有更好的(低)的目标函数值3 e-20相比2 e-11

另请参阅

|(MATLAB编码器)|

相关的话题