R中超几何函数的计算

机器算法验证 r 超几何分布
2022-03-15 15:37:37

我很难评估2F1(一种,b;C;z)使用hypergeoR 中的包。在我的情况下,值为一种,b,C总是正实数。即便如此,超几何函数对它们的值非常敏感。我不是在寻找极端的精确度;我可以使用 Excel 粗略估计适合我的目的的 Guass 超几何。

对于 R 中的实现,有什么建议可以提供快速、无错误、如果不是超精确的高斯超几何计算具有广泛值的正实数?

编辑:似乎 MATLAB 中的代码比 R 多得多。有什么想法吗?

2个回答

除非您需要为参数或变量的复数值评估高斯超几何函数,否则最好使用 Robin Hankin 的gsl包。

根据我的经验,我还建议仅评估高斯超几何函数的变量值[0,1], 并对中的值使用转换公式]-,0].

library(gsl)
Gauss2F1 <- function(a,b,c,x){
    if(x>=0 & x<1){
        hyperg_2F1(a,b,c,x)
    }else{
            hyperg_2F1(c-a,b,c,1-1/(1-x))/(1-x)^b
        }
}

更新

这是我使用 gmp 包的替代实现(至少,为了好玩)

@Stéphane Laurent 的上述公式很棒。我注意到它有时会NaNabc很大并且z为负数时产生 s——我无法确定精确的条件。在这些情况下,我们可以使用另一个从 Stéphane 的替代表达式开始的超几何变换。它导致了这个替代公式:

library(gsl)
Gauss2F1b <- function(a,b,c,x){
    if(x>=0 & x<1){
        hyperg_2F1(a,b,c,x)
    }else{
        hyperg_2F1(a,c-b,c,1-1/(1-x))/(1-x)^a
    }
}

例如:

> Gauss2F1(80.2,50.1,61.3,-1)
[1] NaN
>
> Gauss2F1b(80.2,50.1,61.3,-1)
[1] 5.498597e-20
>
>
> Gauss2F1(80.2,50.1,61.3,-3)
[1] NaN
> Gauss2F1b(80.2,50.1,61.3,-3)
[1] 5.343807e-38
>
>
> Gauss2F1(80.2,50.1,61.3,-0.4)
[1] NaN
> Gauss2F1b(80.2,50.1,61.3,-0.4)
[1] 3.322785e-10

这三个都同意 Mathematica 的Hypergeometric2F1这个公式似乎也适用于较小的a, b, c请注意,在某些情况下,公式给出NaN而 Stéphane没有给出。最好逐个检查。