pythonmatlabscipydifferential-equationsode45

Imitate ode45 function from MATLAB in Python


I am wondering how to export MATLAB function ode45 to python. According to the documentation is should be as follows:

 MATLAB:  [t,y]=ode45(@vdp1,[0 20],[2 0]);

 Python:  import numpy as np
          def  vdp1(t,y):
              dydt= np.array([y[1], (1-y[0]**2)*y[1]-y[0]])
              return dydt
          import scipy integrate 
          l=scipy.integrate.ode(vdp1([0,20],[2,0])).set_integrator("dopri5")

The results are completely different, Matlab returns different dimensions than Python.


Solution

  • The interface of integrate.ode is not as intuitive as of a simpler method odeint which, however, does not support choosing an ODE integrator. The main difference is that ode does not run a loop for you; if you need a solution at a bunch of points, you have to say at what points, and compute it one point at a time.

    import numpy as np
    from scipy import integrate
    import matplotlib.pyplot as plt
    
    def vdp1(t, y):
        return np.array([y[1], (1 - y[0]**2)*y[1] - y[0]])
    t0, t1 = 0, 20                # start and end
    t = np.linspace(t0, t1, 100)  # the points of evaluation of solution
    y0 = [2, 0]                   # initial value
    y = np.zeros((len(t), len(y0)))   # array for solution
    y[0, :] = y0
    r = integrate.ode(vdp1).set_integrator("dopri5")  # choice of method
    r.set_initial_value(y0, t0)   # initial values
    for i in range(1, t.size):
       y[i, :] = r.integrate(t[i]) # get one more value, add it to the array
       if not r.successful():
           raise RuntimeError("Could not integrate")
    plt.plot(t, y)
    plt.show()
    

    solution