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

lhk*_*lhk 3 python simulation math performance 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

问题是求解方程组(with 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线性方程组,其中系数可能是符号.

有更高效的方法吗?

asm*_*rer 6

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

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

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