Location : Home > Languages > Perl > Package Title : Math::Integral::Romberg |
![]() |
Math::Integral::Romberg - Romberg法で数値積分を行う
use Math::Integral::Romberg 'integral'; $area = integral(\&f, $x1, $x2); # 短形式 $area = integral(\&f, $x1, $x2, $rel_err, $abs_err, $max_split, $min_split); # 長形式 # 長形式で行うことも可能 $Math::Integral::Romberg::rel_err = $rel_err; $Math::Integral::Romberg::abs_err = $abs_err; $Math::Integral::Romberg::max_split = $max_split; $Math::Integral::Romberg::min_split = $min_split; $area = integral(\&f, $x1, $x2);
integral() はシンプソン積分よりも高速なロンバーグ積分(Romberg integration)を用いて f() の数値積分を求める。
パラメータ
$f
積分する関数への参照。
$x1, $x2
積分範囲の上限と下限。&$f(x) は $x1 と $x2 において有限でなければならない
$rel_err
許容可能な相対誤差の最大値。相対誤差及び絶対誤差の推定は 2**(n-1) + 1 箇所における推定値を用いた 2**n + 1 箇所における比較に基づく。
$min_split に到達すれば(下記参照)計算は終了する。相対誤差が $rel_err 以下に、絶対誤差が $abs_err 以下に、または $max_split に到達しても同様である。
指定されなければデフォルト値が 10**-10 である $Math::Integral::Romberg::rel_err を用いる。10**-15 という値は倍精度浮動小数点の精度の限界に近い。
$abs_err
許容可能な絶対誤差の最大値。指定されなければデフォルト値が 10**-20 である $Math::Integral::Romberg::abs_err を用いる。
$max_split
最大、2 ** $max_split + 1 箇所の異なる点の値が f() の積分値を求めるために用いられる。指定されなければデフォルト値が16(65537点に対応)である $Math::Integral::Romberg::max_split が用いられる。
$min_split
少なくとも、2 ** $min_split + 1 箇所の異なる点の値が f() の積分値を求めるために用いられる。指定されなければデフォルト値が5(33点に対応)である $Math::Integral::Romberg::max_split が用いられる。
$Math::Integral::Romberg::return_point_count
デフォルト値は 0。1 に設定されれば、計算値と、計算に用いられた点の数を返す。
$Math::Integral::Romberg::abort
$rel_err にも $abs_err にも到達せずに計算が終了した場合に 1 に設定される。いったん設定されるとそのままであるので、0 に設定しなおす必要がある。
デフォルト値
integral() の長形式を用いると、呼び出しの際に値を変更するには、収束のためのパラメータをパッケージで指定されている変数名(例えば $Math::Integral::Romberg::abs_tol)で呼び出すだけである。
アルゴリズムについて
ロンバーグ積分はサンプル点の数の2倍の箇所における高位の多項近似式を計算に用いている。例えば1点を与えると(2**1 + 1 箇所のサンプル点における計算を行い)、2次の多項近似式を用いる(シンプソン公式ではそう)。5点を与えると(2**5 + 1 箇所のサンプル点における計算を行い)10次の多項近似式を用いる。このことにより滑らかな関数では大幅に精度はよくなるが、そうでない関数では大幅に値が異なることになる。
Eric Boesch, <ebo@notes.dannet.dk>
![]() |
Updated : 2006/07/16 |