【发布时间】:2020-09-11 19:53:16
【问题描述】:
手动评估时,答案是 −½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, 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
有没有更好的方法来解决这个问题?
【问题讨论】:
-
我快速浏览了docs.sympy.org/latest/tutorial/simplification.html#powers 默认情况下未执行的简化,但不幸的是它们都没有改变任何东西。您可能应该在github上查询github.com/sympy/sympy/issues
-
abs()匹配。iiz有一个(-1)**(2/3)术语,这使得结果复杂。 -
@hpaulj 关于
abs()的观察真的很有趣。这是否意味着-log(28)/2和0.833051127543801 - 1.4428868782084*I都是有效答案,因为它们在复平面中与原点的距离相同? -
@nvi:虽然 −½log(28) 和 0.83 − 1.44i 是正确答案,但这并不是因为它们具有相同的绝对值(到原点的距离)。它只是来自这个特定方程的特殊属性的必需属性。具有该属性的数字有无数个,其中最多三个是解(取决于方程式中 ^⅓ 的定义,是否允许复杂的解等等)。此外,对于其他问题,解决方案可能具有不同的绝对值。