为 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 创建一个名为 codegen
solvecone_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
生成的代码返回相同的解以显示精度。
另请参阅
coneprog
| secondordercone
| codegen
(MATLAB Coder)