我很难评估使用hypergeo
R 中的包。在我的情况下,值为,,总是正实数。即便如此,超几何函数对它们的值非常敏感。我不是在寻找极端的精确度;我可以使用 Excel 粗略估计适合我的目的的 Guass 超几何。
对于 R 中的实现,有什么建议可以提供快速、无错误、如果不是超精确的高斯超几何计算具有广泛值的正实数?
编辑:似乎 MATLAB 中的代码比 R 多得多。有什么想法吗?
我很难评估使用hypergeo
R 中的包。在我的情况下,值为,,总是正实数。即便如此,超几何函数对它们的值非常敏感。我不是在寻找极端的精确度;我可以使用 Excel 粗略估计适合我的目的的 Guass 超几何。
对于 R 中的实现,有什么建议可以提供快速、无错误、如果不是超精确的高斯超几何计算具有广泛值的正实数?
编辑:似乎 MATLAB 中的代码比 R 多得多。有什么想法吗?
除非您需要为参数或变量的复数值评估高斯超几何函数,否则最好使用 Robin Hankin 的gsl
包。
根据我的经验,我还建议仅评估高斯超几何函数的变量值, 并对中的值使用转换公式.
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 的上述公式很棒。我注意到它有时会NaN
在a
、b
、c
很大并且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没有给出。最好逐个检查。