在 ode 求解器中使用 scipy 稀疏

Use of scipy sparse in ode solver

我正在尝试求解微分方程组

x´=Ax x(0) = f(x)

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

目前我一直在使用 scipy.integrate.complex_ode class 以下列方式求解系统。

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)

这一直工作正常,但我需要 "tell the solver" 我的矩阵是稀疏的。我发现我应该使用

Asparse = sparse.lil_matrix(A)

但是我该如何改变我的解算器来处理它呢?

A 有多大和多稀疏?

看起来A只是这个函数中的一个常量:

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

vector1d吗?然后 np.transpose(vector) 什么都不做。

为了计算目的你想要

Asparse = sparse.csr_matrix(A)

np.dot(Asparse, vector)有效吗? np.dot 应该是稀疏的。如果没有,请尝试 Asparse*vector。这可能会产生一个密集矩阵,因此您可能需要 (Asparse*vector).A1 来产生一维数组。

但请检查时间。 Asparse 需要非常大且非常稀疏才能在点积中比 A 执行得更快。