在 ode 求解器中使用 scipy sparse

计算科学 Python 稀疏矩阵 scipy
2021-12-09 18:10:38

我正在尝试求解微分方程系统

x´=Axwith x(0)=f(x)

在 Python 中,A确实是一个复杂的稀疏矩阵。

现在,我一直scipy.integrate.complex_ode在通过以下方式使用该类来解决系统问题。

def to_solver_function(time,vector):
    sendoff = np.dot(A, np.transpose(vector))
    return sendoff

solver = complex_ode(to_solver_function)
solver.set_initial_value(f(x),0)

solution = [f(x)]
for time in time_grid:
    next = solver.integrate(time)
    solution.append(next)

这一直工作正常,但我需要“告诉求解器”我的矩阵是稀疏的。我发现我应该使用

Asparse = sparse.lil_matrix(A)

但是我如何改变我的求解器来处理这个?

1个回答

对于 Scipy 的 ODE 模块,您将它(在您的情况下to_solver_function)作为黑盒提供的函数,它提供状态并返回向量。它不关心里面发生了什么,尤其是它从不接触A.

所以,你唯一需要做的就是确保你的矩阵向量乘法to_solver_function知道你的矩阵的稀疏性。我对 scipy.sparse 不是很熟悉,但是有一段关于此的文档,它告诉我以下内容应该可以完成这项工作:

sendoff = A.dot(vector)

旁注和公然的自我广告:如果你想加快速度,我写了一个围绕 Scipy 的 ODE 的包装器,它可以即时编译衍生品(在你的情况下to_solver_function)以加快速度。鉴于在您的情况下,大部分计算时间应该花在矩阵向量乘法上,并且您已经非常有效地执行此操作,它可能会给您带来同样多的提升。此外,它还不能处理复数,因此您必须手动进行。