Tutte le considerazioni sul moto di un proiettile ma con la presenza dell’aria si presenta una forza che cresce con il quadrato della velocità
![]()

from vpython import *
angolo = 30 # in gradi
theta = radians(angolo) # in radianti
v0 = 50 # in m/s
g = 9.8
x0 = 0
y0 = 0
terreno = box(color = color.orange, size = vector(25, 0.1, 10))
RAGGIO = 0.25
palla = sphere(pos = vector(x0, y0, 0), radius = RAGGIO, make_trail = True)
cannone = cylinder(color = color.yellow, pos = vector(x0, y0, 0),
size = vector(4*RAGGIO, 2*RAGGIO, 2*RAGGIO), opacity = 0.5, )
palla.v = rotate(vector(v0,0,0), theta, vector(0,0,1))
cannone.axis = rotate(cannone.axis, theta, vector(0, 0, 1))
m = 2 # Massa proiettile
c = 0.5 # Costante... resistenza aria
F1 = vector(0, -m*g, 0)
t = 0
dt = 0.01
while(True):
rate(100)
F2 = -c * mag2(palla.v) * palla.v.hat
F = F1+F2
a = F/m
palla.v += a*dt
palla.pos += palla.v*dt
if(palla.pos.y <= 0):
break
t = t+dt
print("Angolo = {}, tempo = {:.2f}, distanza = {:.2f}".format(angolo, t, palla.pos.x))
Si rende necessario
- aumentare la velocità iniziale (10 –> 50)
- diminuire l’alzo del cannone (45° –> 30°)
In particolare
![]()
con
, densità dell’aria
, sezione frontale del proiettile
, coefficiente di resistenza del priettile (dipende dalla forma)
,
, quadrato del modulo della velocità
, stessa direzione ma verso opposto
from vpython import *
angolo = 30 # in gradi
theta = radians(angolo) # in radianti
v0 = 50 # in m/s
g = 9.8
x0 = 0
y0 = 0
terreno = box(color = color.orange, size = vector(25, 0.1, 10))
RAGGIO = 0.25
palla = sphere(pos = vector(x0, y0, 0), radius = RAGGIO, make_trail = True)
cannone = cylinder(color = color.yellow, pos = vector(x0, y0, 0),
size = vector(4*RAGGIO, 2*RAGGIO, 2*RAGGIO), opacity = 0.5, )
palla.v = rotate(vector(v0,0,0), theta, vector(0,0,1))
cannone.axis = rotate(cannone.axis, theta, vector(0, 0, 1))
m = 2 # Massa proiettile
rho = 1.2 # Densità dell'aria
A = 2*pi*RAGGIO # Sezione frontale ...
Cd = 0.5 # Coefficiente di resistenza ...
F1 = vector(0, -m*g, 0)
t = 0
dt = 0.01
while(True):
rate(100)
F2 = -1/2 * rho * A * Cd * mag2(palla.v) * palla.v.hat
F = F1+F2
a = F/m
palla.v += a*dt
palla.pos += palla.v*dt
if(palla.pos.y <= 0):
break
t = t+dt
print("Angolo = {}, tempo = {:.2f}, distanza = {:.2f}".format(angolo, t, palla.pos.x))
Sviluppi?
- Colpire un bersaglio fisso
- Due proiettili contemporaneamente (con un parametro diverso)?