例によって gsl だが、1変数の minimization をやらせてみたら、これが探索範囲の上限下限の他に候補値を入れてやらないといけない。
ところがこれが、たとえば上限下限が a, b で候補値が c とすると、 f(c) が f(a), f(b) の両方より小さくないと気に入らないようで困る。たとえば最小値がレンジの中には確かにあるんだがレンジ境界ギリギリにあったりすると、何も考えずに候補値として (a+b)/2 なんかを突っ込むと f(a) < f(c) < f(b) とかなってくれてあっさりハネられる。
全域嘗めて候補値を探してもいいんだが、そこまでやるくらいならそのついでに最低点を発見できそうだし。っていうか、ライブラリの側でやれ。
で、1番の問題は、こうして候補値が不適当だった時、セットする関数が返り値で notice するのではなく、あっさりライブラリの中でエラーを吐いて abort してくれやがる点だ。
なんでエラーになるのかと二日くらい悩んで debug して、こういうことだということがやっと判ってドキュメント見ると確かに
The value of the function at x must be less than the value of the function at the ends of the interval
とか書いてある…。うーむ、ライブラリの仕様の話だったのか。騙された気分でいっぱいだ。
極値の探索は領域内に2点を、逐次、黄金分割で選んで領域を狭めてゆく
方法が微係数を使わぬ方法では定石であると一関の子供にも教えている。
昔はフィボナッチ数を使ったものだが、今は黄金分割。
フィボナッチ数と黄金分割の間にビネの定理という美しい関係があって、昔、
感心したものだ。それ以来フィボナッチ数には愛着がある。recuyrsiveだし。
最近フィボナッチ数が見直されてきて本も数冊出版されている。
ゼロ点(根)を求めるときは領域内に1点を選ぶ2分法などがあるが、極値の
ときは2点が必要である、と教えている。
結局これは中点・中点…で再起しながら f(c)
Posted by: 黒山羊 at 2004年01月07日 17:16[referer: [an error occurred while processing this directive]]