メインコンテンツ

linprog のコード生成

この例では、最適化ソルバー linprog のコードを生成する方法を示します。コード生成には MATLAB Coder™ のライセンスが必要です。コード生成の要件の詳細については、linprog 用のコード生成の背景を参照してください。

問題

問題は、次の線形不等式制約行列 A および b と線形等式制約行列 Aeq および beq を含む 2 次元線形計画法を解くことです。

A = [1 1
    1 1/4
    1 -1
    -1/4 -1
    -1 -1
    -1 1];
b = [2 1 2 1 -1 2]; 
Aeq = [1 1/4];
beq = 1/2;

次の範囲を設定します。

-1x(1)1.5-0.5x(2)1.25.

lb = [-1,-0.5];
ub = [1.5,1.25];

目的関数 -x(1)-x(2)/3 を使用します。

f = [-1 -1/3];

コード生成の設定

問題と制約を作成するコードを含む test_linprog.m という名前のファイルを作成します。このファイルで、"interior-point" アルゴリズムを使用するためのオプションを設定する必要があります。

function [x,fval,exitflag,output] = test_linprog
A = [1 1
    1 1/4
    1 -1
    -1/4 -1
    -1 -1
    -1 1];
b = [2 1 2 1 -1 2];
Aeq = [1 1/4];
beq = 1/2;
f = [-1 -1/3];
lb = [-1,-0.5];
ub = [1.5,1.25];
opts = optimoptions("linprog",Algorithm="interior-point");
[x,fval,exitflag,output] = linprog(f,A,b,Aeq,beq,lb,ub,opts);
end

test_linprog ファイルのコードを生成します。

codegen -config:mex test_linprog
Code generation successful.

しばらくすると、codegen によって test_linprog_mex.mexw64 という名前の MEX ファイルが生成されます (ファイル拡張子はシステムによって異なります)。得られた C コードを実行します。

[x,fval,exitflag,output] = test_linprog_mex
x = 2×1

    0.1875
    1.2500

fval = 
-0.6042
exitflag = 
1
output = struct with fields:
          algorithm: 'interior-point'
    constrviolation: 3.5682e-07
      firstorderopt: 3.6989e-06
         iterations: 4

終了フラグ 1 は、信頼できる解がコードによって作成されたことを示します。コードはわずか 4 回の反復で解に到達しましたが、こうした小規模な問題では当然のことです。

参考

| (MATLAB Coder) |

トピック