Sympy 替代不适用于真实变量

Sympy substitute does not work with real variables

在 Sympy 中,当符号为实数 (real=True) 时,不会使用 subs() 替换它。 即使 realfalse,它也不起作用。 每当在 symbols() 调用中指定 real 时,替换 subs() 不起作用。 否则,它有效:

import sympy

X = sympy.symbols("X")
print('i', X.subs(  {'X': 1.01}  )) # works

X = sympy.symbols("X", real=True) # `real=` Seems to be the cause of the problem
print('ii', X.subs(  {'X': 2.02}  ))

X = sympy.symbols("X", real=False) # even this
print('iii', X.subs(  {'X': 3.03}  ))

输出:

i 1.01000000000000
ii X
iii X

出于某种原因,我需要指定假设 real=True

我的 sympy.__version__ 是:1.10.1

这种行为是意料之中的:当您调用 .subs({'X': 3.03}) 时,'X' 将被“简化”,即,它将被转换为通用的新符号(没有假设)。

你的情况:

X = sympy.symbols("X", real=False) # even this
print('iii', X.subs(  {'X': 3.03}  ))
# iii X

那是因为X是一个有假设的符号,而'X'将被转换为一个没有假设的符号:它们是不同的符号,即使它们共享名称!

为了更好地理解它,您可以这样做:

x1 = sympy.symbols("x")
x2 = sympy.symbols("x", real=True)
print(x1.equals(x2))
# out: False
print(x1 == x2)
# out: False

当您致电 subs 时,您应该尽可能具体:

X = sympy.symbols("X", real=False) # even this
print('iii', X.subs(  {X: 3.03}  ))
# out: iii 3.03000000000000

请记住,subs 旨在处理由一个或多个符号组成的较大表达式。