问题描述
在 MATLAB 中,我将这个颂歌解决为:
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,B)])
sol =solve_ivp(f,np.array([0 100]),y0)
我收到一条错误消息(第 454 行,在 solve_ivp solver = method(fun,t0,y0,tf,vectorized=vectorized,**options))
我也试过:
sol = integrate.odeint(f,y0)
运气不好。
解决方法
-
y(4:6)
在 MATLAB 中不是y(np.arange(4,6))
在 Python 中。- 在 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)