主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

coneprog 生成代码

此示例展示了如何为 coneprog 优化求解器生成 C 代码。代码生成需要 MATLAB® Coder™ 许可证。有关代码生成要求的详细信息,请参阅 coneprog 背景下的代码生成

锥体编程问题与 MATLAB 的解

为该问题指定三个二阶锥约束。

A = diag([1,2,0]);
b = zeros(3,1);
d = [0;0;1];
gamma = -1;
socConstraints(3) = secondordercone(A,b,d,gamma);

A = diag([3,0,1]);
d = [0;1;0];
socConstraints(2) = secondordercone(A,b,d,gamma);

A = diag([0;1/2;1/2]);
d = [1;0;0];
socConstraints(1) = secondordercone(A,b,d,gamma);

创建线性目标函数向量。

f = [-1;-2;-4];

使用 coneprog 函数求解该问题。

[x,fval] = coneprog(f,socConstraints)
Optimal solution found.
x = 3×1

    0.4238
    1.6477
    2.3225

fval = 
-13.0089

生成锥体编程问题代码

为了使用代码生成解决相同的问题,请创建一个接受 f 作为参量的函数,否则使用相同的锥约束。对于代码生成,您必须在元胞数组中传递多个锥约束,而不是作为锥约束对象的向量传递。在 MATLAB 路径下,创建一个名为 solvecone.m 的函数文件,其中包含以下代码。

function [xsol,fnval] = solvecone(f)

A = diag([1,2,0]);
b = zeros(3,1);
d = [0;0;1];
gamma = -1;
socConstraint1 = secondordercone(A,b,d,gamma);

A = diag([3,0,1]);
d = [0;1;0];
socConstraint2 = secondordercone(A,b,d,gamma);

A = diag([0;1/2;1/2]);
d = [1;0;0];
socConstraint3 = secondordercone(A,b,d,gamma);

socConstraints = {socConstraint1,socConstraint2,socConstraint3};
[xsol,fnval] = coneprog(f,socConstraints);
end

调用 codegen 生成 C 代码。codegen 创建一个名为 codegensolvecone_mex 文件。

codegen -config:mex -args {f} solvecone
Code generation successful.

使用与之前相同的 f 向量运行生成的代码。

[xsol,fnval] = solvecone_mex(f)
xsol = 3×1

    0.4238
    1.6477
    2.3225

fnval = 
-13.0089

生成的代码返回相同的解以显示精度。

另请参阅

| | (MATLAB Coder)

主题