微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么SymPy无法将-x ** 3**2/3简化为x ** 2?

如何解决为什么SymPy无法将-x ** 3**2/3简化为x ** 2?

我正在尝试使用SymPy评估以下积分:

$$ \int_{lower}^{0} $$

手工评估时,答案为−½log(28)。

在与x整合之前,我的工作与SymPy相匹配:

x,y = sp.symbols('x y',real=True)
z = 1 / (sp.root(y,3)*(x**3+1))
iz = z.integrate((y,-x**3,0)) # integrate with respect to y
print(iz)
# -3*(-x**3)**(2/3)/(2*(x**3 + 1))
iiz = iz.integrate((x,3)) # integrate with respect to x
print(iiz)
# -3*Integral((-x**3)**(2/3)/(x**3 + 1),(x,3))/2
print(sp.N(iiz))
# 0.833051127543801 - 1.4428868782084*I

看来,抛弃SymPy的是(-x**3)**(2/3)。这应该简化为x**2,但SymPy并不这么认为。手动简化,会得到我手工得到的相同答案:

print( sp.integrate(-3*x**2/(2*(x**3 + 1)),3)) )
# -log(28)/2

有没有更好的方法解决这个问题?

解决方法

您的问题是sympy.root默认返回主根,而不是实根。为避免这种情况,可以使用sympy.root的第三个可选参数来指定您想要真实的根。以下将产生所需的结果:

import sympy as sp

x,y = sp.symbols('x y',real=True)
z = 1 / (sp.root(y,3,1)*(x**3+1))
iz = z.integrate((y,-x**3,0))
iiz = iz.integrate((x,3))
print(iiz)
# -log(28)/2

为解决您的名义问题,(-x**3)**(2/3)实际上是(-x**3)**0.666666666666667,因为那是您在Python上所拥有的分数。要更接近您想要的东西,您需要做:

import sympy as sp
x = sp.symbols('x',positive=True)
solution = (-x**3)**sp.Rational(2,3)
print(solution)
# (-1)**(2/3)*x**2

通常,除非您确实需要在所有多重解决方案,复杂性等方面考虑到理性力量,否则我建议避免使用理性力量。

,

在我的isympy会话中:SymPy 1.6.2

In [131]: z = 1 / (root(y,3)*(x**3+1))

In [132]: iz = z.integrate((y,0))

In [133]: iiz = iz.integrate((x,3))

In [134]: iiz
Out[134]: 
     2/3         
-(-1)   ⋅log(28) 
─────────────────
        2        

In [135]: N(iiz)
Out[135]: 0.833051127543801 - 1.4428868782084⋅ⅈ

In [136]: abs(iiz)
Out[136]: 
log(28)
───────
   2   

root文档讨论返回主根,除了提供k参数外,建议使用real_root

In [137]: z = 1 / (real_root(y,3)*(x**3+1))

In [138]: iz = z.integrate((y,0))

In [139]: iiz = iz.integrate((x,3))

In [140]: iiz
Out[140]: 
-log(28) 
─────────
    2    

In [141]: N(iiz)
Out[141]: -1.66610225508760

因此,很明显,双积分具有多种解决方案,具体取决于根。看起来它们都具有相同的大小。听起来很合理,但是我的数学研究很遥远,所以我无法提供理论依据。

并通过k=2得到第三个解决方案:

In [146]: z = 1 / (root(y,2)*(x**3+1))

In [147]: iz = z.integrate((y,0))

In [148]: iiz = iz.integrate((x,3))

    In [149]: iiz
    Out[149]: 
    3 ____        
    ╲╱ -1 ⋅log(28)
    ──────────────
          2     

因此,在复平面中有3个解,它们的乘数-1,(-1)**(1/3),-(-1)**(2/3)和幅度相同。

-1.66610225508760
0.833051127543801 - 1.4428868782084⋅ⅈ
0.833051127543801 + 1.4428868782084⋅ⅈ

如果我们在k中引入整数符号z

In [158]: z = 1 / (root(y,k)*(x**3+1))

In [159]: z
Out[159]: 
      -2⋅k    
      ─────   
        3     
  (-1)        
──────────────
3 ___ ⎛ 3    ⎞
╲╱ y ⋅⎝x  + 1⎠

双积分变为:

In [164]: iiz =z.integrate((y,0)).integrate((x,3))

In [165]: iiz
Out[165]: 
             -2⋅k          
             ─────         
     2/3       3           
-(-1)   ⋅(-1)     ⋅log(28) 
───────────────────────────
             2             

并进行iiz.subs({k:0})等操作,会产生上述复杂的解决方案。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。