std.numeric
このモジュールは、Alexander Stepanov による Standard Template Library の numeric ヘッダの発展途上の移植版です。Author:
Andrei Alexandrescu, Don Clugston
- 関数 f の根を
点 [xn_1, x_n] (根に近いほどよい) から始めて探索する
Secant法 の実装です。Num には
float, double, real を指定できます。
Example:
float f(float x) { return cos(x) - x*x*x; } auto x = secantMethod(&f, 0f, 1f); assert(approxEqual(x, 0.865474));
- 実数関数 f(x) の実数根を囲い込み法 ( bracketing ) によって探索します。
関数 f と、f(a) と f(b) の符号が異なるような区間 [a..b] が与えられると、 その区間内で f(x) の根に最も近い値 x を返します。 区間内に f(x) の根が複数ある場合、どれか一つだけが返されます。 f(x) が NaN を返した場合、この関数も NaN を返します。 それ以外の場合は、 このアルゴリズムが成功することは保証されています。
使用するアルゴリズムは TOMS748 を元にしていて、 可能な限り逆三次補完 (inverse cubic interpolation) を使用し、 それ以外の場合は放物線補間 (parabolic interpolation) またはセカント法 (secant interpolation) を使用します。 TOMS748 と比較すると、この実装は最悪ケースのパフォーマンスを 100倍以上改善し、典型的なケースのパフォーマンスを2倍改善します。 80-bit 実数では、ほとんどの場合 8 ~ 15 回の f(x) の呼び出しで マシン精度いっぱいの精度で根が得られます。最悪ケースでは、 bit数のおおよそ倍の回数の呼び出しが必要です。
References:
"On Enclosing Simple Roots of Nonlinear Equations", G. Alefeld, F.A. Potra, Yixun Shi, Mathematics of Computation 61, pp733-744 (1993). Fortran code available from www.netlib.org as algorithm TOMS478.
- 実数関数 f(x) の実数根を囲い込み法 (bracketing) で探索します。
終了条件を指定することができます。
Params:
f 解析する関数 ax f の根を含むことが保証されている初期区間 の左端 bx f の根を含むことが保証されている初期区間 の右端 fax f(ax) の値 fbx f(bx) の値。(f(ax) と f(bx) は一般的に前もって知ることができます) tolerance 探索打ち切り条件を定義します。 現在の根の下限と上限を受け取ります。 その区間を根として認めるときは true を返します。 可能な最大精度が欲しい場合は、常に false を返すことで実現可能です。
Returns:
二つの区間からなるタプルを返します。最初の2つの要素は、根 x が存在する区間で、 次の2つの要素は、その区間に対応する関数の値です。 正確な根が見つかった場合、最初の2つの要素のどちらも根そのもので、 次の2つの要素は 0 になっています。
