2016-06-21 99 views
3

我使用sympy来解决一个简单的线性方程组。不好sympy linsolve /解决性能

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

例如:

phi.diff(T)为.diff(T)+披(T)= 0

变得

ddphi +披(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系数的线性方程组,其系数可能是符号。

有没有更高性能的方法来做到这一点?

+0

如果您希望解决方案具有更高的性能,您还应该提供jacobian来** odeint **。 – mtadd

+0

感谢您的提示。但是对于2摆钟来说,这并不是瓶颈。到目前为止,我还没有达到3行的代码行。 – lhk

+1

你的微分方程对我来说看起来不是线性的。 phi的一些一阶导数项在您的一组方程中平方。 – mtadd

回答

5

solve(不linsolve)具有一定的标志,你可以设置它可以使速度更快:

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

有一个在solve文档字符串是rational=False会导致一些方程不是有解因多边形的问题,所以要知道,这是一个潜在的问题发出警告。

+0

善于指出理性的危险。我最初很谨慎 – lhk

+0

如果'rational = False'失败,我相信最糟糕的是,你会从'solve'中得到一个例外。 – asmeurer