python - 在 exp() 中使用符号时 sympy 求解器会耗尽内存

标签 python sympy

我正在尝试学习如何使用 sympy,因此我选择了一个简单的问题来尝试。当我尝试使用 Sympy 的求解器求解 e^(-(ln(2)/8) * t) - 10^-6 时,最终我的 repl 因内存不足错误而崩溃。这似乎与它解释 exp() 方法的方式有关,我不太确定我做错了什么。

from math import log as ln
from sympy import exp as e, symbols as sym, solve

t = sym('t')
hl = 8.0197
k = ln(2)/hl #lambda 
expression = e(-k * t) -10**-6

# 10^6 = e^(-k * t)
days = solve(,t)
print(days)

它应该解析到 ~159.5,但正如所指出的,它会导致 repl 崩溃。 “ipython3”由信号 SIGSEGV(地址边界错误)终止

最佳答案

10**-6 是一个可疑的小数字。

因为 float 是 scary ,我们可以使用漂亮、安全的整数来解决与您提出的问题类似的问题:

from math import log as ln
import sympy
from sympy import symbols as sym

t  = sym('t')
hl = 8.0197
k  = 4
expression = sympy.exp(-k * t) - 3

days = sympy.solve(expression,t)
print(days)

这会立即返回:

[log(3**(3/4)/3) + I*pi, log(3**(3/4)/3), log(-3**(3/4)*I/3), log(3**(3/4)*I/3)]

所以我们立即知道问题与 float 的使用有关。事实证明,这是一个known problem在 SymPy 中。请注意,由于方程有四种可能的解,因此处理 float 所需的工作量会增加四倍。

由于使用 float 可能会导致 lost precision ,特别是当数字的动态范围很大时,SymPy 会将浮点输入转换为精确的小数表示形式。这可能会导致非常大的数字,从而减慢计算速度。

解决方案是尽可能避免使用 float ,更一般地说,以符号方式求解方程,然后替换:

from math import log as ln
import sympy
from sympy import symbols as sym

t = sym('t')
k = sym('k')
c = sym('c')
expression = sympy.exp(-k * t) - c

days = sympy.solve(expression,t)
print(days)

这给出:

[log(1/c)/k]

可以使用以下方法进行评估

hl   = 8.0197
kval = ln(2)/hl #lambda 
days[0].subs([(k,kval), (c, 10**-6)])

这给出了

159.845200455409

关于python - 在 exp() 中使用符号时 sympy 求解器会耗尽内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929245/

相关文章:

python - sympy:向量/矩阵重复

python - 为什么在 sympy 中使用无穷大 (oo) 比提供整数上限更快?

python - 有没有办法更新一个包,并递归地更新它使用的所有包?

python - 如果指定输出数量,如何计算 CNN 中的输出维度

python - 从 sympy 获取不定积分

python - 类型错误 : unhashable type: 'dict' in python

python - 简单的 "blurring"数组表示来自第一原理的 python 中的图像

Python:通过 python 运行 Windows CMD 命令,使用 å、ä 和 ö

python - 用 ' 和 - 拆分字符串

Python sympy 在被要求不评估时进行评估