MATLAB中的
在MATLAB中,我将此ode求解为:
B = [0 0 -5]';
y0 =[0 -5 0 5 0 0]';
f = @(t,y) [y(4:6); (q/m)*cross(y(4:6),B)];
[t,y] = ode45(f,[0 100],y0);
我一直在阅读以前关于如何在Python中求解ODE以及如何将MATLAB代码与相应的Python代码相匹配的答案,但是,当我尝试将相同的ODE求解为:
f=lambda t,y: np.array([y(np.arange(4,6)),(q/m)*np.cross(y(np.arange(4,6)),B)])
sol =solve_ivp(f, np.array([0 100]), y0)
我收到一条错误消息(第454行,在solve_ivp-solver=方法(fun,t0,y0,tf,矢量化=矢量化,**选项(中(
我也试过:
sol = integrate.odeint(f, np.array([0 100]), y0)
没有任何运气。
y(4:6)
不是Python中的y(np.arange(4,6))
。- 在MATLAB中,
y(4:6)
从数组y
中获取第4到第6个元素 - 在Python中,它应该是
y[3:6]
(方括号;3而不是4,因为Python是0索引的;6而不是5,因为Python的右边界是非包容性的(
- 在MATLAB中,
在MATLAB
f
中,向量是垂直连接的(分号(,因此在Python中,它们应该与vstack()
垂直堆叠。Python列表需要逗号。在
sol
行中,[0 100]
需要是[0, 100]
。
你可能想要这样的东西:
f = lambda t, y: np.vstack([y[3:6], (q/m) * np.cross(y[3:6], B)])
sol = solve_ivp(f, np.array([0, 100]), y0)