主要内容

生成代码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];Lb = 0 (3,1);Ub =个位(大小(lb));Aeq = ones(1,3);Beq = 1/2;X0 = 0 (3,1);Opts = 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,fval] = test_quadp_mex .
X = 0 0.5000 0 fval = -1.2500

修改效率示例

遵循本主题中的一些建议实时应用程序的优化代码生成,将生成的代码配置为具有更少的检查并使用静态内存分配。

CFG = code .config(墨西哥人的);cfg。IntegrityChecks = false;cfg。饱和onintegeroverflow = 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];Lb = 0 (3,1);Ub =个位(大小(lb));Aeq = ones(1,3);Beq = 1/2;X0 = 0 (3,1);Opts = optimoptions(“quadprog”“算法”“激活集”...“OptimalityTolerance”1 e-5);[x, fval eflag、输出]= quadprog (H f [] [], Aeq,说真的,磅,乌兰巴托,x0,选择)

test_quadp2文件。

codegen配置cfgtest_quadp2

运行结果代码。

[x,fval,eflag,output] = test_quadp2_mex .使用实例
X = 0 0.5000 0 fval = -1.2500 eflag = 1 output = struct with fields: algorithm: 'active-set' firstorderopt: 8.8818e-16 constrviolation: 0 iterations: 3

更改最优性公差不会影响优化过程,因为“激活集”算法不会检查这个容差,直到它达到一个点,它停止。

创建第三个文件,将允许的迭代次数限制为2,以查看对优化过程的影响。

函数[x, fval exitflag,输出]= test_quadp3 H = [1 1 1 1 2 2 1, 2, 4];F = [2;-3;1];Lb = 0 (3,1);Ub =个位(大小(lb));Aeq = ones(1,3);Beq = 1/2;X0 = 0 (3,1);Opts = optimoptions(“quadprog”“算法”“激活集”“MaxIterations”2);[x, fval exitflag、输出]= quadprog (H f [] [], Aeq,说真的,磅,乌兰巴托,x0,选择)

要查看这些设置对求解器的影响,请运行test_quadp3在MATLAB中无需生成代码。

[x,fval,exitflag,output] = test_quadp3 .使用实例
求解器过早地停止了。Quadprog停止是因为它超过了迭代限制,选项。MaxIterations = 2.000000e+00。x = -0.0000 0.5000 0 fval = -1.2500 exitflag = 0 output = struct with fields: algorithm: 'active-set' iterations: 2 constrviolation: 1.6441e-18 firstorderopt: 2 message: '(求解器过早停止。)(() quadprog停止,因为它超过了迭代限制,()选项。MaxIterations = 2.000000e+00。(() '线性求解器:[]cgiterations: []

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

另请参阅

|(MATLAB编码器)|

相关的话题