Работа с кусочными уравнениями, возвращаемыми sympy Integrate

В sympy у меня есть интеграл, который возвращает кусочный объект, например.

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)


В общем, использование .args - это правильный способ доступа к частям выражения.

Однако в этом случае есть опция integrate, которая позволит вам игнорировать условия сходимости.

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

Кроме того, если вы явно устанавливаете предположения, которые вы знаете о своих переменных, часто условия сходимости разрешаются сами собой (хотя, похоже, в этом случае этого не происходит для каких-либо простых предположений о z). Например, если вы знали, что z было реальным, используйте z = Symbol('z', real=True). Обычно предполагая, что вещи реальны, или даже лучше положительные, когда вы знаете, что это очень помогает в обеспечении конвергенции.

person asmeurer    schedule 15.03.2013