问题 处理由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] 我可以提取这个表达式。然而,这看起来有点像黑客。有更好的方法吗?


12652
2018-03-14 21:47


起源



答案:


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

但在这种情况下,有一个选项 integrate 这会让你忽略收敛条件

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

此外,如果您明确设置了您对变量所知的假设,那么收敛条件通常会自行解决(在这种情况下似乎不会发生任何简单的假设) z,但是)。例如,如果你知道的话 z 是真实的,使用 z = Symbol('z', real=True)。通常假设事物是真实的,甚至更好的,当你知道它将有助于确保收敛。


12
2018-03-15 17:11