处理sympy积分返回的分段方程

18 投票
1 回答
5942 浏览
提问于 2025-04-17 19:09

在sympy这个库里,我有一个积分,它返回了一个分段函数(Piecewise对象),比如说:

In [2]: from sympy.abc import x,y,z

In [3]: test = exp(-x**2/z**2)

In [4]: itest = integrate(test,(x,0,oo))

In [5]: itest
Out[5]: 
⎧   ___                                                   
⎪ ╲╱ π ⋅z       │                 ⎛      1          ⎞│   π
⎪ ───────   for │periodic_argument⎜──────────────, ∞⎟│ ≤ ─
⎪    2          │                 ⎜          2      ⎟│   2
⎪               │                 ⎝polar_lift (z)   ⎠│    
⎪                                                         
⎪∞                                                        
⎪⌠                                                        
⎨⎮    2                                                   
⎪⎮  -x                                                    
⎪⎮  ───                                                   
⎪⎮    2                                                   
⎪⎮   z                                                    
⎪⎮ ℯ    dx                    otherwise                   
⎪⌡                                                        
⎪0                                                        
⎩    

我想提取这个分段方程的第一部分,换句话说,我想做类似于itest.parts(0)的操作,直接提取出sqrt(pi)*z/2。我找不到任何方法来做到这一点,可能是我在文档中用错了搜索词。有没有什么好主意?

编辑

我稍微研究了一下,发现如果我用itest.args[0][0],就可以提取出这个表达式。不过,这感觉有点像是个小技巧。有没有更好的方法呢?

1 个回答

15

一般来说,使用 .args 是访问表达式某部分的正确方法。

不过在这种情况下,有一个 integrate 的选项,可以让你忽略收敛条件。

In [39]: integrate(test, (x, 0, oo), conds='none')
Out[39]:
  ___
╲╱ π ⋅z
───────
   2

另外,如果你明确设置了你对变量的假设,通常收敛条件会自己解决(不过在这个例子中,简单假设 z 的话似乎不太管用)。比如,如果你知道 z 是实数,可以用 z = Symbol('z', real=True) 来表示。通常情况下,当你知道某些东西是实数,或者更好的是正数时,假设它们是这样会大大帮助确保收敛。

撰写回答