Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

fcn2optimexpr

関数から最適化式への変換

説明

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK) は、関数 fcn(in1,in2,...,inK)N 個の出力がある最適化式に変換します。

[out1,out2,...,outN] = fcn2optimexpr(fcn,in1,in2,...,inK,Name,Value) は、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば、OutputSize を渡すことにより、関数評価を省略できます。

すべて折りたたむ

サポートされている関数で構成されていない問題ベースのアプローチで MATLAB™ 関数を使用するには、まず、関数を最適化式に変換します。詳細は、最適化変数および式でサポートされる演算非線形関数から最適化式への変換を参照してください。

目的関数 gamma (数学関数 Γ(x)、階乗関数の拡張) を使用し、最適化変数 x を作成して、変換された無名関数で使用するには、次のようにします。

x = optimvar('x');
obj = fcn2optimexpr(@gamma,x);
prob = optimproblem('Objective',obj);
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       gamma(x)

得られた問題を解くには、初期点構造体を与え、solve を呼び出します。

x0.x = 1/2;
sol =  solve(prob,x0)
Solving problem using fminunc.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
sol = struct with fields:
    x: 1.4616

さらに複雑な関数の場合、関数ファイルを変換します。関数ファイル gammabrock.m は、2 つの最適化変数の目的関数を計算します。

type gammabrock
function f = gammabrock(x,y)
f = (10*(y - gamma(x)))^2 + (1 - x)^2;

この目的関数を問題に含めます。

x = optimvar('x','LowerBound',0);
y = optimvar('y');
obj = fcn2optimexpr(@gammabrock,x,y);
prob = optimproblem('Objective',obj);
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :
       gammabrock(x, y)


	variable bounds:
       0 <= x

関数 gammabrock は二乗和です。この関数を最適化式の陽的な二乗和として表現すれば、より効率的に問題を定式化できます。

f = fcn2optimexpr(@(x,y)y - gamma(x),x,y);
obj2 = (10*f)^2 + (1-x)^2;
prob2 = optimproblem('Objective',obj2);

効率性の違いを確認するには、probprob2, を解き、反復回数の違いを検証します。

x0.x = 1/2;
x0.y = 1/2;
[sol,fval,~,output] = solve(prob,x0);
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.
[sol2,fval2,~,output2] = solve(prob2,x0);
Solving problem using lsqnonlin.

Local minimum found.

Optimization completed because the size of the gradient is less than
the value of the optimality tolerance.
fprintf('prob took %d iterations, but prob2 took %d iterations\n',output.iterations,output2.iterations)
prob took 21 iterations, but prob2 took 2 iterations

関数に複数の出力がある場合、これらの出力を目的関数の要素として使用できます。この場合、u は 2 行 2 列の変数、v は 2 行 1 列の変数であり、expfn3 は 3 つの出力をもちます。

type expfn3
function [f,g,mineval] = expfn3(u,v)
mineval = min(eig(u));
f = v'*u*v;
f = -exp(-f);
t = u*v;
g = t'*t + sum(t) - 3;

適切なサイズの最適化変数を作成し、最初の 2 つの出力から目的関数を作成します。

u = optimvar('u',2,2);
v = optimvar('v',2);
[f,g,mineval] = fcn2optimexpr(@expfn3,u,v);
prob = optimproblem;
prob.Objective = f*g/(1 + f^2);
show(prob)
  OptimizationProblem : 

	Solve for:
       u, v

	minimize :
       ((arg2 .* arg3) ./ (1 + arg1.^2))

       where:

         [arg1,~,~] = expfn3(u, v);
         [arg2,~,~] = expfn3(u, v);
         [~,arg3,~] = expfn3(u, v);

後続の制約式では出力 mineval を使用できます。

問題ベースの最適化では、制約は、間に比較演算子 (==<=、または >=) がある 2 つの最適化式です。fcn2optimexpr を使用していずれかまたは両方の最適化式を作成できます。詳細は、非線形関数から最適化式への変換を参照してください。

gammafn2 が –1/2 以下であるという非線形制約を作成します。この 2 変数の関数は gammafn2.m ファイルにあります。

