私は、最も急勾配の適切な方法を使用して、離散化された関数を最小化しようとしています。これはかなり簡単なはずですが、ローカル最小値からの検索「クライミング」に問題があります。これがMathematicaの私のコードですが、その構文は簡単に理解できます。
x = {some ordered pair as a beginning search point};
h = 0.0000001; (* something rather small *)
lambda = 1;
While[infiniteloop == True,
x1 = x[[1]];
x2 = x[[2]];
x1Gradient = (f[x1-h,x2]-f[x1+h,x2])/(2h);
x2Gradient = (f[x1,x2-h]-f[x1,x2+h])/(2h);
gradient = {x1Gradient,x2Gradient};
(* test if minimum is found by normalizing the gradient*)
If[Sqrt[x1Gradient^2 + x2Gradient^2] > 0.000001,
xNew = x + lambda*g,
Break[];
];
(* either pass xNew or reduce lambda *)
If[f[xNew[[1]],xNew[[2]]] < f[x1,x],
x = xNew,
lambda = lambda/2;
];
];
なぜこれが丘を登るのですか?新しい値が古い値よりも小さいかどうかをテストすることさえあるので、私は困惑しています。そして、私はそれがそうであるときにそれを渡しません!考え?