sympy如何处理0.5次幂的指数?

3
((gamma-(gamma**2-omega**2)**0.5)*(gamma+(gamma**2-omega**2)**0.5)).simplify()

输出结果为: gamma^2 - (gamma^2 -omega^2)^{1.0} $
然而,我预期的结果应该是omega^2。我知道在sympy文档中,它警告要小心处理浮点数,但我认为整数和2的分数次幂(可以精确表示)是可以的。
以下代码正确地重现了omega^2:
((gamma-(gamma**2-omega**2)**sym.Rational(1,2))*(gamma+(gamma**2-omega**2)**sym.Rational(1,2))).simplify()

为什么第一段代码没有产生预期的结果?
1个回答

6

SymPy认为精确数和非精确数有区别。在这种情况下,像0.51.0这样的浮点数被认为是非精确的,因此x**1.0是否真正等于x或者等于稍微不同的数字比如x**1.00000000000000000000001是不确定的。这是因为浮点数通常来自浮点运算,可能存在舍入误差。在您的示例中,结果为:

In [5]: from sympy import *

In [6]: gamma, omega = symbols('gamma, omega')

In [7]: e = ((gamma-(gamma**2-omega**2)**0.5)*(gamma+(gamma**2-omega**2)**0.5)).simplify()

In [8]: e
Out[8]: 
              1.0
 2   ⎛ 2    2⎞   
γ  - ⎝γ  - ω ⎠ 

如果你想告诉SymPy将1.0视为精确的1,那么你可以使用SymPy的nsimplify函数:

In [9]: nsimplify(e)
Out[9]: 
 2
ω 

非常有启发性的答案,感谢您提供 nsimplify 函数。如果我理解正确,Python 可以准确地表示 0.5,但 "不正确的答案" 是 SymPy 对浮点数预期行为的结果。 - Idieh
2
重点是SymPy通常会拒绝将可能不精确的结果简化为看起来像精确结果的东西。一旦您使用了浮点数,表达式就会带有不精确性,并且应该保持不变,无论像0.51.0这样的特定数字是否可以准确地表示为浮点数。每个浮点数都可以准确地表示为浮点数,但如果它来自浮点运算,则其值可能不是这些运算的真正精确结果。 - Oscar Benjamin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接