生成的代码quadprog
第一步quadprog
代码生成
这个例子展示了如何生成代码quadprog
优化求解。代码生成需要MATLAB®编码器™许可证。代码生成的细节要求,看到代码生成quadprog背景。
问题是尽量减少二次表达式
在哪里
和
受约束 , 。
创建一个文件命名test_quadp.m
包含以下代码。
函数[x, fval] = test_quadp H = [1 1 1 1 2 2 1, 2, 4];f = [2、3、1];磅= 0 (3,1);乌兰巴托= 1(大小(磅));Aeq = 1 (1、3);说真的= 1/2;x0 = 0 (3,1);选择= optimoptions (“quadprog”,“算法”,“激活集”);[x, fval] = quadprog (H f [] [], Aeq,说真的,磅,乌兰巴托,x0,选择)
生成的代码test_quadp
文件。
codegen配置:墨西哥人test_quadp
过了一段时间,codegen
创建一个墨西哥人文件命名test_quadp_mex.mexw64
(文件扩展名不同,取决于您的系统)。运行生成的C代码。
[x, fval] = test_quadp_mex
0.5000 x = 0 0 fval = -1.2500
修改示例效率
下面的一些建议优化代码生成实时应用程序、配置生成的代码检查和较少使用静态内存分配。
cfg = coder.config (墨西哥人的);cfg。IntegrityChecks = false;cfg。SaturateOnIntegerOverflow = false;cfg。DynamicMemoryAllocation =“关闭”;
创建一个文件命名test_quadp2.m
包含以下代码。这段代码设置一个宽松的最优比默认的公差1 e-8
。
函数[x, fval eflag,输出]= test_quadp2 H = [1 1 1 1 2 2 1, 2, 4];f = [2、3、1];磅= 0 (3,1);乌兰巴托= 1(大小(磅));Aeq = 1 (1、3);说真的= 1/2;x0 = 0 (3,1);选择= optimoptions (“quadprog”,“算法”,“激活集”,…“OptimalityTolerance”1 e-5);[x, fval eflag、输出]= quadprog (H f [] [], Aeq,说真的,磅,乌兰巴托,x0,选择)
生成的代码test_quadp2
文件。
codegen配置cfgtest_quadp2
运行生成的代码。
[x, fval eflag,输出]= test_quadp2_mex
0.5000 x = 0 0 fval = -1.2500 eflag = 1输出=结构体字段:算法:“激活集”firstorderopt: 8.8818 e-16 constrviolation: 0迭代:3
改变最优公差不影响优化过程,因为“激活集”
算法不检查这个公差,直到它达到某一程度时,停止。
创建第三个文件,限制允许迭代2的数量对优化过程的影响。
函数[x, fval exitflag,输出]= test_quadp3 H = [1 1 1 1 2 2 1, 2, 4];f = [2、3、1];磅= 0 (3,1);乌兰巴托= 1(大小(磅));Aeq = 1 (1、3);说真的= 1/2;x0 = 0 (3,1);选择= optimoptions (“quadprog”,“算法”,“激活集”,“MaxIterations”2);[x, fval exitflag、输出]= quadprog (H f [] [], Aeq,说真的,磅,乌兰巴托,x0,选择)
看到这些设置在解算器的影响,运行test_quadp3
在MATLAB生成代码。
[x, fval exitflag,输出]= test_quadp3
解算器过早地停止。quadprog停止,因为它超过了极限迭代,选择。MaxIterations = 2.000000 e + 00。x = -0.0000 - 0.5000 0 fval = -1.2500 exitflag = 0 =输出结构体字段:算法:有效集的迭代:2 constrviolation: 1.6441 e-18 firstorderopt: 2消息:“↵解决过早地停止。↵↵quadprog停止,因为它超过了迭代极限,↵选项。MaxIterations = 2.000000 e + 00。↵↵linearsolver: [] cgiterations: []
在这种情况下,解算器达到解决方案步骤比默认的少。通常,然而,限制不允许迭代解算器的数量达到一个正确的解决方案。
另请参阅
quadprog
|codegen
(MATLAB编码器)|optimoptions