type gammafn2
function f = gammafn2(x,y)
f = -gamma(x)*(y/(1+y^2));

最適化変数を作成し、関数ファイルを最適化式に変換して、制約を confn として表します。

x = optimvar('x','LowerBound',0);
y = optimvar('y','LowerBound',0);
expr1 = fcn2optimexpr(@gammafn2,x,y);
confn = expr1 <= -1/2;
show(confn)
  gammafn2(x, y) <= -0.5

gammafn2x + y 以上になるという別の制約を作成します。

confn2 = expr1 >= x + y;

最適化問題を作成し、制約を問題に配置します。

prob = optimproblem;
prob.Constraints.confn = confn;
prob.Constraints.confn2 = confn2;
show(prob)
  OptimizationProblem : 

	Solve for:
       x, y

	minimize :

	subject to confn:
       gammafn2(x, y) <= -0.5

	subject to confn2:
       gammafn2(x, y) >= (x + y)

	variable bounds:
       0 <= x

       0 <= y

目的関数および非線形制約を計算するのに、時間がかかる共通の関数が問題に含まれる場合、名前/値のペアの引数 'ReuseEvaluation' を使用することにより、時間を短縮できます。関数 rosenbrocknorm は、Rosenbrock 目的関数と、制約 x24 に使用する引数のノルム値の両方を計算します。

type rosenbrocknorm
function [f,c] = rosenbrocknorm(x)
pause(1) % Simulates time-consuming function
c = dot(x,x);
f = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;

2 次元最適化変数 x を作成します。その後、'ReuseEvaluation' を指定して fcn2optimexpr を使用することによって、rosenbrocknorm を最適化式に変換します。

x = optimvar('x',2);
[f,c] = fcn2optimexpr(@rosenbrocknorm,x,'ReuseEvaluation',true);

返された式から目的関数と制約式を作成します。目的関数と制約式を最適化問題に含めます。show を使用して問題を確認します。

prob = optimproblem('Objective',f);
prob.Constraints.cineq = c <= 4;
show(prob)
  OptimizationProblem : 

	Solve for:
       x

	minimize :
       [argout,~] = rosenbrocknorm(x)


	subject to cineq:
       arg_LHS <= 4

       where:

         [~,arg_LHS] = rosenbrocknorm(x);
     

初期点 x0.x = [-1;1] から始めて、結果が出るまでにかかる時間を測定しながら、問題を解きます。

x0.x = [-1;1];
tic
[sol,fval,exitflag,output] = solve(prob,x0)
Solving problem using fmincon.

Local minimum found that satisfies the constraints.

Optimization completed because the objective function is non-decreasing in 
feasible directions, to within the value of the optimality tolerance,
and constraints are satisfied to within the value of the constraint tolerance.

<stopping criteria details>
sol = struct with fields:
    x: [2×1 double]

fval = 4.5793e-11
exitflag = 
    OptimalSolution

output = struct with fields:
         iterations: 44
          funcCount: 164
    constrviolation: 0
           stepsize: 4.3124e-08
          algorithm: 'interior-point'
      firstorderopt: 5.1691e-07
       cgiterations: 10
            message: '↵Local minimum found that satisfies the constraints.↵↵Optimization completed because the objective function is non-decreasing in ↵feasible directions, to within the value of the optimality tolerance,↵and constraints are satisfied to within the value of the constraint tolerance.↵↵<stopping criteria details>↵↵Optimization completed: The relative first-order optimality measure, 5.169074e-07,↵is less than options.OptimalityTolerance = 1.000000e-06, and the relative maximum constraint↵violation, 0.000000e+00, is less than options.ConstraintTolerance = 1.000000e-06.↵↵'
       bestfeasible: [1×1 struct]
             solver: 'fmincon'

toc
Elapsed time is 164.410724 seconds.

求解にかかる時間 (秒単位) は関数評価の回数とほぼ同じです。この結果は、ソルバーが関数値を再利用しており、同じ点を 2 回再評価することによって時間を無駄にしなかったことを示しています。

より広範囲な例は、共通の関数を持つ目的関数と制約の逐次評価または並列評価、問題ベースを参照してください。fcn2optimexpr の使用に関する詳細については、非線形関数から最適化式への変換を参照してください。

