在python中解决ODE

问题描述

在 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)

运气不好。

解决方法

  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 的右边界是非包含的)。
  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)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...