可怜的 sympy linsolve/解决性能
Poor sympy linsolve/ solve performance
我正在使用 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 线性方程组,其中系数可能是符号。
有没有更高效的方法来做到这一点?
solve
(不是 linsolve
)有一些可以设置的标志,可以使它更快:
simplify=False
:禁用结果的简化。
rational=False
: 禁用浮点数自动转换为有理数。
solve
文档字符串中有一个警告,rational=False
可能会由于多边形中的问题导致某些方程式无法求解,因此请注意这是一个潜在的问题。
我发现如果你的方程前面有 运行 sp.init_printing() 的话,在 jupyter notebook 中求解会非常慢。我有一个模块 "equations",我可以在其中编写方程式并求解它们。
这个更快:
import sympy as sp
import equations
sp.init_printing()
比这个:
import sympy as sp
sp.init_printing()
import equations
我正在使用 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 线性方程组,其中系数可能是符号。
有没有更高效的方法来做到这一点?
solve
(不是 linsolve
)有一些可以设置的标志,可以使它更快:
simplify=False
:禁用结果的简化。rational=False
: 禁用浮点数自动转换为有理数。
solve
文档字符串中有一个警告,rational=False
可能会由于多边形中的问题导致某些方程式无法求解,因此请注意这是一个潜在的问题。
我发现如果你的方程前面有 运行 sp.init_printing() 的话,在 jupyter notebook 中求解会非常慢。我有一个模块 "equations",我可以在其中编写方程式并求解它们。
这个更快:
import sympy as sp
import equations
sp.init_printing()
比这个:
import sympy as sp
sp.init_printing()
import equations