处理由sympy整合返回的分段方程式

时间:2022-09-03 20:21:51

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

同时我有一个积分返回一个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                                                        
⎩    

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?

我想提取这个分段方程的第一个分支,换句话说,我希望能够像itest.parts(0)那样提取简单的sqrt(pi)* z / 2。我似乎无法找到任何方法来做到这一点,但也许我在文档中使用了错误的搜索词。有任何想法吗?

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?

稍微探讨一下,我设法发现如果我执行itest.args [0] [0]我可以提取这个表达式。然而,这看起来有点像黑客。有更好的方法吗?

1 个解决方案

#1


11  

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

通常,使用.args是访问表达式部分的正确方法。

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.

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

#1


11  

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

通常,使用.args是访问表达式部分的正确方法。

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.

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