1

sympy 中的求解功能需要一些时间才能提出解决方案。是否可以通过降低所需的精度来加快速度(我真的不需要小数点后的 15 位数字!)?

4

4 回答 4

1

您可以尝试使用mpmath(带有 sympy 的覆盖精度数学)。您可以根据需要将精度设置为所需的级别。与 sympy 的集成是直截了当的,高级数学部分下的示例将帮助您了解其用法。

于 2012-12-16T03:58:49.367 回答
1

请注意,打印 15 个小数并不意味着相对误差范围是 10^-15。
我鼓励在切换到单精度浮点数之前分析有效精度。
使用上面建议的任意精度包是检查结果如何更改的好方法:双位数并查看结果如何变化。还要检查输入的细微变化的影响。

于 2012-12-16T12:46:36.170 回答
0

使用 float 而不是 double 应该可以减少 1/2 的存储空间,并且可能会加速至少 2 倍——当你不做任何非线性或状态的事情时,从双精度到单精度会有好处。

其他并行化和算法优化技术也可能有所帮助,具体取决于您何时向我们展示代码。

于 2012-12-16T05:11:06.317 回答
0

注意:这个解决方案帮助我解决了这个问题。但是,我没有仔细研究过 sympy 的文档。所以使用这个基于经验的解决方案需要您自担风险,如果可能,请改进它。


假设我们有以下代码:

import sympy as sp
import time

P = sp.symbols('P')

equation = -sp.log(P/22064) - 10.494012

t0 = time.time()
ans = sp.solve(equation)
t1 = time.time()
calculation_time = t1 - t0
print('Time = %s sec' % calculation_time)

输出:

时间 = 1.6773369312286377 秒

现在这种缓慢的性能是由等式中的10.494012引起的。如果我将其更改为10.494,计算将在不到0.3秒内完成。显然,sympy 正在从我的输入中获取精度,并使用它来设置求解器的精度。无论如何,我不需要这样的洞察力。

所以解决方案是减少我的输入数字percisions;即用有限精度数字替换我的方程式中的所有数字。要自动执行此操作,我使用以下代码:

equation = equation.replace(
                    lambda expr: expr.func == sp.numbers.Float,
                    lambda x: round(x, 3))

(请注意,我已将 sympy 包含为 sp。)

于 2018-03-21T23:23:18.250 回答