coneprog
のコード生成
この例では、最適化ソルバー coneprog
の C コードを生成する方法を示します。コード生成には MATLAB® Coder™ のライセンスが必要です。コード生成の要件の詳細については、coneprog 用のコード生成の背景を参照してください。
錐計画問題と MATLAB の解
問題の 2 次錐制約を 3 つ指定します。
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
を引数として受け入れ、それ以外の場合は同じ錐制約を使用する関数を作成します。コードを生成するには、複数の錐制約を、錐制約オブジェクトのベクトルとしてではなく cell 配列で渡す必要があります。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
は、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)