Main Content

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

prob2struct

最適化問題または方程式問題のソルバー形式への変換

説明

prob2struct を使用して、最適化問題または方程式問題をソルバー形式に変換します。

ヒント

完全なワークフローについては、問題ベースの最適化ワークフローまたは方程式を解くための問題ベースのワークフローを参照してください。

problem = prob2struct(prob) は、ソルバーベースの求解に適した最適化問題構造体を返します。非線形問題の場合、prob2struct は、目的関数用のファイルと、必要に応じて非線形制約関数用のファイルおよびサポート ファイルを作成します。

また、problem = prob2struct(prob,x0) は初期点構造体 x0 を変換し、これを problem に含めます。

problem = prob2struct(___,Name,Value) は、すべての入力引数に対して、1 つ以上の名前と値のペアの引数を使用して追加オプションを指定します。たとえば非線形最適化問題の場合、problem = prob2struct(prob,'ObjectiveFunctionName','objfun1') は、prob2struct が現在のフォルダーに objfun1.m という名前の目的関数ファイルを作成することを指定します。

すべて折りたたむ

最適化問題オブジェクトを問題構造体に変換します。

混合整数線形計画法の基礎: 問題ベースから基本的な MILP 問題を入力します。

ingots = optimvar('ingots',4,1,'Type','integer','LowerBound',0,'UpperBound',1);
alloys = optimvar('alloys',4,1,'LowerBound',0);

weightIngots = [5,3,4,6];
costIngots = weightIngots.*[350,330,310,280];
costAlloys = [500,450,400,100];
cost = costIngots*ingots + costAlloys*alloys;

steelprob = optimproblem;
steelprob.Objective = cost;

totalweight = weightIngots*ingots + sum(alloys);

carbonIngots = [5,4,5,3]/100;
molybIngots = [3,3,4,4,]/100;
carbonAlloys = [8,7,6,3]/100;
molybAlloys = [6,7,8,9]/100;

totalCarbon = (weightIngots.*carbonIngots)*ingots + carbonAlloys*alloys;
totalMolyb = (weightIngots.*molybIngots)*ingots + molybAlloys*alloys;

steelprob.Constraints.conswt = totalweight == 25;
steelprob.Constraints.conscarb = totalCarbon == 1.25;
steelprob.Constraints.consmolyb = totalMolyb == 1.25;

問題を intlinprog 問題構造体に変換します。

problem = prob2struct(steelprob);

結果として得られる線形等式制約の行列とベクトルを検証します。

Aeq = problem.Aeq
Aeq = 
   (1,1)       1.0000
   (2,1)       0.0800
   (3,1)       0.0600
   (1,2)       1.0000
   (2,2)       0.0700
   (3,2)       0.0700
   (1,3)       1.0000
   (2,3)       0.0600
   (3,3)       0.0800
   (1,4)       1.0000
   (2,4)       0.0300
   (3,4)       0.0900
   (1,5)       5.0000
   (2,5)       0.2500
   (3,5)       0.1500
   (1,6)       3.0000
   (2,6)       0.1200
   (3,6)       0.0900
   (1,7)       4.0000
   (2,7)       0.2000
   (3,7)       0.1600
   (1,8)       6.0000
   (2,8)       0.1800
   (3,8)       0.2400

beq = problem.beq
beq = 3×1

   25.0000
    1.2500
    1.2500

範囲を検証します。

problem.lb
ans = 8×1

     0
     0
     0
     0
     0
     0
     0
     0

problem.ub
ans = 8×1

   Inf
   Inf
   Inf
   Inf
     1
     1
     1
     1

intlinprog を呼び出して問題を解きます。

x = intlinprog(problem)
LP:                Optimal objective value is 8125.600000.                                          

Cut Generation:    Applied 3 mir cuts.                                                              
                   Lower bound is 8495.000000.                                                      
                   Relative gap is 0.00%.                                                          


Optimal solution found.

Intlinprog stopped at the root node because the objective value is within a gap
tolerance of the optimal value, options.AbsoluteGapTolerance = 0 (the default
value). The intcon variables are integer within tolerance,
options.IntegerTolerance = 1e-05 (the default value).
x = 8×1

    7.2500
         0
    0.2500
    3.5000
    1.0000
    1.0000
         0
    1.0000

問題ベース フレームワークで非線形問題を作成します。

