integration API
integration パッケージは、Gauss–Kronrod 求積法により有限区間 上の Func_Math の定積分を計算します。基本的な Gauss–Kronrod 則、区間を分割する適応積分器、そして則の次数を上げていく非適応積分器を提供します。
Gauss–Kronrod 則
kronrod_r15, kronrod_r21, kronrod_r31, kronrod_r41, kronrod_r51, kronrod_r61
各関数は 上で f に Gauss–Kronrod 則を一つ適用します。名前の数字は Kronrod 点の数です。
fn kronrod_r15((Double) -> Double, Double, Double) -> (Double, Double, Double, Double)
fn kronrod_r21((Double) -> Double, Double, Double) -> (Double, Double, Double, Double)
fn kronrod_r31((Double) -> Double, Double, Double) -> (Double, Double, Double, Double)
fn kronrod_r41((Double) -> Double, Double, Double) -> (Double, Double, Double, Double)
fn kronrod_r51((Double) -> Double, Double, Double) -> (Double, Double, Double, Double)
fn kronrod_r61((Double) -> Double, Double, Double) -> (Double, Double, Double, Double)
結果はタプル (result, result_abs, result_asc, error) です。
| 値 | 意味 |
|---|---|
result | f の積分の Kronrod 近似。 |
result_abs | 同じ則を に適用した値。 |
result_asc | 同じ則を に適用した値。 は区間上の f の平均値で、f の変動の大きさを表します。 |
error | Kronrod 近似と埋め込まれた Gauss 近似の差を rescale_error で再スケールしたもの。 |
どの則も basic パッケージの型 Quad_GK を持つので、adap_quad_gk に渡せます。
rescale_error
rescale_error は、二つの求積近似の生の差を保守的な誤差推定に変換します。
fn rescale_error(Double, Double, Double) -> Double
rescale_error(err, result_abs, result_asc) は、両者が非零のとき を にスケールし、 未満の値は返しません。ここで は Double の機械イプシロンです。これは QUADPACK の誤差ヒューリスティックです。
積分器
adap_quad_gk
adap_quad_gk は 上で f を適応的に積分します。総誤差が許容誤差を満たすまで、誤差が最大の部分区間を二等分します。
fn adap_quad_gk((Double) -> Double, ((Double) -> Double, Double, Double) -> (Double, Double, Double, Double), Double, Double, Double, Double, Int) -> Result[(Double, Double, ErrCode), ErrCode]
adap_quad_gk(f, q, a, b, epsabs, epsrel, limit) は各部分区間に則 q(例えば kronrod_r21)を適用します。推定絶対誤差が 以下になると計算は成功で終了します。ここで は現在の積分推定値です。limit は部分区間の最大数です。
成功すると結果は Ok((integral, error, OK))、そうでなければ Err(code) です。
| コード | 原因 |
|---|---|
E_BAD_TOL | epsabs が正でなく、かつ epsrel が機械イプシロンまたは より小さい。 |
E_ROUND | 丸め誤差のため、要求された許容誤差に到達できない。 |
E_SINGULARITY | 部分区間が小さくなりすぎて二等分できない。特異点や激しく振動する被積分関数が疑われます。 |
E_MAX_ITER | 許容誤差に到達する前に limit 個の部分区間を使い切った。 |
non_adap_quad_gk
non_adap_quad_gk は、区間を分割せずに次数を上げていく Gauss–Kronrod 則で 上の f を積分します。
fn non_adap_quad_gk((Double) -> Double, Double, Double, Double, Double) -> Result[(Double, Double, Int), ErrCode]
non_adap_quad_gk(f, a, b, epsabs, epsrel) は 21 点、43 点、87 点の則を順に試し、推定誤差が epsabs 未満、または epsrel と結果の絶対値の積未満になった時点で返ります。結果は Ok((integral, error, neval)) で、neval は使用した関数評価の回数(21、43、87 のいずれか)です。許容誤差が不正な場合は adap_quad_gk と同様に Err(E_BAD_TOL)、87 点の則でも許容誤差に達しない場合は Err(E_FAILED) になります。
// Integrate x^2 from 0 to 1 (exact answer: 1/3)
let f = fn(x) { x * x }
match non_adap_quad_gk(f, 0.0, 1.0, 0.0000000001, 0.0000000001) {
Ok((result, error, neval)) =>
println("Integral: \{result}, Error: \{error}, Evaluations: \{neval}")
Err(code) => println("Integration failed with error: \{code}")
}
エラーコード
ErrCode
ErrCode は積分の結果を表します。
pub(all) enum ErrCode {
OK
E_ROUND
E_SINGULARITY
E_MAX_ITER
E_FAILED
E_BAD_TOL
} derive(Eq)
| コンストラクタ | 意味 |
|---|---|
OK | 積分に成功した。 |
E_ROUND | 予期しない丸め誤差。 |
E_SINGULARITY | 特異点または激しく振動する被積分関数の可能性。 |
E_MAX_ITER | 分割数の上限に達した。 |
E_FAILED | 一般的な失敗。 |
E_BAD_TOL | 不正な許容誤差パラメーター。 |
ErrCode は Eq を実装しているので、結果のコードをコンストラクタと比較できます。