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.
As @LutzL mentioned, you can use the newer API, solve_ivp
.
results = solve_ivp(obj_func, t_span, y0, t_eval = time_series)
If t_eval
is not specified, then you won't have one record per one timestamp, which is mostly the cases I assume.
Another side note is that for odeint
and often other integrators, the output array is a ndarray
of a shape of [len(time), len(states)]
, however for solve_ivp
, the output is a list(length of state vector)
of 1-dimension ndarray(which length is equal to t_eval
).
So you have to merge it if you want the same order. You can do so by:
Y =results
merged = np.hstack([i.reshape(-1,1) for i in Y.y])
First you need to reshape to make it a [n,1]
array, and merge it horizontally.
Hope this helps!