我偶然发现了它,因为它的行为与我预期的不一样。 s.evalf(subs={t: 0})
到底是做什么用的?
它似乎既不是 s.evalf().subs({t: 0})
的“快捷方式”,也不是 s.evalf().subs({t: 0})
作为
import sympy
omega, t = sympy.symbols("omega, t")
s = sympy.pi * sympy.cos(omega*t)
# both result in 3.14159265358979
print(s.evalf().subs({t: 0}))
print(s.subs({t: 0}).evalf())
# results in 3.14159265358979*cos(omega*t)
print(s.evalf(subs={t: 0}))
结果
3.14159265358979
3.14159265358979
3.14159265358979*cos(omega*t)
找不到关于此的良好文档。也许有人知道答案?否则我可能需要查看源代码以了解更多...
最佳答案
evalf(subs=...)
试图避免由于天真替换而导致的重要性损失。
例如
>>> (x + y - z).subs({x: 1e100, y: 1, z: 1e100})
0
>>> (x + y - z).evalf(subs={x: 1e100, y: 1, z: 1e100})
1.00000000000000
朴素替换计算 1e100 + 1 - 1e100
,它会丢失 1
,因为默认精度 15 位数字不足以保留该信息。使用 evalf(subs=...)
时,表达式会通过 evalf 算法运行,该算法会小心处理此类可能会丢失重要性的问题。 subs
字典告诉 evalf 算法遇到哪些符号时应将其替换为数字。可以看到the source of evalf.py如果您对细节感兴趣。
关于python - SymPy 表达式的 `subs` 方法的 `evalf` 参数到底是做什么用的?像 `s.evalf(subs={...})` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50439037/