簡體   English   中英

為什么 SymPy 不將 (-x**3)**(2/3) 簡化為 x**2?

[英]Why does SymPy not simplify (-x**3)**(2/3) to x**2?

我正在嘗試使用 SymPy 來評估以下積分: $$ \\int_{較低}^{0} $$

手動評估時,答案是 -½ log(28)。

我的工作與 SymPy 匹配,直到我對x整合:

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, 0, 3)) # integrate with respect to x
print(iiz)
# -3*Integral((-x**3)**(2/3)/(x**3 + 1), (x, 0, 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)), (x, 0, 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, 0, 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, -x**3, 0))

In [133]: iiz = iz.integrate((x,0,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, -x**3, 0))

In [139]: iiz = iz.integrate((x,0,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,3,2)*(x**3+1))

In [147]: iz = z.integrate((y, -x**3, 0))

In [148]: iiz = iz.integrate((x,0,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⋅ⅈ

如果我們在z引入一個整數符號k

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

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

二重積分變為:

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

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

並做iiz.subs({k:0})等,產生上述復雜的解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM