求助:用SymPy 1.14实现不完全Gamma函数的符号化Pade逼近
获取不完全Gamma函数组合的符号Pade逼近(SymPy 1.14)
步骤1:定义符号与原函数
首先导入SymPy并定义符号s,写出目标函数:
import sympy as sp s = sp.symbols('s') # 定义原函数 fs = sp.Rational(3,2)*(s**sp.Rational(3,2))*sp.exp(s)*sp.uppergamma(-sp.Rational(3,2), s)
步骤2:化简原函数(可选但推荐)
原函数包含上不完全Gamma函数,可通过SymPy化简为初等函数组合,便于后续处理:
fs_simplified = sp.simplify(fs) print(fs_simplified) # 输出:3*sqrt(s)*(s + 1)*exp(s)*erfc(sqrt(s)) + sqrt(pi)*(2*s + 3)*sqrt(s)
步骤3:构造泰勒展开式
由于原函数包含s^(3/2)项,直接展开会得到分数幂级数,可通过两种方式处理:
方式A:分离分数幂项
将原函数拆分为s^(1/2)乘以解析函数h(s),对h(s)展开:
# 分离出sqrt(s),得到解析函数h(s) h = sp.expand(fs / s**sp.Rational(1,2)) # 求h(s)在s=0处的泰勒展开(保留到s^3项) series_h = h.series(s, 0, 4).removeO() print(series_h)
方式B:变量替换为整数幂
令t = sqrt(s),将原函数转换为t的整数幂级数:
t = sp.symbols('t') fs_t = fs.subs(s, t**2) # 求fs_t在t=0处的泰勒展开(保留到t^6项,对应原函数的s^3项) series_fs_t = fs_t.series(t, 0, 7).removeO() print(series_fs_t)
步骤4:生成Pade逼近
使用SymPy的pade()函数,传入泰勒展开式和分子/分母的次数,得到符号形式的Pade逼近:
基于方式A的实现
# 生成h(s)的Pade逼近(分子2次,分母2次) p_h, q_h = sp.pade(series_h, 2, 2) # 还原原函数的Pade逼近 pade_fs = sp.simplify(s**sp.Rational(1,2) * p_h / q_h) print(pade_fs)
基于方式B的实现
# 生成fs_t的Pade逼近(分子3次,分母3次) p_t, q_t = sp.pade(series_fs_t, 3, 3) # 替换回s,得到原函数的Pade逼近 pade_fs = sp.simplify((p_t / q_t).subs(t, sp.sqrt(s))) print(pade_fs)
注意事项
- 分子/分母的次数可根据精度需求调整,次数越高逼近精度越好,但表达式也会更复杂。
- SymPy 1.14的
pade()函数支持处理分数幂级数,但变量替换为整数幂的方式更稳妥,避免潜在的解析问题。
内容的提问来源于stack exchange,提问作者Pankit Chahal
相关产品推荐
相关产品推荐

