我使用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系数的线性方程组,其系数可能是符号。
有没有更高性能的方法来做到这一点?
如果您希望解决方案具有更高的性能,您还应该提供jacobian来** odeint **。 – mtadd
感谢您的提示。但是对于2摆钟来说,这并不是瓶颈。到目前为止,我还没有达到3行的代码行。 – lhk
你的微分方程对我来说看起来不是线性的。 phi的一些一阶导数项在您的一组方程中平方。 – mtadd