Sympy代换不适用于实际变量



在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适用于由一个或多个符号组成的较大表达式。

相关内容

最新更新