ファイルの代わりに無名関数を使った最適化

ドキュメント内 optimize_print.book (Page 104-127)

linprog

M- ファイルの代わりに無名関数を使った最適化

Optimization Toolbox のルーチンは、M-ファイルにより定義された関数と同様に、

無名関数についても最適化を実行します。

コマンドラインで数学関数を表わすには、文字を含む式から inline オブジェクト を作成してください。 たとえば、関数humps の 無名なオブジェクトを作成するこ とができます ( M-ファイル関数 humps.mを参照するにはコマンド type humps を 使用してください )。

fh = @(x)1./((x-0.3).^2 + 0.01) + 1./((x-0.9).^2 + 0.04)-6;

無名関数に対するコンストラクタは、上記の fh のように、関数をコールすると きに使用できる関数ハンドルを返します。関数ハンドルを使用して、関数をコー ルするためには、通常の MATLAB 関数のコーリングシンタックスを使用します。

2.0で無名関数を評価します。

fh(2.0) ans =

-4.8552

また、fh を最適化ルーチンへ渡して、最小化することもできます。

x = fminbnd(fh, 3, 4)

2つ以上の引数をもつ無名関数を作成できます。たとえば、lsqcurvefit を使用 するには、2 つの入力引数 x および xdata を取り込む関数が必要です。

fh = @(x,xdata)sin(x).*xdata +(x.^2).*cos(xdata);

x = pi; xdata = pi*[4;2;3];

fh(x, xdata) ans =

9.8696 9.8696 -9.8696

そして、lsqcurvefitを呼び出してください。

% ydata は存在すると仮定

x = lsqcurvefit(fh,x,xdata,ydata) この方法を使用する例題は、つぎの通りです。

M-ファイルの代わりに無名関数を使った最適化

• 行列方程式

x = fsolve(@(x)x*x*x-[1,2;3,4],ones(2,2))

• 非線形最小二乗問題

x = lsqnonlin(@(x)x*x-[3 5;9 10],eye(2,2))

• 最後に、fgoalattain を使用する別の例題です。 ここで、関数は最適化ルーチ ンに渡す追加引数をもっています。 たとえば、最小化する関数に、追加引数 A,

B および C があると、つぎにより、

A = [-0.5 0 0; 0 -2 10; 0 1 -2];

B = [1 0; -2 2; 0 1];

C = [1 0 0; 0 0 1];

fun = @(x)sort(eig(A+B*x*C));

x = fgoalattain(fun,-ones(2,2),[-5,-3,-1],[5, 3, 1],...

[ ],[ ],[ ],[ ],-4*ones(2),4*ones(2));

fgoalattainのリファレンスのページで述べる問題を解きます。

標準的な問題と対処法

最適化問題は、収束させるために多くの繰り返しを行うため、有限差分勾配計算 における切り捨ておよび丸め誤差などの数値問題に非常に敏感になります。 ま た、多くの最適化問題では、初期推定値が大きな役割を占めます。 良い初期推定 は、実行効率を改善し、しかも極小値ではなく最小値の探索を可能にします。

よりアドバンスな問題については、まず独立変数の数を減らした問題に置き換え て解く、という革新的なアプローチが最も良い解き方です。 一般的に、より低次 の問題の解は、適切なマッピングを行うことによって、より高次の問題の初期推 定値として使用することができます。

最適化の初期の段階において、より簡単な評価関数の使用やあまり厳密でない終 了基準を設定することにより、計算時間を節約することができます。 このような アプローチは、極小値を避けることにより、より良い結果を生じます。

Optimization Toolbox の関数は、多くの分野に適用することができます。 注意して、

これらの関数を使うことにより、最適化問題に付随している色々な制約をうまく クリアすることができます。 標準的でない問題は、適切に変換して取り扱ってく

ださい。 つぎに、標準的な問題について、対応の仕方を表示します。

表 2-2: トラブルシューティング

問題 対処法

解が最小値にならない場合 問題が連続で最小値が1つしか存在しない場合を除き、解が最 小値である保証はありません。 種々の異なる初期値から最適化を 始めることは、最小値を求める手助けになり、また、最小値が 一つしかないことを確認することにもなります。 また、異なった 方法を使うことは、結果の検証にもなります。

関数fminuncがワーニング メッセージを表示し、解の近傍 でゆっくりした収束を示す場合

解析的に決定される勾配が提供できず、終了基準が厳密な場合、

関数 fminuncは勾配計算において、丸め誤差のために解の近傍 でゆっくりした収束を示す場合があります。 終了基準を緩めるこ とにより、収束を速くすることができます。 しかし、精度は低下

します。 中規模アルゴリズムに対して、他のオプションは、有限

差分摂動レベル DiffMinChange 、DiffMaxChange を調整しま

す。 この調整により、勾配計算の精度を増加することができま

す。

標準的な問題と対処法

最適化問題が目的関数 fun 、ま たは、非線形制約関数 nonlcon を計算することが不可能な x の 値を出力する場合

実行不可能な領域に入るときは、独立変数上にある範囲を設定 するか、または f と g に大きな正の値を与えるペナルティ関数 を作成してください。 勾配の計算に対して、ペナルティ関数は滑 らかで、連続にしてください。

