python - SymPy 表达式的 `subs` 方法的 `evalf` 参数到底是做什么用的?像 `s.evalf(subs={...})` 吗?

标签 python numpy sympy

我偶然发现了它,因为它的行为与我预期的不一样。 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/

相关文章:

python - numpy 的 tostring/fromstring --- 我需要指定什么来恢复数组

python - 如何在(Python 的)sympy 中将 float 转换为 int?

python - 中序二叉树遍历(使用Python)

python - FileNotFoundError [Errno 2] 没有这样的文件或目录 :

python - 这种文件锁定方法是否可以接受?

python - 有没有一种有效的方法来生成对称随机矩阵?

python - 如何将 numpy 数组写入 csv 文件?

python - python 中的泰勒级数问题 (sympy)

python 3 : error when dump/load sympy lambdify-epression

python - Sphinx 将段落标签添加到无序列表项