В вашем штате 4 компонента, поэтому вам нужно 4 склона на каждом этапе.Должно быть очевидно, что наклон / обновление для z
не может быть получен из k1_zdot
, это должно быть k1_z
, которое должно быть вычислено ранее как
k1_z = zdot
и на следующем этапе
k2_z = zdot + dt/2*k1_zdot
и т. Д.
Но лучше использовать векторизованный интерфейс
def derivs(t,u):
z, theta, dz, dtheta = u
ddz = -omega_z * z - epsilon / 2 / m * theta
ddtheta = -omega_theta * theta - epsilon / 2 / I * z
return np.array([dz, dtheta, ddz, ddtheta]);
, а затем использовать стандартные формулы для RK4
i = 0
while True:
# runge_kutta
k1 = derivs(t[i], u[i])
k2 = derivs(t[i] + dt/2, u[i] + dt/2 * k1)
k3 = derivs(t[i] + dt/2, u[i] + dt/2 * k2)
k4 = derivs(t[i] + dt, u[i] + dt * k3)
u.append (u[i] + (k1 + 2*k2 + 2*k3 + k4) * dt / 6)
i += 1
и позже распакуйте как
z, theta, dz, dtheta = np.asarray(u).T