最小化する関数が不連続の場合 基本手法の導出は、一階微分、二階微分が連続である関数に基 づいています。 しかし、解の近傍点で不連続が生じない場合に は、うまく実行される場合があります。 一つのオプションを使っ て、関数を平滑にすることができます。 たとえば、目的関数は、

内挿する関数を読み込んで平滑化することができます。

または、中規模アルゴリズムに対して、有限差分パラメータを 使って、小さな不連続部を飛び越えさせるように調整すること ができます。x に対して、摂動レベルをコントロールする変数 DiffMinChange と DiffMaxChangeが有限差分勾配の計算に使わ

れます。 摂動, は、 常につぎの範囲に入ります。

DiffMinChange < Dx < DiffMaxChange. ワーニングメッセージを表示す

る場合

これは、終了基準が厳密な場合や、問題がある独立変数の変化 に非常に敏感な場合に生じます。 これは、差分による勾配計算に おける切り捨てや丸め誤差、多項式補間の中で生じる問題を示 しています。 これらのワーニングは通常、解を求める方向へ向 かっているために無視しても問題になりません。 しかし、ワーニ ングが表示されることは、収束に要する時間が通常より多くな ることを意味しています。 スケーリングにより、感度に関する問 題にうまく対処できる場合があります。

表 2-2: トラブルシューティング (続き)

問題 対処法

∆x

独立変数、 が、整数などの離 散値のみを取る場合

この種の問題は、変数が有限精度の計算法を使って実現される フィルタの係数である場合や独立変数が大量に生産される製品 を表しているような場合に起こります。

Optimization Toolbox の関数は、離散問題を解くために明示的に 用意されていませんが、等価な連続系の問題をまず最初に解く ことによって問題を解くことができる場合があります。 離散変数 を自由に変化できる独立変数から徐々に取り去ります。

離散変数を最近傍の離散値に切り上げたり、切り捨てたりする ことにより、削除します。 離散変数を取り除いた後、残った変数 に対して次数の小さくなった問題を解きます。 次数が低くなった 問題に対して解を求めて他の離散変数を取り除く、すべての離 散変数が取り除かれるまで、このサイクルを繰り返します。

関数 dfildemo は、この手法を使って、固定精度の係数のフィル タがどのように設計されるかを示すデモです。

最小化ルーチンが、無限ループ に入っているか、または、問題 制約を満たさない解を出力する 場合

目的関数(fun)、制約条件 (nonlcon, seminfcon)、あるいは

(funによって計算された)勾配関数が、Inf, NaN, あるいは複素 数値を出力している可能性があります。 最小化ルーチンは、実数 のみを出力することを想定しています。 実数以外のものを出力す ることが、結果を予期せぬものにする原因になっています。 ユー ザが設定する関数にチェックコードを挿入して、実数のみを出 力しているかを確かめてください ( 関数 isfinite を使用してく ださい )。

sqnonlin から期待通りの収束 が得られない場合

明示的に二乗和を作り、それをスカラー量として出力してくだ さい。 関数 lsqnonlin は、内示的に二乗された和を計算された 関数値のベクトル ( または行列 ) を必要とします。

表 2-2: トラブルシューティング (続き)

問題 対処法

x

参考文献

参考文献

[1] Hairer, E., S. P. Norsett, and G. Wanner, Solving Ordinary Differential Equations I - Nonstiff Problems, Springer-Verlag, pp. 183-184.

3

標準的なアルゴリズム

標準的なアルゴリズムでは、Toolboxの中で使われる種々の最適化問題の定式化を紹介し、中規模(つ まり標準的な)アルゴリズムについて記述します。 これらのアルゴリズムは、ロバスト性と繰り返し効 率を考えて選ばれています。 また、問題の定式化の選択 ( たとえば、制約なし、最小二乗、制約付き、ミ ニマックス、多目的、あるいはゴール到達 ) は、考慮する問題および必要な実行効率に依ります。

この章は、つぎの節からなります。

最適化の概要 (p. 3-3) 最適化は、ある方法で最適と定義できる設計パラメータの組み 合わせを求めるものです。 これらのパラメータは、等式による 制約、不等式による制約、またはパラメータの存在範囲による 制約を受けた目的関数を最小化あるいは最大化することによっ て得られます。

制約なしの最適化 (p. 3-4) 制約なしの最適化のために、準Newton法とライン探索法の使 用について記述します。

準Newton法の実行 (p. 3-9) また、関数 fminuncで使われている準Newtonアルゴリズムの

ヘッセ行列の更新とライン探索過程に関する実行の詳細につい て説明します。

最小二乗最適化 (p. 3-16) 非線形最小二乗(LS)最適化の Gauss-Newton 法と

Levenberg-Marquardt 法の使い方について説明します。 また、非

線形最小二乗(LS)最適化ルーチン lsqnonlinとlsqcurvefit で使用されているGauss-Newton 法と Levenberg-Marquardt 法の 実行の詳細について説明します。

連立非線形方程式の解法 (p. 3-22) 非線形方程式システムの解を求めるためのGauss-Newton法,

Newton法およびtrust-region dogleg法の使用について説明しま

す。 また、fsolve関数が使用する Gauss-Newtonおよび

trust-region dogleg法の実行の詳細についても提供します。

ドキュメント内 optimize_print.book (Page 104-127)