Boost C++ Libraries Home Libraries People FAQ More

PrevUpHomeNext

不完全γ函數反函數

概要

#include <boost/math/special_functions/gamma.hpp>

namespace boost{ namespace math{

template <class T1, class T2>
calculated-result-type gamma_q_inv(T1 a, T2 q);

template <class T1, class T2, class Policy>
calculated-result-type gamma_q_inv(T1 a, T2 q, const Policy&);

template <class T1, class T2>
calculated-result-type gamma_p_inv(T1 a, T2 p);

template <class T1, class T2, class Policy>
calculated-result-type gamma_p_inv(T1 a, T2 p, const Policy&);

template <class T1, class T2>
calculated-result-type gamma_q_inva(T1 x, T2 q);

template <class T1, class T2, class Policy>
calculated-result-type gamma_q_inva(T1 x, T2 q, const Policy&);

template <class T1, class T2>
calculated-result-type gamma_p_inva(T1 x, T2 p);

template <class T1, class T2, class Policy>
calculated-result-type gamma_p_inva(T1 x, T2 p, const Policy&);

}} // namespaces
說明

有4個不完全函數 反函數,它基於給定的a與p或a與q來計算x,或者基於給定的x以及p或q來計算a.

當T1和T2是不同類型的時候,函數的返回值的類型使用函數返回值推導法則 來確定,否則返回值的類型是T1。

最後一個策略 參數是可選的並且可以用來控制函數的行為: 如何處理錯誤, 使用哪種層次的精度等等. 參見策略文檔瞭解更多信息。

[Tip] 提示

當人們談及不完全γ函數的反函數的時候,它們往往是討論關於參數x的反函數。這在這個庫中實現為 gamma_p_inv 和 gamma_q_inv 函數, 也是在這裡出現的所有的反函數中最高效的。

關於參數a 在統計應用中有一定的應用,但是不得不使用相當蠻罰的方法來計算,也因此速度要慢幾倍。這些函數在這個庫中實現為 gamma_p_inva 和 gamma_q_inva 函數.

template <class T1, class T2>
calculated-result-type gamma_q_inv(T1 a, T2 q);

template <class T1, class T2, class Policy>
calculated-result-type gamma_q_inv(T1 a, T2 q, const Policy&);

返回滿足: q = gamma_q(a, x)的x值;

要求: a > 01 >= p,q >= 0.

template <class T1, class T2>
calculated-result-type gamma_p_inv(T1 a, T2 p);

template <class T1, class T2, class Policy>
calculated-result-type gamma_p_inv(T1 a, T2 p, const Policy&);

返回滿足: p = gamma_p(a, x)的x值;

要求: a > 01 >= p,q >= 0.

template <class T1, class T2>
calculated-result-type gamma_q_inva(T1 x, T2 q);

template <class T1, class T2, class Policy>
calculated-result-type gamma_q_inva(T1 x, T2 q, const Policy&);

返回滿足t: q = gamma_q(a, x)的a值;

要求: x > 01 >= p,q >= 0.

template <class T1, class T2>
calculated-result-type gamma_p_inva(T1 x, T2 p);

template <class T1, class T2, class Policy>
calculated-result-type gamma_p_inva(T1 x, T2 p, const Policy&);

返回滿足: p = gamma_p(a, x)的a值;

要求: x > 01 >= p,q >= 0.

精確性

這些函數的精度不會因為平台和類型T而發生太多的變化。考慮到這些函數通過迭代方法來計算,它們被慎重的「解調(detuned)」以使得它們不至於太過於精確:無論如何這些函數都不可以比規則的前向不完全γ函數更精確。實際上,這些函數的精度與函數gamma_p 和函數gamma_q 的精度非常類似.

測試

有兩類測試:

實現

函數 gamma_p_inv 和函數 gamma_q_inv 共享一個通用的實現.

首先使用一個在:

A. R. Didonato and A. H. Morris, Computation of the Incomplete Gamma Function Ratios and their Inverse, ACM Trans. Math. Software 12 (1986), 377-393.

中描述的方法進行初始的逼近計算。

最後,使用 Halley 迭代來清除最後的一些bit, 迭代限制為T中bit數目的2/3, 通過實驗證明,這就中以使得這些反函數的精度到少與精度的不完全γ函數的精度一樣。在測試中,產生一個與前向的不完全γ函數相同的精度所需要的迭代次數不超過3次。並且在大多數的情況下只需要一次迭代。

函數 gamma_p_inva 和函數 gamma_q_inva 也共享一個共同的實現,但與函數 gamma_p_inv 和函數 gamma_q_inv分開處理。

對於a的初始近似的計算非常粗糙以便gamma_p(a, x) ~ 0.5, 這個值然後作為一個通用的導數自由(derivative-free)根查找算法的起始點. 因此,這兩個函數與函數 gamma_p_inv 或 函數gamma_q_inv 相比 的計算開銷更大. 儘管如此,通常使用少於10次的迭代就可以找到這個根。


PrevUpHomeNext