Python中如何实现Tricomi合流超几何函数U的展开?
手动实现Tricomi合流超几何函数U的级数展开
嘿,我懂你的痛点——SymPy确实没有内置Tricomi合流超几何函数U,但咱们完全可以利用它的级数展开式手动实现,轻松拿到你需要的前5-10项展开。下面分两种常见的展开场景给你方案:
1. x→0时的收敛幂级数展开
当|arg x| < π且b ≠ 0, -1, -2, ...时,Tricomi函数U(a,b,x)有如下收敛级数表示:
U(a,b,x) = x^(1-b) * Γ(b-1)/Γ(a) * Σₙ=₀^∞ [(a - b + 1)ₙ (1 - a)ₙ] / [n! (2 - b)ₙ] xⁿ + Γ(1-b)/Γ(a - b + 1) * Σₙ=₀^∞ [(a)ₙ (b - a)ₙ] / [n! (b)ₙ] xⁿ
其中(c)ₙ是Pochhammer符号(上升阶乘),SymPy已经内置了这个符号的实现。
实现代码
from sympy import symbols, gamma, pochhammer, summation, expand # 定义符号变量 a, b, x = symbols('a b x') def tricomi_u_series(a, b, x, num_terms=5): """计算Tricomi函数U(a,b,x)在x→0处的前num_terms项幂级数展开""" # 第一部分级数 coeff1 = x**(1 - b) * gamma(b - 1) / gamma(a) sum1 = summation( pochhammer(a - b + 1, n) * pochhammer(1 - a, n) / (pochhammer(1, n) * pochhammer(2 - b, n)) * x**n, (n, 0, num_terms - 1) ) # 第二部分级数 coeff2 = gamma(1 - b) / gamma(a - b + 1) sum2 = summation( pochhammer(a, n) * pochhammer(b - a, n) / (pochhammer(1, n) * pochhammer(b, n)) * x**n, (n, 0, num_terms - 1) ) # 合并并展开表达式 return expand(coeff1 * sum1 + coeff2 * sum2) # 测试:获取前5项展开 print("前5项展开式:") print(tricomi_u_series(a, b, x, num_terms=5))
运行后就能得到展开后的多项式形式,你可以调整num_terms参数来获取前10项。
2. x→∞时的渐近展开(可选)
如果需要x趋向无穷大时的渐近展开,当|x|→∞且|arg x| < 3π/2时,U(a,b,x)的渐近级数为:
U(a,b,x) ~ x^(-a) * Σₙ=₀^∞ [(a)ₙ (a - b + 1)ₙ] / [n! xⁿ]
对应的实现代码如下:
def tricomi_u_asymptotic(a, b, x, num_terms=5): """计算Tricomi函数U(a,b,x)在x→∞处的前num_terms项渐近展开""" sum_series = summation( pochhammer(a, n) * pochhammer(a - b + 1, n) / (pochhammer(1, n) * x**n), (n, 0, num_terms - 1) ) return expand(x**(-a) * sum_series) # 测试:获取前5项渐近展开 print("\n前5项渐近展开式:") print(tricomi_u_asymptotic(a, b, x, num_terms=5))
注意事项
- 当
b为整数时,上面的收敛级数会因为gamma函数的奇点失效,这时候需要引入对数项修正,如果你需要处理这种特殊情况,可以告诉我,我再补充对应的实现。 - SymPy的
expand()函数会自动简化展开后的表达式,方便你查看每一项的系数。
内容的提问来源于stack exchange,提问作者honeybadger
相关产品推荐
相关产品推荐

