我想知道如何将 MATLAB 函数 ode45 导出到 python。根据文档应该如下:
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")
结果完全不同,Matlab 返回的维度与 Python 不同。
请您参考如下方法:
如@LutzL 所述,您可以使用较新的 API,solve_ivp .
results = solve_ivp(obj_func, t_span, y0, t_eval = time_series)
如果未指定 t_eval,那么每个时间戳不会有一条记录,这是我假设的大多数情况。
另一个边注是对于 odeint和其他积分器一样,输出数组是 [len(time), len(states)] 形状的 ndarray,但是对于 solve_ivp,输出是一维ndarray(长度等于t_eval)的list(length of state vector)。
所以如果你想要相同的订单,你必须合并它。你可以这样做:
Y =results
merged = np.hstack([i.reshape(-1,1) for i in Y.y])
首先你需要重新整形使它成为一个[n,1]数组,然后水平合并它。 希望这对您有所帮助!
