メインコンテンツ

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

生成されたコードは、表示精度に対する同じ解を返します。

参考

| | (MATLAB Coder)

トピック