具有特定复参数的实值汇合超几何函数的评估

计算科学 C++ C 特殊功能
2021-12-20 17:00:47

在我的 C++ 代码中,我需要评估融合的超几何函数1F1(a,b;z)在特殊情况下具有复杂的参数。更准确地说,我必须计算

eiϕ1F1(+1+iZ,2(+1),2iϕ),
在哪里Z,ϕ是实参数和0是一个整数。我知道这个表达是纯粹的真实的(但我无法再找到这个的参考......)。

我的问题是1F1(a,b;z)boost并且只接受真正gls论点。

  • 您对如何在 C++ 中评估上述表达式有任何想法吗?
  • 既然我们知道上面的表达式计算为实数值,是否有一个技巧,允许使用boostorgls实现?

我尝试使用积分表示1F1(a,b;z)并执行数值积分,但这仅适用于小参数。

提前感谢您的帮助!

2个回答

如果采用幂级数路线,Kummer 函数可以表示为:

M(a,b,z)=Γ(b)s=0(a)sΓ(b+s)s!zs

(见https://dlmf.nist.gov/13.2

复变量仅出现在zs可以使用 std::pow(std::complex) 进行评估:https ://en.cppreference.com/w/cpp/numeric/complex/pow 。

关于评估这些功能的不那么天真的方法有很多论文。但是基本的方法应该给你一个好的开始。

同时,我自己找到了解决方案,以防其他人偶然发现这个问题,我想分享一下。

发布此问题后不久,我发现我要评估的表达式类型以Coulomb wave functions的名称命名。通常,为问题找到合适的术语可能是解决问题的一半。

库仑波函数在GSL中实现,但参数仅限于某些域。C 库arb也有一个实现,适用于更广泛的参数。但它也较慢。所以我最终得到了 GSL 和 arb 的以下组合。

#include "arb_hypgeom.h"
#include <gsl/gsl_sf_coulomb.h>

double Coulomb_Wave_ARB(int L, double eta, double rho)
{
    double result;
    slong prec;
    arb_t F, l, eta_2, rho_2;
    arb_init(F);
    arb_init(l);
    arb_init(eta_2);
    arb_init(rho_2);
    arb_set_d(l, L);
    arb_set_d(eta_2, eta);
    arb_set_d(rho_2, rho);
    for(prec = 80;; prec *= 2)
    {
        arb_hypgeom_coulomb(F, NULL, l, eta_2, rho_2, prec);
        if(arb_rel_accuracy_bits(F) >= 53)
        {
            result = arf_get_d(arb_midref(F), ARF_RND_NEAR);
            break;
        }
        else if(prec > 10000)
        {
            result = NAN;
            break;
        }
    }
    arb_clear(F);
    arb_clear(eta_2);
    arb_clear(rho_2);
    arb_clear(l);
    return result;
}

double Coulomb_Wave_GSL(int L, double eta, double rho, int& status)
{
    double fc_array[1];
    double F_exponent[1];
    status = gsl_sf_coulomb_wave_F_array(L, 0, eta, rho, fc_array, F_exponent);
    return fc_array[0];
}

double Coulomb_Wave(int L, double eta, double rho)
{
    int status;
    double cw = Coulomb_Wave_GSL(L, eta, rho, status);
    if(status != 0 || std::isnan(cw))
        cw = Coulomb_Wave_ARB(L, eta, rho);
    return cw;
}

感谢大家的回复和投入!