2017-03-22 6 views
0

2D関数の最小化のための最急降下アルゴリズムを実装しようとしています。例を挙げて説明しましょう。最急降下アルゴリズムを実装する関数を作成する

私は機能f1(x1,x2) = 2*x1^2 + x2^2 - 5*x1*x2を持っており、最初の推測点p0 = [1,0]で始まります。

ステップ1:初期推定点p0 = [1,0]、収束パラメータe=0.1

ステップ2:p0f1の勾配c1を計算します。 c1=[4,-5]私はそのために中央差分法を使用しています。

ステップ3:ノルムがc1>eの場合はステップ4に進み、そうでない場合は停止します。

手順4:検索の方向はd1 = - c1です。したがって、d1 = [-4,5]

ステップ5:検索のステップサイズaf1(a) = f1(p0 + a*d1) = f1(1-4a,5a)

ステップ6最小限にする:p1に更新p0p1 = p0 + a * d1として、私はMathWorks社のMATLABでこの例を実装しようとしていると知らない2.

をステップにしますどのように5ステップを実装する。私は二分法などの蟻1D検索アルゴリズムが動作することができます知っている。しかし、問題は 'f1(1-4a,5a)'を関数に変換することです。つまり、(1-4a,5a)f1に置き換えます。私はここで象徴的な定数aに遭遇します。それはどう対処するのか分かりません。最小化関数を書くと値を渡すことができますが、記号変数aについてはわかりません。シンボリックや一般的なレベルでのコードの維持など、MATLABの特別な機能を使いたくないので、問題なく他のプログラミング言語に変換することができます。あなたの提案は大歓迎です。

+0

これまでのコードをお見せください。 –

答えて

0

fminbndを使用すると、行全体を検索するのがうまく定義されていないため、行の検索に範囲を指定することができます(-1〜1)。シンボリック変数は必要ありません。ステップサイズは、以下の無名関数を最小化することによって決定される。

a = fminbnd(@(a) f1(p(1) + a*d(1), p(2) + a*d(2)), -1, 1); 

ここで、pは現在のポイントであり、dは検索の方向である。 (私はあなたの説明のようにp1とd1を、第1ステップで使用されているものと同じように呼びたくはありません)。

この例では、グラデーションの示唆とは反対の方向に進む方が良い場合もあります。これを拒否するには、境界を0,1(または順方向のより積極的な検索の場合は0,10)に変更します。

関連する問題