C++中不完全Beta函数的对数的准确实现?

计算科学 数值分析 C++ C
2021-12-14 06:28:50

我需要不完整 Beta 函数的对数的准确实现(用于 C/C++):

logB(x,y;α,β)=logxytα1(1t)β1dt

带域α,β>0,0xy1. 我需要这个来避免不完整的 Beta 函数值非常大的溢出。

Boost 和 GSL 提供直接实现B(x,y;α,β)或其正规化版本。这对我不起作用,因为从这些没有办法获得价值logB(x,y;α,β)没有经历我试图避免的大值(或者至少我不知道如何)。

有什么建议吗?

更新: 我发现它R实现了不完整 Beta 函数的对数(参见https://stat.ethz.ch/R-manual/R-patched/library/stats/html/Beta.html)。我可以在 C++ 中使用它吗?它会和原生 C 代码一样快吗?

1个回答

Boost 提供了你需要的所有功能,所以应该足够了。与其使用不完全 beta 函数的直接积分表示,不如使用正则化不完全 beta 函数(参见DLMF 8.17):

B(x,y;a,b)=(Iy(a,b)Ix(a,b))B(a,b).
这边走,Ix(a,b)=B(x;a,b)/B(a,b)将有值[0,1], 以便
logB(x,y;a,b)=log(Iy(a,b)Ix(a,b))+logB(a,b).
更容易计算。这样,假设基础函数稳定,数值不稳定的唯一来源就是减法xy非常接近;在这种情况下,如果出现,直接积分表示可能会起作用。

正则化不完全 beta 函数由ibetaBoost给出,log-Beta 函数可以使用log-gamma 函数计算lgamma,同样在 Boost 中Boost的实现Ix基于论文算法 708: Didonato 和 Morris的不完全 beta 函数比率的有效数字计算。