主要内容

生成的代码quadprog

第一步quadprog代码生成

这个例子展示了如何生成代码quadprog优化求解。代码生成需要MATLAB®编码器™许可证。代码生成的细节要求,看到代码生成quadprog背景

问题是尽量减少二次表达式

1 2 x T H x + f T x

在哪里

H = ( 1 1 1 1 2 2 1 2 4 ]

f = ( 2 3 1 ]

受约束 0 x 1 , x = 1 / 2

创建一个文件命名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: []

在这种情况下,解算器达到解决方案步骤比默认的少。通常,然而,限制不允许迭代解算器的数量达到一个正确的解决方案。

另请参阅

|(MATLAB编码器)|

相关的话题