x = optimvar('x',2);
fun = 100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
prob = optimproblem('Objective',fun);
mycon = dot(x,x) <= 4;
prob.Constraints.mycon = mycon;
x0.x = [-1;1.5];

prob を最適化問題構造体に変換します。生成された目的関数ファイルに 'rosenbrock'、制約関数ファイルに 'circle2' という名前を付けます。

problem = prob2struct(prob,x0,'ObjectiveFunctionName','rosenbrock',...
    'ConstraintFunctionName','circle2');

prob2struct は、現在のフォルダーに非線形目的関数ファイルと非線形制約関数ファイルを作成します。これらのファイルを別のフォルダーに作成するには、名前と値のペア 'FileLocation' を使用します。

問題を解きます。

[x,fval] = fmincon(problem)
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.
x = 2×1

    1.0000
    1.0000

fval = 4.6187e-11

入力引数

すべて折りたたむ

最適化問題または方程式問題。OptimizationProblem オブジェクトまたは EquationProblem オブジェクトとして指定します。最適化問題は optimproblem を使用して作成し、方程式問題は eqnproblem を使用して作成します。

警告

問題ベースのアプローチでは、目的関数、非線形等式、または非線形不等式における複素数値をサポートしていません。関数の計算に複素数値が含まれていると、それが中間値としてであっても、最終結果が不正確になる場合があります。

例: prob = optimproblem; prob.Objective = obj; prob.Constraints.cons1 = cons1;

例: prob = eqnproblem; prob.Equations = eqs;

初期点。prob の変数名に等しいフィールド名をもつ構造体として指定します。

一部の Global Optimization Toolbox ソルバーでは、x0 を複数の初期点を表す構造体配列にすることができます。これらのソルバーには次のものがあります。

  • ga (Global Optimization Toolbox) および particleswarm (Global Optimization Toolbox)。これらのソルバーは、初期集団のメンバーとして複数の開始点を受け入れます。

  • surrogateopt (Global Optimization Toolbox).このソルバーは、初期代理の生成に有効な複数の初期点を受け入れます。

名前付きインデックス変数と共に x0 を使用する例については、名前付きインデックス変数による最適化の初期点の作成を参照してください。

例: prob に変数 xy がある場合: x0.x = [3,2,17]; x0.y = [pi/3,2*pi/3]

データ型: struct

名前と値の引数

例: problem = prob2struct(prob,'FileLocation','C:\Documents\myproblem')

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

非線形制約関数に対して自動微分 (AD) を使用するための指示。'ConstraintDerivative''auto' (可能な場合に AD を使用)、'auto-forward' (可能な場合にフォワード モードの AD を使用)、'auto-reverse' (可能な場合にリバース モードの AD を使用)、または 'finite-differences' (AD を使用しない) のいずれかで構成されたコンマ区切りのペアとして指定します。最適化変数および式でサポートされる演算で説明されているように、制約関数がサポートされている場合は、auto などを選択すると、生成される制約関数ファイルが問題の求解時に勾配情報を使用するようになります。例については、問題ベースのワークフローへの導関数の供給を参照してください。

メモ

prob2struct によって変換された問題内で自動導関数を使用するには、これらの導関数を指定するオプションを渡します。

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

例: 'finite-differences'

データ型: char | string

最適化問題のために prob2struct によって作成された非線形制約関数ファイルの名前。'ConstraintFunctionName' とファイル名で構成されるコンマ区切りのペアとして指定します。この引数は、fmincon または fminunc 問題に適用されます。problem を参照してください。ファイル拡張子 .m をファイル名に含めないでください。prob2struct はファイルの作成時にファイル拡張子を追加します。

ConstraintFunctionName を指定しない場合、prob2struct'generatedConstraints.m' を上書きします。FileLocation を指定しない場合、prob2struct は現在のフォルダーにファイルを作成します。

返される problem 構造体はこの関数ファイルを参照します。

例: "mynlcons"

データ型: char | string

方程式問題のために prob2struct によって作成された非線形方程式関数ファイルの名前。'EquationFunctionName' とファイル名で構成されるコンマ区切りのペアとして指定します。この引数は、fsolvefzero、または lsqnonlin の方程式に適用されます。problem を参照してください。ファイル拡張子 .m をファイル名に含めないでください。prob2struct はファイルの作成時にファイル拡張子を追加します。

EquationFunctionName を指定しない場合、prob2struct'generatedEquation.m' を上書きします。FileLocation を指定しない場合、prob2struct は現在のフォルダーにファイルを作成します。

