Использование scipy sparse в решателе оды

Я пытаюсь решить систему дифференциальных уравнений

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

в питоне, где 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)

но как мне изменить мой решатель для работы с этим?


person Amund Jenssen    schedule 28.09.2016    source источник


Ответы (1)


Насколько велика и разрежена 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 для создания массива 1d.

Но проверьте тайминги. Asparse должен быть довольно большим и очень разреженным, чтобы работать быстрее, чем A в скалярном произведении.

person hpaulj    schedule 28.09.2016