我正在使用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分钟后)。
它是一个耦合的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建议我尝试使用solve。
对于n=3,linsolve大约需要34分钟-我只进行了一次测量。solve
花费31秒(平均分布在3次运行中)。
然而,我相信一个线性的3x3系统应该在几分之一秒内解决。
而对于n=4,solve
也变得难以忍受地缓慢(仍在计算中)。
我已经格式化了代码并创建了一个iPython笔记本:http://nbviewer.jupyter.org/gist/lhk/bec52b222d1d8d28e0d1baf77d545ec5
如果您向下滚动一点,您可以看到方程组的格式化输出,并直接在其下面调用linsolve
这些方程式相当长,但严格是第二个导数的线性形式。 我相信这个系统可以被解决。 我所需要做的就是解决一个3x3的线性方程组,其中系数可能是符号。
有更高效的方法来做这件事吗?
solve
比linsolve
更快。 - asmeurerlinsolve
调用了simplify
,这会导致速度变慢,并且没有办法禁用它。不过,solve
有一个标志可以使用,即simplify=False
。这个能帮到你吗? - asmeurer