You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Scipy/Numpy中实现超几何函数1F2?旧实现已弃用

实现超几何函数₁F₂的方法

Scipy旧版本的scipy.special.hyp1f2已被弃用,目前可以通过两种可靠方式实现该函数:

1. 利用广义超几何函数scipy.special.hyper

Scipy的hyper函数支持广义超几何计算,₁F₂是其特例,对应参数格式为hyper([a], [b1, b2], z)。这是最简洁的替代方案,代码如下:

from scipy.special import hyper

def hyp1f2(a, b1, b2, z):
    return hyper([a], [b1, b2], z)

验证示例

比如₁F₂(1; 1, 1; z)等价于指数函数exp(z),可以快速验证:

import numpy as np
z = 0.5
print(hyp1f2(1, 1, 1, z))  # 输出约1.64872
print(np.exp(z))           # 输出约1.64872

2. 手动实现级数展开

如果需要更精细的控制(比如自定义收敛条件),可以基于₁F₂的级数定义手动编写函数。₁F₂的级数形式为:

₁F₂(a; b₁, b₂; z) = Σₙ=0^∞ [(a)ₙ zⁿ] / [(b₁)ₙ (b₂)ₙ n!]

其中(x)ₙ是上升阶乘(Pochhammer符号),可以用scipy.special.poch计算。代码示例:

import numpy as np
from scipy.special import poch, factorial

def hyp1f2(a, b1, b2, z, max_iter=1000, tol=1e-12):
    total = 1.0
    term = 1.0
    n = 0
    while n < max_iter:
        n += 1
        # 计算级数的下一项
        term *= poch(a, n) / (poch(b1, n) * poch(b2, n)) * z / n
        total += term
        # 检查收敛:当项的绝对值小于总和的tol倍时停止
        if abs(term) < tol * abs(total):
            break
    return total

注意事项

  • 当b1或b2为负整数时,级数会因分母为零发散,此时需要结合解析延拓处理,上述代码未包含该逻辑,需根据场景自行补充。
  • 调整max_iter和tol参数可以平衡计算精度与速度。

内容的提问来源于stack exchange,提问作者PabloVD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 13:15:33