不良的同情心解决/解决绩效问题

时间:2016-06-21 20:45:49

标签: python performance math simulation sympy

我正在使用sympy来解决一个简单的线性方程组。

它是一个耦合的ODE,存在变量的时间导数,我需要求解最高导数的方程组。 由于sympy不允许我解决像phi_1.diff(t)这样的陈述,所以我用占位符符号替换了所有衍生物。

例如:

  

phi.diff(t).diff(t)+ phi(t)= 0

变为

  

ddphi + phi(t)= 0

这很好用。解决方案是正确的,我可以模拟系统 - 它是一个钟摆:https://youtu.be/Gc_V2FussNk

问题在于求解方程组(linsolve)需要很长时间。

对于2个方程式,需要2秒钟。 对于3个方程式,它仍然在计算(超过10分钟后)。

编辑: @asmeurer建议我尝试解决问题。 对于n = 3,linsolve花了大约34分钟 - 我只进行了一次测量。 solve需要31秒(平均超过3次)。

尽管如此,我认为线性3x3系统应该在几分之一秒内解决。

对于n = 4 solve变得难以忍受地缓慢(仍然在计算)

我已经格式化了代码并创建了一个iPython笔记本:http://nbviewer.jupyter.org/gist/lhk/bec52b222d1d8d28e0d1baf77d545ec5 如果向下滚动一点,您可以看到方程组的格式化输出,并直接在linsolve

的调用下方

方程式相当长,但在二阶导数中是严格线性的。 我确信这个系统可以解决。 我需要做的就是求解一个3x3线性方程组,其中系数可能是符号。

有更高效的方法吗?

2 个答案:

答案 0 :(得分:5)

solve(不是linsolve)有一些你可以设置的标志,可以让它更快:

  • simplify=False:禁用结果的简化。
  • rational=False:禁用浮动自动转换为有理数。

solve文档字符串中有一条警告rational=False可能导致某些方程由于多边形中的问题而无法解决,因此请注意这是一个潜在的问题。

答案 1 :(得分:0)

我发现,如果在方程式之前运行sp.init_printing(),在jupyter笔记本中求解可能会非常缓慢。我有一个模块“方程式”,可在其中编写方程式并求解它们。

这更快:

import sympy as sp
import equations
sp.init_printing()

除此之外:

import sympy as sp
sp.init_printing()
import equations