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
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: []
在这种情况下,求解器比默认的步骤更少。但是,通常限制迭代次数并不允许求解器得到正确的解决方案。
optimoptions
|quadprog
|codegen
(MATLAB编码器)