对 sympy 中的负数感到困惑

Bil*_*Ket 0 python sympy

我正在编写一个脚本,我试图在其中处理出现在 sympy 表达式中的不同数字。为了提取我需要的东西,我使用了类似的东西: isinstance(expr, sympy.numbers.Float),它检查出现在我的表达式中的数字是否是一个浮点数。这适用于大多数数字(浮点数、整数和有理数)。但是,我对负数有一些问题。例如,如果我这样做:

eq = parse_expr("cos(2*a)+cos(0.5*b)")
srepr(eq)
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

Add(cos(Mul(Integer(2), Symbol('a'))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))
Run Code Online (Sandbox Code Playgroud)

这表示我有一个整数 2 和一个浮点数 0.5,这正是我所需要的。但是,如果我这样做:

eq = parse_expr("cos(-2*a)+cos(0.5*b)")
srepr(eq)
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

Add(cos(Mul(Integer(2), Symbol('a'))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))
Run Code Online (Sandbox Code Playgroud)

所以基本上减号被忽略了。为什么会这样,我怎样才能让它保留减号并输出某种形式的东西Integer(-2)而不是Integer(2)

谢谢!

Sio*_*Goh 6

它没有被忽略,它已被简化。回想一下余弦函数是偶函数,即 f(-x)=f(x)。

让我来说明如果它是一个奇怪的函数会发生什么。

>>> from sympy import *
>>> eq = parse_expr("cos(-2*a)+cos(0.5*b)")
>>> srepr(eq)
"Add(cos(Mul(Integer(2), Symbol('a'))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))"
>>> eq = parse_expr("sin(-2*a)+cos(0.5*b)")
>>> srepr(eq)
"Add(Mul(Integer(-1), sin(Mul(Integer(2), Symbol('a')))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))"
Run Code Online (Sandbox Code Playgroud)

在最后一行中,当它是正弦而不是余弦时,我们确实得到 -1。

备注:这是我们将评估参数设置为 False 时的结果。

>>> eq = parse_expr("sin(-2*a)+cos(0.5*b)", evaluate = False)
>>> srepr(eq)
"Add(Mul(Integer(-1), sin(Mul(Integer(-2), Integer(-1), Symbol('a')))), cos(Mul(Float('0.5', precision=53), Symbol('b'))))"
Run Code Online (Sandbox Code Playgroud)