Location : Home > Languages > Perl > Package
Title : Math::Brent
Toolbox Logo

名称

 Math::Brent - ブレント法による関数の最適化


概要

use Math::Brent qw(FindMinima BracketMinimum Brent Minimise1D);

my ($x,$y)=Minimise1D($guess,$scale,\&func,$tol,$itmax);
my ($ax,$bx,$cx,$fa,$fb,$fc)=BracketMinimum($ax,$bx,$cx,\&func);
my ($x,$y)=Brent($ax,$bx,$cx,\&func,$tol,$itmax);

説明

 微分を用いない1次元の関数の最小化問題を解くためのブレント法(Brent's method)の実装である。このアルゴリズムは黄金分割法(Golden Section Search)と放物線補間(parabolic interpolation)を用いている。

 メインの関数 Brent は、関数へのリファレンス \&func と3点の座標 $ax, $bx, $cx (ただし $bx$ax とd $cx の間にあり、かつ、 func($bx) の値は func($ax)func($cx)) より小さいものとする)を与えられればブレント法を用いて $tol で指定される精度で計算した最小値を分離する。繰り返し回数の最大値 $itmax はこの探索の回数を特定する。デフォルトは 100 である。最小値の座標と対応する関数値からなる配列を返す。

 関数 BracketMinimum は関数 \&func と異なる初期値 $ax$bx が与えられれば、下降方向へ探索を行い、3点 $ax, $bx, $cx 並びに関数の最小値とそれらの点における関数値を返す。

 関数 Minimise1D は上記2つのルーティンへのインタフェースを提供する。関数 \&func並びに初期値とスケール ($guess,$scale)を与えれば、ブレント法を用いて $tol で指定される精度で計算した最小値を分離する。 繰り返し回数の最大値 $itmax はこの探索の回数を特定する。デフォルトは 100 である。最小値の座標と対応する関数値からなる配列を返す。


使用例

use Math::Brent qw(Minimise1D);
sub func {
   my $x=shift ;
   return $x ? sin($x)/$x: 1;
}
my ($x,$y)=Minimise1D(1,1,\&func,1e-7);
print "Minimum is func($x)=$y\n";

出力は以下のようになる。

Minimum is func(5.236068)=-.165388470697432

変更履歴

 Revision 1.1 1995/12/26 10:06:36 willijar Initial revision


バグ

 何かあれば著者まで。


著者

 John A.R. Williams <J.A.R.Williams@aston.ac.uk>


参考資料

 "Numerical Recipies: The Art of Scientific Computing" W.H. Press, B.P. Flannery, S.A. Teukolsky, W.T. Vetterling. Cambridge University Press. ISBN 0 521 30811 9.


【訳注と解説】

  1. 「1次元の関数」と書いてあるが、要するに1変数の関数の最小化問題のこと。最小化したい関数が微分可能なら導関数を求めて計算したほうが速いこともありうる。ここで用いられているブレント法は導関数を用いない方法である。
  2. もし関数 f(x) について、f(b) が f(a), f(c)(a < b <c) のどちらかより小さければ、f(x)は (a,c) の区間に最小値を持つはずで、順に区間を狭めていってその値を求めるというのが基本方針。詳しくは参考資料にある本を読んでくれい。
Toolbox Logo
Updated : 2006/08/25