在 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
是vector
1d吗?然后 np.transpose(vector)
什么都不做。
为了计算目的你想要
Asparse = sparse.csr_matrix(A)
np.dot(Asparse, vector)
有效吗? np.dot
应该是稀疏的。如果没有,请尝试 Asparse*vector
。这可能会产生一个密集矩阵,因此您可能需要 (Asparse*vector).A1
来产生一维数组。
但请检查时间。 Asparse
需要非常大且非常稀疏才能在点积中比 A
执行得更快。
我正在尝试求解微分方程组
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
是vector
1d吗?然后 np.transpose(vector)
什么都不做。
为了计算目的你想要
Asparse = sparse.csr_matrix(A)
np.dot(Asparse, vector)
有效吗? np.dot
应该是稀疏的。如果没有,请尝试 Asparse*vector
。这可能会产生一个密集矩阵,因此您可能需要 (Asparse*vector).A1
来产生一维数组。
但请检查时间。 Asparse
需要非常大且非常稀疏才能在点积中比 A
执行得更快。