このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
fminunc
制約なし多変数関数の最小値を求める
構文
説明
は、x
= fminunc(fun
,x0
,options
)options
で指定された最適化オプションを使って fun
を最小化します。optimoptions
を使用してこれらのオプションを設定してください。
例
多項式の最小化
関数 を最小化します。
これを行うには、目的関数を計算する無名関数 fun
を記述します。
fun = @(x)3*x(1)^2 + 2*x(1)*x(2) + x(2)^2 - 4*x(1) + 5*x(2);
fminunc
を呼び出し、[1,1]
に近い fun
の最小値を求めます。
x0 = [1,1]; [x,fval] = fminunc(fun,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
2.2500 -4.7500
fval = -16.3750
勾配の指定
fminunc
は、導関数を与えると、速度および信頼性が向上する場合があります。
勾配と関数値を返す目的関数を記述します。勾配とヘッシアンを含める で説明するように、条件付きの形式を使用します。この目的関数は Rosenbrock 関数になります。
ここで勾配は
.
勾配のある目的関数のコードは、この例の終わりに掲載しています。
目的関数の勾配を使用するオプションを作成します。また、アルゴリズムを 'trust-region'
に設定します。
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
初期点を [-1,2
] に設定します。その後、fminunc
を呼び出します。
x0 = [-1,2]; fun = @rosenbrockwithgrad; x = fminunc(fun,x0,options)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
1.0000 1.0000
次のコードは、関数 rosenbrockwithgrad
を作成します。この関数には、2 番目の出力として勾配が含まれます。
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1) - 2*(1-x(1)); 200*(x(2)-x(1)^2)]; end end
問題構造体の使用
個別の引数の代わりに問題構造体を使用して勾配の指定 と同じ問題を解きます。
勾配と関数値を返す目的関数を記述します。勾配とヘッシアンを含める で説明するように、条件付きの形式を使用します。この目的関数は Rosenbrock 関数になります。
,
ここで勾配は
.
勾配のある目的関数のコードは、この例の終わりに掲載しています。
目的関数の勾配を使用するオプションを作成します。また、アルゴリズムを 'trust-region'
に設定します。
options = optimoptions('fminunc','Algorithm','trust-region','SpecifyObjectiveGradient',true);
初期点 x0 = [-1,2]
を含む問題構造体を作成します。この構造体に必須のフィールドについては、problemを参照してください。
problem.options = options;
problem.x0 = [-1,2];
problem.objective = @rosenbrockwithgrad;
problem.solver = 'fminunc';
問題を解きます。
x = fminunc(problem)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
1.0000 1.0000
次のコードは、関数 rosenbrockwithgrad
を作成します。この関数には、2 番目の出力として勾配が含まれます。
function [f,g] = rosenbrockwithgrad(x) % Calculate objective f f = 100*(x(2) - x(1)^2)^2 + (1-x(1))^2; if nargout > 1 % gradient required g = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)]; end end
最適な目的関数値の取得
非線形関数の最小値の位置と、その最小値での関数値の両方を求めます。目的関数は次のとおりです。
.
fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;
x0 = [1,2]
を開始点とする最小化関数の位置および目的関数値を求めます。
x0 = [1,2]; [x,fval] = fminunc(fun,x0)
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
-0.6691 0.0000
fval = -0.4052
解法プロセスの検証
fminunc
のオプションおよび出力を選択して、解法プロセスを検証します。
反復表示を取得して 'quasi-newton'
アルゴリズムを使用するようにオプションを設定します。
options = optimoptions(@fminunc,'Display','iter','Algorithm','quasi-newton');
目的関数は次のとおりです。
fun = @(x)x(1)*exp(-(x(1)^2 + x(2)^2)) + (x(1)^2 + x(2)^2)/20;
x0 = [1,2]
から最小化を開始して、解の質と解法プロセスを検証できる出力を取得します。
x0 = [1,2]; [x,fval,exitflag,output] = fminunc(fun,x0,options)
First-order Iteration Func-count f(x) Step-size optimality 0 3 0.256738 0.173 1 6 0.222149 1 0.131 2 9 0.15717 1 0.158 3 18 -0.227902 0.438133 0.386 4 21 -0.299271 1 0.46 5 30 -0.404028 0.102071 0.0458 6 33 -0.404868 1 0.0296 7 36 -0.405236 1 0.00119 8 39 -0.405237 1 0.000252 9 42 -0.405237 1 7.97e-07 Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
x = 1×2
-0.6691 0.0000
fval = -0.4052
exitflag = 1
output = struct with fields:
iterations: 9
funcCount: 42
stepsize: 2.9343e-04
lssteplength: 1
firstorderopt: 7.9721e-07
algorithm: 'quasi-newton'
message: 'Local minimum found....'
終了フラグ
1
は、解が局所的最適解であることを示します。output
構造体は、反復の回数、関数評価の回数、およびその他の情報を示します。反復表示は、反復および関数評価の回数も示します。
大規模な問題に対する "lbfgs"
ヘッセ近似の使用
問題の変数の数が多い場合、HessianApproximation
を既定値にすると fminunc
が大量のメモリを使用して実行が遅くなる可能性があります。メモリの使用を抑えて実行を高速化するには、HessianApproximation="lbfgs"
を指定します。
たとえば、既定のパラメーターを使用して、1e5 個の変数を持つ関数 multirosenbrock
(下記を参照) を最小化しようとすると、fminunc
でエラーが発生します。
N = 1e5; x0 = -2*ones(N,1); x0(2:2:N) = 2; [x,fval] = fminunc(@multirosenbrock,x0)
Error using eye Requested 100000x100000 (74.5GB) array exceeds maximum array size preference (63.9GB). This might cause MATLAB to become unresponsive. Error in optim.internal.fminunc.AbstractDenseHessianApproximation (line 21) this.Value = eye(nVars); Error in optim.internal.fminunc.BFGSHessianApproximation (line 14) this = this@optim.internal.fminunc.AbstractDenseHessianApproximation(nVars); Error in fminusub (line 73) HessApprox = optim.internal.fminunc.BFGSHessianApproximation(sizes.nVar); Error in fminunc (line 488) [x,FVAL,GRAD,HESSIAN,EXITFLAG,OUTPUT] = fminusub(funfcn,x, ...
この問題を解くには、HessianApproximation
オプションを "lbfgs"
に設定します。解を迅速に得るには、指定された勾配を使用するオプションを設定します。
N = 1e5; x0 = -2*ones(N,1); x0(2:2:N) = 2; options = optimoptions("fminunc",HessianApproximation="lbfgs",... SpecifyObjectiveGradient=true); [x,fval] = fminunc(@multirosenbrock,x0,options);
Local minimum found. Optimization completed because the size of the gradient is less than the value of the optimality tolerance.
理論解は、すべての i
について x(i) = 1
です。返された解の精度を確認します。
max(abs(x-1))
ans = 1.3795e-04
このコードは関数 multirosenbrock
を作成します。
function [f,g] = multirosenbrock(x) % Get the problem size n = length(x); if n == 0, error('Input vector, x, is empty.'); end if mod(n,2) ~= 0 error('Input vector, x ,must have an even number of components.'); end % Evaluate the vector function odds = 1:2:n; evens = 2:2:n; F = zeros(n,1); F(odds,1) = 1-x(odds); F(evens,1) = 10.*(x(evens)-x(odds).^2); f = sum(F.^2); if nargout >= 2 % Calculate gradient g = zeros(n,1); g(evens) = 200*(x(evens)-x(odds).^2); g(odds) = -2*(1 - x(odds)) - 400*(x(evens)-x(odds).^2).*x(odds); end end
入力引数
fun
— 最小化する関数
関数ハンドル | 関数名
最小化する関数。関数ハンドルまたは関数名として指定されます。fun
は、ベクトルまたは配列 x
を受け、x
で評価される目的関数の実数スカラー f
を返す関数です。
fminunc
は、x0
引数の形式で x
を目的関数に渡します。たとえば、x0
が 5 行 3 列の配列の場合、fminunc
は 5 行 3 列の配列として x
を fun
に渡します。
fun
をファイルの関数ハンドルとして指定します。
x = fminunc(@myfun,x0)
ここで myfun
は次のような MATLAB® 関数です。
function f = myfun(x) f = ... % Compute function value at x
fun
は、無名関数の関数ハンドルとして指定することもできます。
x = fminunc(@(x)norm(x)^2,x0);
fun
の勾配を計算することができ、"さらに" 次のように SpecifyObjectiveGradient
オプションが true
に設定されている場合、
options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
fun
は 2 番目の出力引数に勾配ベクトル g(x)
を出力しなければなりません。
ヘッセ行列を計算することもでき、"さらに" HessianFcn
オプションが options = optimoptions('fminunc','HessianFcn','objective')
によって 'objective'
に設定されており、"かつ" Algorithm
オプションが 'trust-region'
に設定されている場合、fun
は、3 番目の出力引数に対称行列であるヘッセ値 H(x)
を返さなければなりません。fun
はスパース ヘッシアンを返すことができます。詳細については、fminunc の信頼領域法アルゴリズムまたは fmincon の信頼領域 Reflective 法アルゴリズムのヘッシアンを参照してください。
trust-region
アルゴリズムではヘッセ乗算関数を指定できます。この関数はヘッシアンを直接計算せずに、ベクトルとヘッシアンの積を返します。これによってメモリを節約できます。詳細については、ヘッセ乗算関数を参照してください。
例: fun = @(x)sin(x(1))*cos(x(2))
データ型: char
| function_handle
| string
x0
— 初期点
実数ベクトル | 実数配列
初期点。実数ベクトルまたは実数配列として指定されます。ソルバーは、x0
の要素数および x0
のサイズを使用して、fun
が受け入れる変数の数およびサイズを決定します。
例: x0 = [1,2,3,4]
データ型: double
options
— 最適化オプション
optimoptions
の出力 | optimset
などによって返される構造体
最適化オプション。optimoptions
の出力、または optimset
などによって返される構造体として指定されます。
いくつかのオプションはすべてのアルゴリズムに適用することができ、その他のオプションは特定のアルゴリズムに関連します。詳細については、最適化オプション リファレンスを参照してください。
一部のオプションは、optimoptions
に表示されません。このようなオプションは、次の表ではイタリックで示されています。詳細については、最適化オプションの表示を参照してください。
すべてのアルゴリズム | |
|
|
CheckGradients | ユーザー設定の導関数 (目的関数の勾配) と有限差分による導関数とを比較します。選択肢は、
|
Diagnostics | 最小化または計算する関数に関する情報を表示します。選択肢は、 |
DiffMaxChange | 有限差分勾配を計算する場合に変数内で生じる最大変化量です (正のスカラー)。既定値は |
DiffMinChange | 有限差分勾配を計算する場合に変数内で生じる最小変化量です (正のスカラー)。既定値は |
Display | 表示レベル (反復表示を参照):
|
FiniteDifferenceStepSize | 有限差分のスカラーまたはベクトルのステップ サイズ ファクター。
sign′(0) = 1 を除き sign′(x) = sign(x) です。中心有限差分法では
FiniteDifferenceStepSize はベクトルに拡張します。既定値は、前進有限差分法では sqrt(eps) 、中心有限差分法では eps^(1/3) です。 信頼領域法アルゴリズムでは、
|
FiniteDifferenceType | 勾配推定に使用される有限差分は
|
FunValCheck | 目的関数値が正しいかどうかチェックします。既定の設定 |
MaxFunctionEvaluations | 可能な関数評価の最大回数 (正の整数)。既定値は
|
MaxIterations | 可能な反復の最大数 (正の整数)。既定値は
|
OptimalityTolerance | 1 次の最適性に関する終了許容誤差 (正のスカラー)。既定値は
|
OutputFcn | 各反復で最適化関数が呼び出すユーザー定義の関数を 1 つ以上指定します。関数ハンドルか、関数ハンドルの cell 配列を渡します。既定の設定はなし ( |
PlotFcn | アルゴリズムが実行中のさまざまな進行状況の測定値をプロットします。事前定義されたプロットから選択するか、独自のコードを記述してください。組み込みプロット関数名、関数ハンドル、または組み込みプロット関数名か関数ハンドルの cell 配列を渡します。カスタム プロット関数の場合は、関数ハンドルを渡します。既定の設定はなし (
カスタムのプロット関数は、出力関数と同じ構文を使用します。詳細については、Optimization Toolbox の出力関数と出力関数とプロット関数の構文を参照してください。
|
SpecifyObjectiveGradient | ユーザーが定義する目的関数の勾配。
|
StepTolerance |
|
TypicalX | 典型的な
|
trust-region アルゴリズム | |
FunctionTolerance | 関数値に関する終了許容誤差 (正のスカラー)。既定値は
|
HessianFcn |
|
HessianMultiplyFcn | ヘッセ乗算関数。関数ハンドルとして指定されます。大規模構造問題に対して、この関数は実際に W = hmfun(Hinfo,Y) ここで 最初の引数は目的関数 [f,g,Hinfo] = fun(x)
メモ:
例については、密に構造化されたヘッシアンと線形等式を使用した最小化を参照してください。
|
HessPattern | 有限差分に対するヘッシアンのスパース パターン。∂2
構造が不明であれば、 |
MaxPCGIter | 前処理付き共役勾配法 (PCG) の反復の最大回数 (正のスカラー)。既定値は |
PrecondBandWidth | PCG に対する前提条件子の帯域幅の上限 (非負の整数)。既定の設定では、 |
SubproblemAlgorithm | 反復ステップの計算方法を定義します。既定の設定である |
TolPCG | PCG 反復に関する終了許容誤差 (正のスカラー)。既定値は |
quasi-newton アルゴリズム | |
HessianApproximation | どのように
メモ 通常、 |
ObjectiveLimit | スカラーの許容誤差 (停止条件) です。反復の目的関数値が |
UseParallel |
|
例: options = optimoptions('fminunc','SpecifyObjectiveGradient',true)
problem
— 問題構造体
構造体
次のフィールドをもつ構造体として指定される問題構造体です。
フィールド名 | エントリ |
---|---|
| 目的関数 |
| x の初期点 |
| 'fminunc' |
| optimoptions で作成されたオプション |
データ型: struct
出力引数
x
— 解
実数ベクトル | 実数配列
実数ベクトルまたは実数配列として返される解です。x
のサイズは、x0
のサイズと同じです。通常、exitflag
が正の場合、x
は問題に対する局所的な解になります。解の質の詳細については、ソルバーが成功する場合を参照してください。
fval
— 解での目的関数値
実数
解での目的関数値。実数として返されます。一般的に、fval
= fun(x)
になります。
exitflag
— fminunc
の停止理由
整数
fminunc
の停止理由。整数として返されます。
| 勾配の大きさは、 |
|
|
| 目的関数値の変化が |
| 目的関数値の予測減少が |
| 反復回数が |
| アルゴリズムが出力関数により停止したことを示します。 |
| 現在の反復の目的関数が |
output
— 最適化プロセスに関する情報
構造体
最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。
iterations | 実行した反復回数 |
funcCount | 関数評価の回数 |
firstorderopt | 1 次の最適性の尺度 |
algorithm | 使用される最適化アルゴリズム |
cgiterations | PCG 法の合計反復回数 ( |
lssteplength | 探索方向の直線探索ステップ サイズ ( |
stepsize |
|
message | 終了メッセージ |
grad
— 解での勾配
実数ベクトル
解での勾配。実数ベクトルとして返されます。grad
は、点 x(:)
における fun
の勾配を返します。
hessian
— ヘッシアンの近似
実数行列
ヘッシアンの近似。実数行列として返されます。hessian
の意味については、ヘッシアン出力 を参照してください。
HessianApproximation
オプションが "lbfgs"
または {"lbfgs" n}
の場合、返される hessian
は []
です。
データ型: double
アルゴリズム
準ニュートン アルゴリズム
既定では、quasi-newton
アルゴリズムは 3 次直線探索手法で BFGS 準ニュートン法を使用します。この準ニュートン法はヘッセ行列の近似を更新するために、BFGS ([1],[5],[8]、[9]) を使用します。HessianApproximation
オプションとして、メモリ消費の少ない BFGS アルゴリズム ("lbfgs"
) を指定することもできます。推奨はされませんが、オプションを 'dfp'
に設定することで、逆ヘッセ行列を近似する DFP ([4]、[6]、および [7]) の公式を指定できます。オプションを 'steepdesc'
に設定することで最急降下法を指定できますが、通常、この設定は効率的ではありません。詳細については、fminunc quasi-newton アルゴリズムを参照してください。
信頼領域法アルゴリズム
trust-region
アルゴリズムでは、optimoptions
を使用して、fun
に勾配を指定し SpecifyObjectiveGradient
を true
に設定する必要があります。このアルゴリズムは部分空間の信頼領域法であり、[2] と [3] で説明する interior-reflective ニュートン法に基づいています。各反復は、前処理付き共役勾配 (PCG) 法を使用する大型線形システムの近似解を伴います。fminunc trust-region アルゴリズム、非線形最小化に対する信頼領域法、および前処理付き共役勾配法 を参照してください。
代替機能
アプリ
[最適化] ライブ エディター タスクが fminunc
にビジュアル インターフェイスを提供します。
参照
[1] Broyden, C. G. “The Convergence of a Class of Double-Rank Minimization Algorithms.” Journal Inst. Math. Applic., Vol. 6, 1970, pp. 76–90.
[2] Coleman, T. F. and Y. Li. “An Interior, Trust Region Approach for Nonlinear Minimization Subject to Bounds.” SIAM Journal on Optimization, Vol. 6, 1996, pp. 418–445.
[3] Coleman, T. F. and Y. Li. “On the Convergence of Reflective Newton Methods for Large-Scale Nonlinear Minimization Subject to Bounds.” Mathematical Programming, Vol. 67, Number 2, 1994, pp. 189–224.
[4] Davidon, W. C. “Variable Metric Method for Minimization.” A.E.C. Research and Development Report, ANL-5990, 1959.
[5] Fletcher, R. “A New Approach to Variable Metric Algorithms.” Computer Journal, Vol. 13, 1970, pp. 317–322.
[6] Fletcher, R. “Practical Methods of Optimization.” Vol. 1, Unconstrained Optimization, John Wiley and Sons, 1980.
[7] Fletcher, R. and M. J. D. Powell. “A Rapidly Convergent Descent Method for Minimization.” Computer Journal, Vol. 6, 1963, pp. 163–168.
[8] Goldfarb, D. “A Family of Variable Metric Updates Derived by Variational Means.” Mathematics of Computing, Vol. 24, 1970, pp. 23–26.
[9] Shanno, D. F. “Conditioning of Quasi-Newton Methods for Function Minimization.” Mathematics of Computing, Vol. 24, 1970, pp. 647–656.
拡張機能
自動並列サポート
Parallel Computing Toolbox™ を使用して自動的に並列計算を実行することで、コードを高速化します。
並列実行するには、'UseParallel'
オプションを true
に設定します。
options = optimoptions('
solvername
','UseParallel',true)
詳細については、Optimization Toolbox での並列計算の使用を参照してください。
バージョン履歴
R2006a より前に導入R2023b: CheckGradients
オプションは削除予定
CheckGradients
オプションは将来のリリースで削除される予定です。目的関数または非線形制約関数の 1 次導関数を確認するには、関数 checkGradients
を使用します。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)