【问题标题】:Efficient way to compute the confluent Hypergeometric function for large arrays (~ 10^8 points) with complex parameters计算具有复杂参数的大型阵列(~ 10^8 点)的合流超几何函数的有效方法
【发布时间】:2023-02-10 02:45:05
【问题描述】:

我正在从事与引力透镜有关的项目,为此我需要评估长度为 ~ 10^8 个复点的数组 z 的合流超几何函数 1F1(a,b,z),a = 1+0.48jb = 1。我正在寻找一种有效的方法来评估大数组大小。 scipy implementation 速度很快,但不接受 a 和 b 的复杂参数。

数学似乎是为复杂参数计算 1F1 的最佳方法,但 mpmath.hyp1f1 不接受数组值。我找到的最佳解决方法是使用 np.vectorizenp.frompyfunc 以允许将 NumPy 数组作为参数传递。但是,这非常慢并且需要数天才能执行(即使安装了 gmpy2)。我假设这是因为 mpmath 函数在大数组大小上总是很慢。

非 python 实现也可以,只要我能以某种方式将结果保存在磁盘上并将其读入我的 python 代码。我见过一些可能有效的实现(例如https://www.math.ucla.edu/~mason/research/pearson_final.pdf),但我不确定。

另一种可能的方法是插入函数 (我的输入数组中的连续点非常接近)但我不确定最好的方法是什么。

谢谢!

【问题讨论】:

  • 幼稚的问题,但是您能否将“SciPy 实现”分解为实部和虚部并将其作为a+ib 形式的函数进行评估?这样输入都是实数,而输出可以重新组合成一个复数数组。
  • 10^8 复数点的最大幅度是多少?

标签: python arrays scipy mpmath


【解决方案1】:

我刚刚发现 mpmath 有一组“隐藏”的函数(仅)具有浮点精度,可以通过编写 fp.前期。这对于 hyp1f1 不存在,但对于更一般的 hyper。这意味着 mpmath 包中有一个 fp.hyper,它与 fp.hyper([a],[b],z) 等价于 hyper1f1(a,b,z) 并且速度快得多。 免责声明:我收到一条错误消息,指出在评估时通过删除虚部将某些复数转换为实数,但到目前为止,我得到的结果似乎是合理的并且与 hyper1f1(a,b,z) 值兼容。 但因此使用风险自负。

【讨论】:

    猜你喜欢
    • 2020-04-24
    • 2021-12-13
    • 1970-01-01
    • 2021-12-20
    • 2015-02-01
    • 2018-09-18
    • 2020-12-21
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多