主要内容

生成的代码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
X = 0 0.5000 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
X = 0 0.5000 0 fval = -1.2500 eflag = 1 output = struct with fields: algorithm: 'active-set' firstderopt: 8.8818e-16 construe: 0 iterations: 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 output = struct with fields: algorithm: 'active-set' iterations: 2 construct: 1.6441e-18 firstderopt: 2 message: '↵Solver stopped过早。↵↵quadprog停止是因为它超过了迭代限制,↵选项。MaxIterations = 2.000000 e + 00。↵↵' linearsolver: [] cgiterations: []

在这种情况下,求解器比默认的步骤更少。但是,通常限制迭代次数并不允许求解器得到正确的解决方案。

另请参阅

||(MATLAB编码器)

相关的话题