Dealing with piecewise equations returned by sympy

2020-08-09 11:14发布

问题:

In sympy I have an integral which returns a Piecewise object, e.g.

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                                                        
⎩    

I would like to extract just the first branch of this piecewise equation, in other words, I would like to be able to do something like itest.parts(0)to extract simply sqrt(pi)*z/2. I can't seem to find any way to do this, but perhaps I am using the wrong search terms in the documentation. Any ideas?

Edit

Poking around a bit, I've managed to find that if I do itest.args[0][0] I can extract this expression. This seems like a bit of a hack, however. Is there a better approach?

回答1:

In general, using .args is the correct way to access parts of an expression.

In this case, though, there is an option to integrate that will let you ignore convergence conditions

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

Also, if you explicitly set the assumptions that you know on your variables, often the convergence conditions resolve themselves (it doesn't seem to happen in this case for any simple assumptions on z, though). For example, if you knew that z was real, use z = Symbol('z', real=True). Usually assuming that things are real, or even better positive, when you know it will help a lot in ensuring convergence.