Интеграция с solve_ivp очень медленная по сравнению с c ++ - PullRequest
0 голосов
/ 05 марта 2019

Для использования жесткой системы решение solve_ivp из scipy.integrate занимает около 3 минут. Интегратор это:

sol = solve_ivp(DC_model,[t0,tf],y0,method='LSODA')

Решение той же системы с помощью c ++ и библиотеки Boost занимает 2.12742 секунды. Это огромная разница. Есть ли способ улучшить время моего скрипта на python?

Полный код:

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import solve_ivp 
import time

def DC_model(t,y):
    T,H,CTL,Den,IL2,FBeta,FGamma,Ml = y

    dT = 0.002 * T * np.log(1e12 / T) - (0.1136 * T * CTL * Ml / (50 + Ml)) * ((0.69 * FBeta + 1e4) / (FBeta + 1e4))
    dH = 1e-4 - 0.005 * H + 10e-2 * Den*(H*(1 - H / 1))
    dC = 1e-4 - 0.01925 * CTL + 0.00004e-2 * IL2*(CTL*(1 - CTL / 1))
    dDen = -0.009625 * Den * CTL
    dI = 1e-2 * H * Den - 1e-7 * CTL * IL2 - 1e-2 * IL2
    dFbeta = 5.57e-6 * T - 6.93 * FBeta
    dFgamma = 1.02e-4 * CTL - 0.102 * FGamma
    dMl = 1.44 + (2.89 * FGamma) / (FGamma + 3.38e5) - 0.0144 * Ml

    return np.array([dT,dH,dC,dDen,dI,dFbeta,dFgamma,dMl])


y0 = [6e4, 0, 0, 0, 0, 0, 0, 0]
t0 = 0.0 
delay = 232
tf = 168 + delay
ef=0.05
start = time.time()
sol = solve_ivp(DC_model,[t0,tf],y0,method='LSODA')

y0 = sol.y[:,-1] + [0, 0, 0, 1e6 * ef, 0, 0, 0, 0]
t0 = tf 
tf = tf + 168   
sol = solve_ivp(DC_model,[t0,tf],y0,method='LSODA')

y0 = sol.y[:,-1] + [0, 0, 0, 1e6 * ef, 0, 0, 0, 0]
t0 = tf 
tf = tf + 168   
sol = solve_ivp(DC_model,[t0,tf],y0,method='LSODA')

y0 = sol.y[:,-1] + [0, 0, 0, 1e6 * ef, 0, 0, 0, 0]
t0 = tf 
tf = 1400   
sol = solve_ivp(DC_model,[t0,tf],y0,method='LSODA')
end = time.time()
print('Solving took: ' + str((end-start)/60) + ' min')
...