返される problem 構造体はこの関数ファイルを参照します。

例: "myequation"

データ型: char | string

生成されたファイル (目的関数ファイル、制約関数ファイル、その他のサブ関数ファイル) の場所。'FileLocation' と書き込み可能なフォルダーへのパスで構成されるコンマ区切りのペアとして指定します。生成されたすべてのファイルはこのフォルダーに保存されます。複数のフォルダーはサポートされていません。

例: 'C:Documents\MATLAB\myproject'

データ型: char | string

非線形目的関数に対して自動微分 (AD) を使用するための指示。'ObjectiveDerivative''auto' (可能な場合に AD を使用)、'auto-forward' (可能な場合にフォワード モードの AD を使用)、'auto-reverse' (可能な場合にリバース モードの AD を使用)、または 'finite-differences' (AD を使用しない) のいずれかで構成されたコンマ区切りのペアとして指定します。最適化変数および式でサポートされる演算で説明されているように、目的関数がサポートされている場合は、auto などを選択すると、生成される目的関数ファイルが問題の求階時に導関数情報を含めるようになります。例については、問題ベースのワークフローへの導関数の供給を参照してください。

メモ

prob2struct によって変換された問題内で自動導関数を使用するには、これらの導関数を指定するオプションを渡します。

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

例: 'finite-differences'

データ型: char | string

最適化問題のために prob2struct によって作成された目的関数ファイルの名前。'ObjectiveFunctionName' とファイル名で構成されるコンマ区切りのペアとして指定します。この引数は、fmincon または fminunc 問題に適用されます。problem を参照してください。ファイル拡張子 .m をファイル名に含めないでください。prob2struct はファイルの作成時にファイル拡張子を追加します。

ObjectiveFunctionName を指定しない場合、prob2struct'generatedObjective.m' を上書きします。FileLocation を指定しない場合、prob2struct は現在のフォルダーにファイルを作成します。

返される problem 構造体はこの関数ファイルを参照します。

例: "myobj"

データ型: char | string

最適化ソルバー。リストされているソルバーの名前として指定します。以下の表には、最適化問題について、Global Optimization Toolbox のソルバーを含め、問題のタイプごとに使用可能なソルバーが示されています。方程式問題の詳細については、最適化ソルバーの詳細の後に示しています。

整数制約をもつ非線形問題を prob2struct で変換する場合、結果として得られる問題構造体は選択したソルバーに依存します。Global Optimization Toolbox ライセンスをお持ちでない場合は、このソルバーを指定する必要があります。詳細は、非線形問題ベースの最適化における整数制約を参照してください。

最適化問題のタイプごとに、既定のソルバーを以下の表に示します。

問題のタイプ既定のソルバー
線形計画法 (LP)linprog
混合整数線形計画法 (MILP)intlinprog
二次計画法 (QP)quadprog
2 次錐計画法 (SOCP)coneprog
線形最小二乗法lsqlin
非線形最小二乗法lsqnonlin
非線形計画法 (NLP)

fminunc (制約のない問題の場合)、fmincon (それ以外)

混合整数非線形計画法 (MINLP)ga (Global Optimization Toolbox)

次の表で、Yes はその問題のタイプにソルバーを使用できることを表し、"x" はソルバーを使用できないことを表しています。

問題のタイプ

LPMILPQPSOCP線形最小二乗法非線形最小二乗法NLPMINLP
ソルバー
linprog

Yes

xxxxxxx
intlinprog

Yes

Yes

xxxxxx
quadprog

Yes

x

Yes

Yes

Yes

xxx
coneprog

Yes

xx

Yes

xxxx
lsqlinxxxx

Yes

xxx
lsqnonnegxxxx

Yes

xxx
lsqnonlinxxxx

Yes

Yes

xx
fminunc

Yes

x

Yes

x

Yes

Yes

Yes

x
fmincon

Yes

x

Yes

Yes

Yes

Yes

Yes

x
patternsearch (Global Optimization Toolbox)

Yes

x

Yes

Yes

Yes

Yes

Yes

