9

W sympy mam całkę, która zwraca obiekt Piecewise, np.Radzenie sobie z równań częściowych zwracanych przez sympy integrate

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               
⎩  

chciałbym wyodrębnić tylko pierwszy oddział tego równania odcinkowo, innymi słowy, chciałbym być w stanie zrobić coś takiego itest.parts(0) wyodrębnić po prostu sqrt(pi)*z/2. Nie mogę znaleźć sposobu, aby to zrobić, ale być może używam złych terminów wyszukiwania w dokumentacji. Jakieś pomysły?

Edit

wywiercenie nieco, udało mi się dowiedzieć, że jeśli to zrobię itest.args[0][0] można wyodrębnić ten wyraz. Wydaje się to jednak trochę hackem. Czy istnieje lepsze podejście?

Odpowiedz

10

Ogólnie rzecz biorąc, używanie .args jest poprawnym sposobem uzyskania dostępu do części wyrażenia.

W tym przypadku, choć istnieje możliwość integrate który pozwoli Ci ignorować warunków konwergencji

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

Ponadto, jeśli wyraźnie określone założenia, że ​​wiesz o zmiennych, często warunków konwergencji determinację sami (nie wydaje się, aby w tym przypadku wystąpiły jakiekolwiek proste założenia na z). Na przykład, jeśli wiesz, że z było prawdziwe, użyj z = Symbol('z', real=True). Zwykle zakładając, że rzeczy są prawdziwe, a nawet lepiej pozytywne, gdy wiesz, że to pomoże bardzo w zapewnieniu konwergencji.

Powiązane problemy