最適化のためのコ,ド生成の基本
fmincon
のコ,ド生成
この例では,最適化ソルバfmincon
のコ,ドを生成する方法を示します。コ,ド生成には,MATLAB®编码器™ラ@ @センスが必要です。コド生成の要件の詳細にいては,Fminconでのコ,ド生成の背景を参照してください。
この例では,以下の単純な目的関数を使用します。この目的関数を自分のテストで使用する場合は,このコ,ドをrosenbrockwithgrad.m
という名前のファ▪▪ルにコピ▪▪します。このファaapl . exeルはmatlabパスに保存します。
函数[f,g] = rosenbrockwithgrad(x)计算目标fF = 100*(x(2) - x(1)²)²+ (1 - x(1))²;如果Nargout > 1所需梯度百分比G = [-400*(x(2) - x(1)^2)*x(1) - 2*(1 - x(1));200*(x(2) - x(1)^2)];结束
目的関数rosenbrockwithgrad
を使用してコ,ドを生成する場合は,このコ,ドを含むtest_rosen.m
という名前のファ@ @ルを作成します。
函数[x,fval] = test_rosen opts = optimoptions(“fmincon”,“算法”,“sqp”);[x fval] = fmincon (@rosenbrockwithgrad [1,1 ],[],[],[],[],[- 3, 3, 3, 3,[],选择)
test_rosen
ファ▪▪ルのコ▪▪ドを生成します。
codegen配置:墨西哥人test_rosen
しばらくすると,codegen
によってtest_rosen_mex.mexw64
という名前のmexファaapl .ルが生成されます(ファaapl .ル拡張子はシステムによって異なります)。test_rosen_mex
と入力すると,得られたcコ,ドを実行できます。以下のとおりの結果または似た結果になります。
X = 1.0000 1.0000 fval = 1.3346e- 11ans = 1.0000 1.0000
効率を高める変更例
リアルタムアプリケションの最適化コド生成のいくつかのヒントに従って,行われるチェックを減らし,静的なメモリ割り当てを使用するよう,生成コードの構成を設定します。
CFG = code .config(墨西哥人的);cfg。IntegrityChecks = false;cfg。饱和onintegeroverflow = false;cfg。DynamicMemoryAllocation =“关闭”;
問題の範囲を(3、3)
から(2, 2)
に狭めます。また,最適性の許容誤差を既定の1 e-6
よりも緩くします。
函数[x,fval] = test_rosen2 opts = optimoptions(“fmincon”,“算法”,“sqp”,...“OptimalityTolerance”1 e-5);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[],选择)
test_rosen2
ファ▪▪ルのコ▪▪ドを生成します。
codegen配置cfgtest_rosen2
得られたコ,ドを実行します。
test_rosen2_mex
x = 1.0000 1.0000 fval = 2.0057e-11 eflag = 2 output = struct with fields: iterations: 40 funcCount: 155 algorithm: 'sqp' constrviolation: 0 stepsize: 5.9344e-08 lssteplth: 1 ans = 1.0000 1.0000
この解は先ほどの解と同程度の精度であり,fval
の出力が先ほどは1 e-11
だったのに対し,約2 e-11
になっています。
許容反復回数を先ほどの計算の半分に制限してみましょう。
函数[x,fval] = test_rosen3 options = optimoptions(“fmincon”,“算法”,“sqp”,...“MaxIterations”, 20);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[]选项)
MATLABでtest_rosen3
を実行します。
test_rosen3
x = 0.2852 0.0716 fval = 0.5204 eflag = 0 output = struct with fields: iterations: 20 funcCount: 91 algorithm: 'sqp' message: '(解算器过早停止。)(() fmincon停止,因为它超过了迭代限制,()选项。MaxIterations = 2.000000e+01。(() ' constrviolation: 0 stepsize: 0.0225 lssteplth: 1 firstorderopt: 1.9504 ans = 0.2852 0.0716
このように反復回数を大幅に制限したことで,fmincon
は適切な解が得られていません。精度と速度のトレ,ドオフは扱いが難しい場合があります。
関数評価の回数を抑えて精度の向上を図るには,この例の組み込み導関数を,SpecifyObjectiveGradient
オプションを真正的
に設定して使用します。
函数[x,fval] = test_rosen4 options = optimoptions(“fmincon”,“算法”,“sqp”,...“SpecifyObjectiveGradient”,真正的);[x fval eflag输出]= fmincon (@rosenbrockwithgrad, [1,1 ],[],[],[],[],...(2, 2),(2, 2)[]选项)
test_rosen2
と同じ構成を使用して,test_rosen4
のコ,ドを生成します。
codegen配置cfgtest_rosen4
得られたコ,ドを実行します。
test_rosen4_mex
x = 1.0000 1.0000 fval = 3.3610e-20 eflag = 2 output = struct with fields: iterations: 40 funcCount: 113 algorithm: 'sqp' constrviolation: 0 stepsize: 9.6356e-08 lssteplth: 1 ans = 1.0000 1.0000
test_rosen2
と比べると,反復回数は同じく40ですが,関数評価回数は155
から113
に減っています。結果として,目的関数の値が2 e-11
から3 e-20
とより良く(小さく)なっています。
参考
fmincon
|codegen
(MATLAB编码器)|optimoptions