Integrate stiff ODEs with Python

前端 未结 4 1576
深忆病人
深忆病人 2020-12-13 15:18

I\'m looking for a good library that will integrate stiff ODEs in Python. The issue is, scipy\'s odeint gives me good solutions sometimes, but the slightest change

相关标签:
4条回答
  • 2020-12-13 15:20

    PyDSTool wraps the Radau solver, which is an excellent implicit stiff integrator. This has more setup than odeint, but a lot less than PyGSL. The greatest benefit is that your RHS function is specified as a string (typically, although you can build a system using symbolic manipulations) and is converted into C, so there are no slow python callbacks and the whole thing will be very fast.

    0 讨论(0)
  • 2020-12-13 15:30

    Python can call C. The industry standard is LSODE in ODEPACK. It is public-domain. You can download the C version. These solvers are extremely tricky, so it's best to use some well-tested code.

    Added: Be sure you really have a stiff system, i.e. if the rates (eigenvalues) differ by more than 2 or 3 orders of magnitude. Also, if the system is stiff, but you are only looking for a steady-state solution, these solvers give you the option of solving some of the equations algebraically. Otherwise, a good Runge-Kutta solver like DVERK will be a good, and much simpler, solution.

    Added here because it would not fit in a comment: This is from the DLSODE header doc:

    C     T     :INOUT  Value of the independent variable.  On return it
    C                   will be the current value of t (normally TOUT).
    C
    C     TOUT  :IN     Next point where output is desired (.NE. T).
    

    Also, yes Michaelis-Menten kinetics is nonlinear. The Aitken acceleration works with it, though. (If you want a short explanation, first consider the simple case of Y being a scalar. You run the system to get 3 Y(T) points. Fit an exponential curve through them (simple algebra). Then set Y to the asymptote and repeat. Now just generalize to Y being a vector. Assume the 3 points are in a plane - it's OK if they're not.) Besides, unless you have a forcing function (like a constant IV drip), the MM elimination will decay away and the system will approach linearity. Hope that helps.

    0 讨论(0)
  • 2020-12-13 15:38

    If you can solve your problem with Matlab's ode15s, you should be able to solve it with the vode solver of scipy. To simulate ode15s, I use the following settings:

    ode15s = scipy.integrate.ode(f)
    ode15s.set_integrator('vode', method='bdf', order=15, nsteps=3000)
    ode15s.set_initial_value(u0, t0)
    

    and then you can happily solve your problem with ode15s.integrate(t_final). It should work pretty well on a stiff problem.

    (See also http://www.scipy.org/NumPy_for_Matlab_Users)

    0 讨论(0)
  • 2020-12-13 15:39

    I am currently studying a bit of ODE and its solvers, so your question is very interesting to me...

    From what I have heard and read, for stiff problems the right way to go is to choose an implicit method as a step function (correct me if I am wrong, I am still learning the misteries of ODE solvers). I cannot cite you where I read this, because I don't remember, but here is a thread from gsl-help where a similar question was asked.

    So, in short, seems like the bsimp method is worth taking a shot, although it requires a jacobian function. If you cannot calculate the Jacobian, I will try with rk2imp, rk4imp, or any of the gear methods.

    0 讨论(0)
提交回复
热议问题