x
ga (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

particleswarm (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
simulannealbnd (Global Optimization Toolbox)

Yes

x

Yes

x

Yes

Yes

Yes

x
surrogateopt (Global Optimization Toolbox)

Yes

Yes

Yes

Yes

Yes

Yes

Yes

Yes

メモ

最小二乗問題のソルバーとして lsqcurvefit を選択した場合、solvelsqnonlin を使用します。solve に関して lsqcurvefit ソルバーと lsqnonlin ソルバーは同一です。

注意

最大化問題 (prob.ObjectiveSense"max" または "maximize") の場合は、最小二乗ソルバー (名前が lsq で始まるソルバー) を指定しないでください。これらのソルバーは最大化を実行できないので、指定すると solve でエラーが発生します。

以下の表には、方程式の求解について、問題のタイプごとに使用可能なソルバーが示されています。以下の表では、

  • * は、その問題のタイプの既定のソルバーを示します。

  • Y は、使用可能なソルバーを示します。

  • N は、使用できないソルバーを示します。

方程式でサポートされているソルバー

方程式のタイプlsqlinlsqnonnegfzerofsolvelsqnonlin
線形*NY (スカラーのみ)YY
範囲付き線形*YNNY
スカラー非線形NN*YY
非線形方程式系NNN*Y
範囲付き非線形方程式系NNNN*

例: 'intlinprog'

データ型: char | string

出力引数

すべて折りたたむ

問題構造体。fmincon problem 構造体、fminunc problem 構造体、fsolve problem 構造体、intlinprog problem 構造体、linprog problem 構造体、lsqlin problem 構造体、lsqnonlin problem 構造体、quadprog problem 構造体、または ga problem (Global Optimization Toolbox) 構造体として返されます。

次の表は、最適化問題について、結果として得られる既定の問題のタイプを示しています。既定ではない問題のタイプを取得することも可能です。たとえば、非線形範囲制約付き問題の場合は、solver 引数を使用して、ほとんどの Global Optimization Toolbox ソルバーを選択できます。

最適化目的関数と制約のタイプ (範囲を含む線形制約)

結果として得られる問題のタイプ

線形目的関数と線形制約関数。

少なくとも 1 つの問題変数が 'integer' 型。

intlinprog

線形目的関数と線形制約関数。

'integer' 型の問題変数がない。

linprog

線形制約関数。

目的関数が線形式の二乗和と定数の和。

lsqlin

範囲制約。

目的関数が一般的な非線形式の二乗和と定数の和。

lsqnonlin

線形制約関数。

一般的な二次目的関数。

quadprog

一般的な非線形目的関数。

制約なし。

fminunc

一般的な非線形目的関数で、少なくとも 1 つの任意のタイプの制約がある。

または、少なくとも 1 つの一般的な非線形制約関数がある。

fmincon

非線形目的関数または非線形制約関数で、少なくとも 1 つの整数変数がある。

ga

次の表は、方程式を解く問題について、結果として得られる問題のタイプを示しています。

方程式のタイプ

結果として得られる問題のタイプ

線形方程式系 (範囲の有無を問わない)

lsqlin

スカラー (single) 非線形方程式

fzero

制約のない非線形方程式系

fsolve

範囲のある非線形方程式系

lsqnonlin

メモ

非線形問題の場合、prob2struct は、目的関数用の関数ファイルと、非線形制約関数用の関数ファイルを作成します。サポート関数を呼び出す目的関数と制約関数の場合、prob2struct はサポート関数ファイルも作成し、FileLocation フォルダーに保存します。生成された関数内の追加のパラメーターにアクセスするには、生成された関数詳細の取得を参照してください。

線形最適化問題および二次最適化問題の場合、問題構造体には、目的関数の加法定数を表す追加フィールド f0 が含まれます。指定したソルバーを使用して問題構造体を解く場合、返される目的関数値に f0 の値は含まれません。関数 solve を使用してprob を解く場合、返される目的関数値には f0 値が含まれます。

probObjectiveSense'max' または 'maximize' である場合、ソルバーが最小化を行うため、problem では prob の目的関数の負の値が使用されます。最大化を行うため、ソルバーは元の目的関数の負の値を最小化します。この場合、ソルバーから報告される最適な関数値は、元の問題に対する負の値です。詳細は、目的関数の最大化を参照してください。最大化問題では lsqlin を使用できません。

ヒント

  • 非線形問題に対して同じ MATLAB® セッションで prob2struct を複数回呼び出す場合、引数 ObjectiveFunctionName または EquationFunctionName と、適切な場合は引数 ConstraintFunctionName を使用します。一意の名前を指定することによって、結果として得られる問題構造体が正しい目的関数と制約関数を参照するようになります。そうでない場合、これ以降 prob2struct を呼び出すと、生成される非線形関数ファイルによって既存のファイルが上書きされる可能性があります。

  • 無限再帰の発生を回避するには、目的関数または制約関数内で prob2struct を呼び出さないようにします。

  • 非線形問題に対して prob2struct を並列で呼び出す場合、結果として得られる目的関数ファイルと制約関数ファイルが一意の名前を持つようにします。そうすることで、ループの各パスで同じファイルへの書き込みが回避されます。

アルゴリズム

すべて折りたたむ

ソルバー形式への変換

問題構造体の基本は、単一ベクトルにおけるすべての問題変数の暗黙の順序付けです。問題変数の順序は、probVariables プロパティの順序と同じです。詳細は、OptimizationProblem を参照してください。varindex を使用して順序を確認することもできます。

たとえば、問題変数が次の順序であるとします。

  • x — 3 x 2 x 4 の配列

  • y — 3 行 2 列の配列

この場合、暗黙の変数順序は、問題変数が vars = [x(:);y(:)] である場合と同じになります。

vars の合計 30 個の要素のうち、最初の 24 個の要素は x(:) に相当し、次の 6 個の要素は y(:) に相当します。下限と上限はこの変数順序に対応し、各線形制約行列には 30 の列があります。

一般的な非線形目的関数または制約関数を含む問題の場合、prob2struct は、現在のフォルダー、または FileLocation によって指定されたフォルダーに関数ファイルを作成します。返される problem 構造体はこれらの関数ファイルを参照します。

自動微分

自動微分 (AD) は、以下の条件の下で、solve 関数と prob2struct 関数に適用されます。

  • 最適化変数および式でサポートされる演算で説明されているように、目的関数と制約関数がサポートされています。これらの関数は、fcn2optimexpr 関数を使用する必要がありません。

  • solve に呼び出されるソルバーは、fminconfminuncfsolvelsqnonlin のいずれかです。

  • 最適化問題では、solve または prob2struct'ObjectiveDerivative''ConstraintDerivative' の名前と値のペアの引数が 'auto' (既定)、'auto-forward'、または 'auto-reverse' に設定されます。

  • 方程式問題の場合、'EquationDerivative' オプションは 'auto' (既定)、'auto-forward'、または 'auto-reverse' に設定されます。

AD の適用時サポートされているすべての制約関数サポートされていない 1 つ以上の制約
サポートされている目的関数目的と制約に使用される AD目的のみに使用される AD
サポートされていない目的関数制約のみに使用される AD使用されない AD

これらの条件が満たされなかった場合は、solve が有限差分によって勾配を推定し、prob2struct が生成された関数ファイル内に勾配を作成しません。

ソルバーは既定で次のタイプの AD を選択します。

  • 一般的な非線形目的関数の場合、fmincon は既定で目的関数用のリバース モードの AD になります。fmincon は、非線形制約の数が変数の数よりも少ない場合に既定で非線形制約関数用のリバース モードの AD になります。それ以外の場合、fmincon は既定で非線形制約関数用のフォワード モードの AD になります。

  • 一般的な非線形目的関数の場合、fminunc は既定でリバース モードの AD になります。

  • 最小二乗目的関数の場合、fminconfminunc は既定で目的関数用のフォワード モードの AD になります。問題ベースの最小二乗目的関数の定義については、問題ベースの最小二乗法の目的関数の記述を参照してください。

  • lsqnonlin は、目的ベクトルに含まれる要素数が変数の数以上である場合に既定でフォワード モードの AD になります。それ以外の場合、lsqnonlin は既定でリバース モードの AD になります。

  • fsolve は、方程式の数が変数の数以上の場合に既定でフォワード モードの AD になります。それ以外の場合、fsolve は既定でリバース モードの AD になります。

メモ

prob2struct によって変換された問題内で自動導関数を使用するには、これらの導関数を指定するオプションを渡します。

options = optimoptions('fmincon','SpecifyObjectiveGradient',true,...
    'SpecifyConstraintGradient',true);
problem.options = options;

現時点で、AD は、最初の導関数に対してのみ機能します。2 番目以降の導関数には適用されません。そのため、たとえば、解析的ヘッシアンを使用して最適化を高速化するには、solve を直接使用できず、代わりに、問題ベースのワークフローへの導関数の供給で説明されているアプローチを使用しなければなりません。

バージョン履歴

R2017b で導入

すべて展開する

R2021a 以降はエラー