为什么 SymPy 不将 (-x**3)**(2/3) 简化为 x**2?
Why does SymPy not simplify (-x**3)**(2/3) to x**2?
我正在尝试使用 SymPy 计算以下积分:
手动计算时,答案是 −½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
默认情况下 returns 主根,而不是真正的根。为避免这种情况,您可以使用 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})
等,产生上述复杂的解决方案。
我正在尝试使用 SymPy 计算以下积分:
手动计算时,答案是 −½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
默认情况下 returns 主根,而不是真正的根。为避免这种情况,您可以使用 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})
等,产生上述复杂的解决方案。