在 python 中求解 ODE

Solving ODE in python

在 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,6)),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, np.array([0 100]), y0)

运气不好。

  1. 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' s 右边界是非包容性的)。
  2. 在 MATLAB f 中,向量是垂直连接的(分号),因此在 Python 中它们应该垂直堆叠 vstack()

  3. 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)