уравнение:
d^2 r/dt^2 = -c/m (dr/dt)+g
, где r - положение снаряда, c - коэффициент сопротивления, m - масса снаряда, g - ускорение под действием силы тяжести.
Предполагая, что только два измерения в форме компонента, это, конечно, гласит:
d^2 X/dt^2 = -c(dX/dt)= U
d^2 Y/dt^2 = -c/m(dY/dt)+g
, если мы используем методологию, описанную выше, и явно определяем скорости в X И Y как,
U = dX/dt
и
V = dX/dt
, тогда вся связанная система уравнений равна,
dU/dt= -c/m(U)
dV/dt= - c/m(V)+g
dX/dt= U
dY/dt = V
Параметры для этой системы ODE: c = 0,5 кгс ^ - 1, m = 2 кг и g = −9,81 мс ^ -2.
инициализация переменных как (U0, V0, X0, Y0) = (173, 100, 0, 0)
, которая запускает снаряд из начала координат под углом degrees 30 градусов от горизонтали.
как мне написать новую функцию в python, используя rk4 (я хочу знать, как это закодировать), которая реализует систему из четырех ODE выше, которая решает проблему движения двумерного снаряда ....? Пожалуйста, помогите, я очень плохо знаком с ODE и CODING. СПАСИБО
У меня до сих пор есть следующее ... и оно не работает, и я действительно не знаю, что делать для этой конкретной проблемы c, я должен получить график снаряда а также ... может кто-нибудь, пожалуйста, улучшите мой код, пожалуйста, спасибо
import numpy as np
import matplotlib.pyplot as plt
def projectileMotion_V(t, M, g, c):
return -c/M * V0 + g
def projectileMotion_U(t, c, M):
return -c/M * U0
V0 = 100
U0 = 173
ang = 30.0
c = 0.5
dt = 0.1
M = 2.0
g = -9.81
h = 0.1
t = [0]
x = [0]
y = [0]
vx = [V0*np.cos((ang*np.pi)/180)]
vy = [U0*np.sin((ang*np.pi)/180)]
ax = [-(c*V0*np.cos((ang*np.pi)/180))/M]
ay = [g-(c*U0*np.sin((ang*np.pi)/180))/M]
def solveODEsWithR4Method(t, x, y, vx, vy, ax, ay):
t.append(t[0]+dt)
vx.append(vx[0]+dt*ax[0])
vy.append(vy[0]+dt*ay[0])
x.append(x[0]+dt*vx[0])
y.append(y[0]+dt*vy[0])
vel = np.sqrt(vx[0+1]**2 + vy[0+1]**2)
drag = c*vel
ax.append(-(drag*np.cos(ang/180*np.pi))/M)
ay.append(-g-(drag*np.sin(ang/180*np.pi)/M))
return -c/M * V0 + g
fig,ax = plt.subplots()
ax.plot(t, M, g, c)
plt.show()