fmincon
でのコード生成の背景
コード生成とは
コード生成とは、MATLAB® Coder™ を使用した、MATLAB コードから C コードへの変換です。コード生成には、MATLABCoder ライセンスが必要です。
コード生成は通常、MATLAB を実行していないハードウェアにコードを展開するために使用します。たとえば、動きや計画を最適化するために fmincon
を使用して、ロボットにコードを展開できます。
例については、fmincon のコード生成を参照してください。他の最適化ソルバーでのコード生成については、fsolve のコード生成、quadprog のコード生成、またはlsqcurvefit または lsqnonlin の用のコード生成を参照してください。
コード生成の要件
fmincon
は、関数codegen
(MATLAB Coder) または MATLAB Coder アプリを使用したコード生成をサポートしています。コードを生成するには MATLAB Coder ライセンスが必要です。ターゲット ハードウェアは、標準的な倍精度浮動小数点計算または標準的な単精度浮動小数点計算をサポートしていなければなりません。
コード生成ターゲットは、MATLAB ソルバーと同じ数学カーネル ライブラリを使用しません。そのため、コード生成解法は、特に、条件付けが不十分な問題の場合に、ソルバー解法と異なる可能性があります。
生成用のコードはすべて、MATLAB コードでなければなりません。特に、カスタム ブラックボックス関数を
fmincon
の目的関数として使用することはできません。coder.ceval
を使用して、C または C++ でコード化されたカスタム関数を評価することはできます。ただし、そのカスタム関数は MATLAB 関数内で呼び出さなければなりません。コード生成の場合、
fmincon
はproblem
引数をサポートしていません。[x,fval] = fmincon(problem) % Not supported
string や文字名ではなく、関数ハンドルを使用して、目的関数と非線形制約関数を指定しなければなりません。
x = fmincon(@fun,x0,A,b,Aeq,beq,lb,ub,@nonlcon) % Supported % Not supported: fmincon('fun',...) or fmincon("fun",...)
fmincon
の入力行列 (A
、Aeq
、lb
、ub
など) はすべてフル (非スパース) でなければなりません。関数full
を使用することで、スパース行列を非スパースに変換できます。lb
引数とub
引数は、x0
引数と同じ数のエントリを持つか、空の[]
でなければなりません。ターゲット ハードウェアが無限境界をサポートしていない場合は、
optim.coder.infbound
を使用します。組み込みプロセッサを使用する高度なコード最適化には、Embedded Coder® ライセンスも必要です。
fmincon
のオプションを含め、関数optimoptions
を使用して指定しなければなりません。オプションにはAlgorithm
オプションを含め、'sqp'
または'sqp-legacy'
に設定しなければなりません。options = optimoptions('fmincon','Algorithm','sqp'); [x,fval,exitflag] = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options);
コード生成では次のオプションをサポートしています。
Algorithm
—'sqp'
または'sqp-legacy'
でなければなりませんConstraintTolerance
FiniteDifferenceStepSize
FiniteDifferenceType
MaxFunctionEvaluations
MaxIterations
ObjectiveLimit
OptimalityTolerance
ScaleProblem
SpecifyConstraintGradient
SpecifyObjectiveGradient
StepTolerance
TypicalX
生成コードでは、オプションに対して限られたエラー チェックしか行われません。オプションの更新方法として、ドット表記ではなく、
optimoptions
を使用することを推奨します。opts = optimoptions('fmincon','Algorithm','sqp'); opts = optimoptions(opts,'MaxIterations',1e4); % Recommended opts.MaxIterations = 1e4; % Not recommended
オプションはファイルから読み込まないでください。そうした場合、コード生成に失敗することがあります。代わりに、コード内でオプションを作成してください。
通常、サポートされていないオプションを指定すると、コード生成の際にそのオプションは暗黙的に無視されます。ただし、ドット表記を使用してプロット関数や出力関数を指定すると、コード生成でエラーが発生することがあります。信頼性を確保するために、サポートされているオプションのみを指定してください。
出力関数とプロット関数はサポートされていないため、
fmincon
は終了フラグ –1 を返しません。fmincon
から生成されたコードでは、返されたoutput
構造体内にbestfeasible
フィールドがありません。
単精度コード生成
単精度浮動小数点ハードウェア用のコードを生成するには、次のガイドラインに従います。
fmincon
呼び出しのすべてのパラメーターを必ず単精度の値にします。これには、空の値や無限値もすべて含まれます。たとえば、3 次元の問題の範囲がlb = [0,-Inf,0]
とub = [1,100,Inf]
である場合、パラメーターを次のように設定します。lb = [single(0),-optim.coder.infbound("single"),single(0)]; ub = [single([1,100]),optim.coder.infbound("single")];
fmincon
に渡されるすべての空の引数を必ず単精度にします。たとえば、Aeq = single([]); % Or single.empty beq = single([]); % Or single.empty
すべての非線形関数 (目的関数と制約関数) で必ず single 型の値を返します。たとえば、
function f = objfun(x) % Must be able to accept x as single. % Computations must also produce a single or be cast expx = x.^2 + exp(x); % Produces a single f = cast(foo(expx),'like',x); % foo is unknown, so cast to single end function [c,ceq] = nonlcon(x) ceq = single.empty; c = exp(-exp(-x)) - single(1/2); % Produces a single end
非マルチスレッドな生成コード
既定では、MATLAB 環境外で使用するために生成されたコードは、非マルチスレッドな線形代数ライブラリを使用します。したがって、このコードの実行速度は、MATLAB 環境のコードよりも著しく低速になる可能性があります。
ターゲット ハードウェアに複数のコアが搭載されている場合、カスタム マルチスレッド LAPACK および BLAS ライブラリを使用することにより、パフォーマンスの向上が期待できます。これらのライブラリを生成コードに組み込むには、生成されたスタンドアロン コードでの LAPACK 呼び出しを使用した線形代数の高速化 (MATLAB Coder)を参照してください。
参考
fmincon
| codegen
(MATLAB Coder) | optimoptions
| optim.coder.infbound