このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
fminsearch
導関数を使用しない方法で制約なし多変数関数の最小値を見つける
構文
説明
非線形計画法ソルバーです。次で指定される問題の最小値を探索します。
f(x) はスカラーを返す関数、x はベクトルまたは行列です。
例
Rosenbrock 関数の最小化
多くのアルゴリズムで困難なことが知られている最適化問題、Rosenbrock 関数を最小化します。
この関数は点 x = [1,1]
で最小になり、最小値は 0
です。
開始点を x0 = [-1.2,1]
に設定し、fminsearch
を使用して Rosenbrock 関数を最小化します。
fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; x0 = [-1.2,1]; x = fminsearch(fun,x0)
x = 1×2
1.0000 1.0000
最適化プロセスの監視
fminsearch
により最小値を求めようとするときのプロセスを監視するオプションを設定します。
反復ごとに目的関数をプロットするオプションを設定します。
options = optimset('PlotFcns',@optimplotfval);
目的関数を次の Rosenbrock 関数に設定します。
この関数は点 x = [1,1]
で最小になり、最小値は 0
です。
開始点を x0 = [-1.2,1]
に設定し、fminsearch
を使用して Rosenbrock 関数を最小化します。
fun = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2; x0 = [-1.2,1]; x = fminsearch(fun,x0,options)
x = 1×2
1.0000 1.0000
ファイルで指定された関数の最小化
ファイルの実行により値が得られる目的関数を最小化します。関数ファイルは、実数ベクトル x
を受け入れ、目的関数の値である実数スカラーを返さなければなりません。
次のコードをコピーし、objectivefcn1.m
という名前のファイルとして、それを MATLAB® パス上に含めます。
function f = objectivefcn1(x) f = 0; for k = -10:10 f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2)); end
x0 = [0.25,-0.25]
から開始して、objectivefcn
の最小値を探索します。
x0 = [0.25,-0.25]; x = fminsearch(@objectivefcn1,x0)
x = -0.1696 -0.5086
追加パラメーターを含む最小化
目的関数は追加パラメーターをもつことがあります。これらのパラメーターは最適化の対象の変数ではありません。これらは最適化時には固定値です。たとえば、Rosenbrock タイプの関数にパラメーター a
が含まれているとします。
この関数は、、 で最小値 0 になります。たとえば、 の場合、無名関数を作成することで、目的関数にこのパラメーターを含めることができます。
追加の引数として追加パラメーターを含む目的関数を作成します。
f = @(x,a)100*(x(2) - x(1)^2)^2 + (a-x(1))^2;
パラメーターを MATLAB® ワークスペースに配置します。
a = 3;
ワークスペースでのパラメーター値を含む x
の無名関数を単体で作成します。
fun = @(x)f(x,a);
x0 = [-1,1.9]
から始めて問題を解きます。
x0 = [-1,1.9]; x = fminsearch(fun,x0)
x = 1×2
3.0000 9.0000
目的関数で追加パラメーターを使用する方法の詳細については、関数のパラメーター化を参照してください。
最小の位置と値を求める
fminsearch
を使用して、目的関数の最小の位置と値の両方を求めます。
3 変数問題を表す無名目的関数を記述します。
x0 = [1,2,3]; fun = @(x)-norm(x+x0)^2*exp(-norm(x-x0)^2 + sum(x));
x0
から開始して、fun
の最小値を求めます。同様に、最小となる値を求めます。
[x,fval] = fminsearch(fun,x0)
x = 1×3
1.5359 2.5645 3.5932
fval = -5.9565e+04
最適化プロセスの検査
実行中と終了後の両方で、最適化の結果を検査します。
反復表示を行うオプションを設定します。これは、ソルバーの実行中に、最適化に関する情報を示します。また、目的関数値をソルバーの実行中に表示するプロット関数を設定します。
options = optimset('Display','iter','PlotFcns',@optimplotfval);
目的関数と開始点を設定します。
function f = objectivefcn1(x) f = 0; for k = -10:10 f = f + exp(-(x(1)-x(2))^2 - 2*x(1)^2)*cos(x(2))*sin(2*x(2)); end
objectivefcn1
のコードをファイルとして、MATLAB® パス上に含めます。
x0 = [0.25,-0.25]; fun = @objectivefcn1;
すべてのソルバー出力を取得します。ソルバーの終了後に、これらの出力を使用して結果を検査します。
[x,fval,exitflag,output] = fminsearch(fun,x0,options)
Iteration Func-count f(x) Procedure 0 1 -6.70447 1 3 -6.89837 initial simplex 2 5 -7.34101 expand 3 7 -7.91894 expand 4 9 -9.07939 expand 5 11 -10.5047 expand 6 13 -12.4957 expand 7 15 -12.6957 reflect 8 17 -12.8052 contract outside 9 19 -12.8052 contract inside 10 21 -13.0189 expand 11 23 -13.0189 contract inside 12 25 -13.0374 reflect 13 27 -13.122 reflect 14 28 -13.122 reflect 15 29 -13.122 reflect 16 31 -13.122 contract outside 17 33 -13.1279 contract inside 18 35 -13.1279 contract inside 19 37 -13.1296 contract inside 20 39 -13.1301 contract inside 21 41 -13.1305 reflect 22 43 -13.1306 contract inside 23 45 -13.1309 contract inside 24 47 -13.1309 contract inside 25 49 -13.131 reflect 26 51 -13.131 contract inside 27 53 -13.131 contract inside 28 55 -13.131 contract inside 29 57 -13.131 contract outside 30 59 -13.131 contract inside 31 61 -13.131 contract inside 32 63 -13.131 contract inside 33 65 -13.131 contract outside 34 67 -13.131 contract inside 35 69 -13.131 contract inside Optimization terminated: the current x satisfies the termination criteria using OPTIONS.TolX of 1.000000e-04 and F(X) satisfies the convergence criteria using OPTIONS.TolFun of 1.000000e-04 x = -0.1696 -0.5086 fval = -13.1310 exitflag = 1 output = struct with fields: iterations: 35 funcCount: 69 algorithm: 'Nelder-Mead simplex direct search' message: 'Optimization terminated:...'
exitflag
の値は 1
であり、fminsearch
が局所的最小値に収束している可能性があることを意味します。
output
構造体は、反復回数を示します。反復表示とプロットもこの情報を表示します。また、output
構造体は、関数評価の回数も示します。これは、反復表示で表示されますが、選択したプロット関数では表示されません。
入力引数
fun
— 最小化する関数
関数ハンドル | 関数名
最小化する関数。関数ハンドルまたは関数名として指定します。fun
は、ベクトルまたは配列 x
を受け入れ、実数スカラー f
(x
で評価される目的関数) を返す関数です。
fminsearch
は x
を x0
引数の形状で目的関数に渡します。たとえば、x0
が 5 行 3 列の配列の場合、fminsearch
は x
を 5 行 3 列の配列として fun
に渡します。
fun
をファイルの関数ハンドルとして指定します。
x = fminsearch(@myfun,x0)
ここで myfun
は次のような MATLAB® 関数です。
function f = myfun(x) f = ... % Compute function value at x
fun
は、無名関数の関数ハンドルとして指定することもできます。
x = fminsearch(@(x)norm(x)^2,x0);
例: fun = @(x)-x*exp(-3*x)
データ型: char
| function_handle
| string
x0
— 初期点
実数ベクトル | 実数配列
初期点。実数ベクトルまたは実数配列として指定します。ソルバーは、x0
の要素数およびサイズを使用して、fun
が受け入れる変数の数およびサイズを決定します。
例: x0 = [1,2,3,4]
データ型: double
options
— 最適化オプション
optimset
などによって返される構造体
最適化オプション。optimset
などによって返される構造体として指定します。オプション構造体のこれらのフィールドの値を設定または変更するために、optimset
を使用できます。詳細については、最適化オプションの設定を参照してください。
| 表示レベル (最適化ソルバーの反復表示を参照)。
|
FunValCheck | 目的関数値が有効かどうかをチェックします。 |
| 可能な関数評価の最大回数 (正の整数)。既定値は |
| 可能な反復の最大数 (正の整数)。既定値は |
OutputFcn | 各反復で最適化関数が呼び出すユーザー定義の関数を 1 つか複数指定します (関数ハンドルか関数ハンドルの cell 配列として)。既定の設定はなし ( |
| アルゴリズムを実行しながら、進行中のさまざまな測定値をプロットします。事前定義済みのプロットから選択するか、自身で記述します。関数名、関数ハンドル、または、関数名か関数ハンドルの cell 配列を渡します。既定は
カスタム プロット関数の記述については、「最適化ソルバーのプロット関数」を参照してください。 |
| 関数値の終了許容誤差 (正のスカラー)。既定値は |
|
|
例: options = optimset('Display','iter')
データ型: struct
problem
— 問題の構造体
構造体
問題の構造体。次のフィールドをもつ構造体として指定します。
フィールド名 | 要素 |
---|---|
| 目的関数 |
| x の初期点 |
| 'fminsearch' |
| optimset などによって返されるオプション構造体 |
データ型: struct
出力引数
fval
— 解における目的関数値
実数
解における目的関数値。実数として返されます。一般的に、fval
= fun(x)
です。
exitflag
— fminsearch
の停止理由
整数
fminsearch
の停止理由。整数として返されます。
| 関数が解 |
| 反復回数が |
| アルゴリズムが出力関数により停止しました。 |
output
— 最適化プロセスに関する情報
構造体
最適化プロセスに関する情報。次のフィールドをもつ構造体として返されます。
iterations | 反復回数 |
funcCount | 関数評価の回数 |
algorithm |
|
message | 終了メッセージ |
ヒント
関数
fminsearch
は実数上でのみ最小化します。すなわち、ベクトルまたは配列 x は実数のみで構成され、f(x) は実数のみを返さなければなりません。x が複素数値をもつ場合は、x を実数部と虚数部に分割します。fminsearch
は、微分不可能な問題、または不連続性を伴う問題 (特に解の近傍で不連続でない場合) の求解に使用します。
アルゴリズム
fminsearch
は、Lagarias et al. のシンプレックス探索法[1]を使用します。これは fminunc
(Optimization Toolbox) とは異なり、数値勾配または解析勾配を使用しない直接探索法です。このアルゴリズムは、fminsearch アルゴリズムで詳しく説明されています。このアルゴリズムでは、確実に局所的最小値に収束するとは限りません。
代替機能
アプリ
[最適化] ライブ エディター タスクは、fminsearch
のビジュアル インターフェイスを提供します。
参照
[1] Lagarias, J. C., J. A. Reeds, M. H. Wright, and P. E. Wright. “Convergence Properties of the Nelder-Mead Simplex Method in Low Dimensions.” SIAM Journal of Optimization. Vol. 9, Number 1, 1998, pp. 112–147.
拡張機能
C/C++ コード生成
MATLAB® Coder™ を使用して C および C++ コードを生成します。
C/C++ コード生成の場合:
fminsearch
はDisplay
オプションを無視し、反復表示または終了メッセージを出力しません。解の質をチェックするには、終了フラグを確認します。出力構造体には
algorithm
またはmessage
フィールドが含まれません。fminsearch
はOutputFcn
およびPlotFcns
オプションを無視します。
スレッドベースの環境
MATLAB® の backgroundPool
を使用してバックグラウンドでコードを実行するか、Parallel Computing Toolbox™ の ThreadPool
を使用してコードを高速化します。
この関数はスレッドベースの環境を完全にサポートしています。詳細については、スレッドベースの環境での MATLAB 関数の実行を参照してください。
バージョン履歴
R2006a より前に導入
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)