入力引数

すべて折りたたむ

変換する関数。関数ハンドルとして指定します。

例: @sin は正弦関数を指定します。

データ型: function_handle

入力引数。MATLAB 変数として指定します。入力は任意のデータ型とサイズをとることができます。任意の問題変数またはデータを入力引数 in に含めることができます。問題ベースのアプローチでの追加パラメーターの受け渡しを参照してください。

データ型: single | double | int8 | int16 | int32 | int64 | uint8 | uint16 | uint32 | uint64 | logical | char | string | struct | table | cell | function_handle | categorical | datetime | duration | calendarDuration | fi
複素数のサポート: あり

名前と値のペアの引数

引数 Name,Value のオプションのコンマ区切りペアを指定します。Name は引数名、Value は対応する値です。Name は引用符で囲まなければなりません。Name1,Value1,...,NameN,ValueN のように、複数の名前と値のペアの引数を任意の順番で指定できます。

例: [out1,out2] = fcn2optimexpr(@fun,x,y,'OutputSize',[1,1],'ReuseEvaluation',true) は、out1 および out2 が目的関数と制約関数の間で再計算なしで再利用されるスカラーであることを指定します。

出力式のサイズ。次のように指定します。

  • 整数ベクトル — 関数が 1 つの出力 out1 をもつ場合、OutputSizeout1 のサイズを指定します。関数が複数の出力 out1 ~ outN をもつ場合、OutputSize はすべての出力のサイズが同じであることを指定します。

  • 整数ベクトルの cell 配列 — 出力 outj のサイズは、OutputSize の j 番目の要素です。

メモ

スカラーのサイズは [1,1] です。

名前/値のペアの引数 'OutputSize' を指定しない場合、出力のサイズを決定するために、fcn2optimexpr によって fcn にデータが渡されます (アルゴリズムを参照)。'OutputSize' を指定することにより、fcn2optimexpr にこの手順をスキップさせて、時間を短縮できます。また、'OutputSize' を指定せず、何らかの理由で fcn の評価が失敗した場合、fcn2optimexpr も失敗します。

例: [out1,out2,out3] = fcn2optimexpr(@fun,x,'OutputSize',[1,1]) は、3 つの出力 [out1,out2,out3] がスカラーであることを指定します。

例: [out1,out2] = fcn2optimexpr(@fun,x,'OutputSize',{[4,4],[3,5]}) は、out1 のサイズが 4 行 4 列であり、out2 のサイズが 3 行 5 列であることを指定します。

データ型: double | cell

値を再利用するための指標。false (再利用不可) または true (再利用可能) として指定します。

'ReuseEvaluation' を使用すると、目的関数と一部の非線形制約が共通の計算に依存する場合などに、問題の実行を高速化できます。この場合、ソルバーは値を保存して必要な場合に再利用し、値の再計算を回避します。

再利用可能な値には多少のオーバーヘッドが伴うため、再利用可能な値は、値を共有している式に対してのみ有効にすることをお勧めします。

例: [out1,out2,out3] = fcn2optimexpr(@fun,x,'ReuseEvaluation',true) とすると、out1out2、および out3 が複数の計算で使用され、評価点ごとに 1 回のみ出力が計算されるようになります。

データ型: logical

出力引数

すべて折りたたむ

出力引数。OptimizationExpression として返されます。式のサイズは入力関数に依存します。

ヒント

アルゴリズム

OutputSize を指定しない場合に返されるそれぞれの式の出力サイズを確認するために、fcn2optimexpr は問題変数の各要素について次の点で関数を評価します。

変数の特性評価点
上限 ub および下限 lb がある(lb + ub)/2 + ((ub - lb)/2)*eps
下限はあるが上限がないlb + max(1,abs(lb))*eps
上限はあるが下限がないub - max(1,abs(ub))*eps
範囲なし1 + eps
変数が整数として指定されるあらかじめ与えられた点の floor

評価点によって、関数評価で誤差が発生することがあります。このような誤差を回避するには、'OutputSize' を指定します。

R2019a で導入