Исправление формул движения снаряда в Python

Код выводит график, который далек от того, что можно было бы ожидать от графика движения снаряда. Кроме того, если вы измените номер шага примерно на 2, график ничего не выведет.

import numpy as np
import matplotlib.pyplot as plt

grav = 9.8
airDen = 1.225      # kg/m^3
areaProj = 0.8643   # m^2
v0 = 198.1          # m/s
angle = 60.0   
dragCoef = 0.62     #Approximate value
mass = 15.0         #kg
step = 0.02    #time step in seconds 

t = [0]
vx = [v0*np.cos(angle*np.pi/180)]
vy = [v0*np.sin(angle*np.pi/180)]
x = [0]
y = [0]

dragForce = 0.5*dragCoef*areaProj*(v0**2)*airDen


ax = [-(dragForce*np.cos(angle/180*np.pi))/mass]
ay = [-grav-(dragForce*np.sin(angle/180*np.pi)/mass)]


counter = 0
while(y[counter] >= 0):
    t.append(t[counter]+step)

    vx.append(vx[counter]+step*ax[counter])
    vy.append(vy[counter]+step*ay[counter])

    x.append(x[counter]+step*vx[counter])
    y.append(y[counter]+step*vy[counter])

    vel = np.sqrt(vx[counter+1]**2 + vy[counter+1]**2)
    dragForce = 0.5*dragCoef*areaProj*(vel**2)*airDen

    ax.append(-(dragForce*np.cos(angle/180*np.pi))/mass)
    ay.append(-grav-(dragForce*np.sin(angle/180*np.pi)/mass))

    counter=counter+1

plt.plot(x,y)
plt.ylabel("y (m)")
plt.xlabel("x (m)")

Пример графика


person hero7209    schedule 09.12.2019    source источник


Ответы (1)


Похоже, вы не обновляете свой угол, поэтому вместо достижения нуля vx он ускоряется назад, поскольку думает, что вы все еще едете под начальным углом 60 градусов. Добавление обновленного угла на основе текущего вектора скорости приводит к следующему:

import numpy as np
import matplotlib.pyplot as plt

grav = 9.8
airDen = 1.225      # kg/m^3
areaProj = 0.8643   # m^2
v0 = 198.1          # m/s
angle = 60.0   
dragCoef = 0.62     #Approximate value
mass = 15.0         #kg
step = 0.02    #time step in seconds 

t = [0]
vx = [v0*np.cos(angle*np.pi/180)]
vy = [v0*np.sin(angle*np.pi/180)]
x = [0]
y = [0]

dragForce = 0.5*dragCoef*areaProj*(v0**2)*airDen


ax = [-(dragForce*np.cos(angle/180*np.pi))/mass]
ay = [-grav-(dragForce*np.sin(angle/180*np.pi)/mass)]


counter = 0
while(y[counter] >= 0):
    t.append(t[counter]+step)

    vx.append(vx[counter]+step*ax[counter])
    vy.append(vy[counter]+step*ay[counter])

    x.append(x[counter]+step*vx[counter])
    y.append(y[counter]+step*vy[counter])

    vel = np.sqrt(vx[counter+1]**2 + vy[counter+1]**2)
    dragForce = 0.5*dragCoef*areaProj*(vel**2)*airDen

    angle = np.arctan(vy[counter]/vx[counter]) * (180 / np.pi)

    ax.append(-(dragForce*np.cos(angle/180*np.pi))/mass)
    ay.append(-grav-(dragForce*np.sin(angle/180*np.pi)/mass))

    counter=counter+1


plt.plot(x,y)
plt.ylabel("y (m)")
plt.xlabel("x (m)")

введите описание изображения здесь

person pciunkiewicz    schedule 09.12.2019
comment
Спасибо! Вы случайно не знаете, почему изменение шага на 1 или близкое к 1 изменяет график? - person hero7209; 10.12.2019
comment
Кроме того, учитывая эти числа, я должен видеть диапазон около 3500 м по оси x. Это число достижимо, только если я исключу коэффициент скорости из расчета силы сопротивления. - person hero7209; 10.12.2019
comment
Изменение временного шага делает моделирование более грубым, и для чего-то вроде этого вы должны использовать интегратор ODE или свою собственную схему интеграции. Ознакомьтесь с предложениями SciPy здесь: docs.scipy. org / doc / scipy / reference / created / - person pciunkiewicz; 10.12.2019
comment
Кроме того, если ответ разрешил ваш вопрос, отметьте его как принятый ответ :) - person pciunkiewicz; 10.12.2019