在Sympy中,当符号为实数(real=True
)时,不使用subs()
替换它。即使real
是false
,它也不起作用。每当在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
适用于由一个或多个符号组成的较大表达式。