通过降低精度来加速同情解算器?

时间:2012-12-16 03:04:09

标签: python floating-point precision solver sympy

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

4 个答案:

答案 0 :(得分:1)

您可以尝试使用mpmath(使用sympy进行覆盖精度数学运算)。您可以根据需要将precision设置为所需级别。 与sympy的整合是前瞻性的,Advanced Mathematics部分下的示例将帮助您了解其用法。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

使用float而不是double应该将存储减少1/2,并且可能以至少2倍的速度加速 - 从双精度到单精度的移动在你没有做任何非线性或状态时都会有好处。

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

答案 3 :(得分:0)

注意:此解决方案帮助我解决了这个问题。但是,我没有仔细研究过同情的文档。因此,使用这种基于经验的解决方案需要您自担风险,请尽可能改进。

假设我们有以下代码:

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 秒内完成。显然,同情者正在从我的输入中获取精确度,并使用它来设置求解器的精确度。无论如何,我不需要这样的判断。

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

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

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