Projectile Motion
A projectile is a point-mass whose motion is dependent only on its initial position, its initial velocity, and the force of gravity. Galileo was the first to study the motion of projectiles, and in modern notation, Galileo's fundamental insight was that a projectile moving near the earth's surface has a constant acceleration.
Indeed, if a denotes the acceleration of the projectile, then near the earth's surface we have
a
= < 0, 0, -32
>
Thus, given an initial position and an initial velocity, we can use integration to determine the path of the projectile. First, however, let's define a procedure that will evaluate a vector or a list term by term.
>
vec_int:=proc(alist,varibe) #A list of expressions in t
local vec;
if (type(alist,'vector') or type(alist,'list')) then
if(type(alist,'vector')) then
vec:=vector([seq(int(alist[i],varibe),i=1..vectdim(alist))]):
else
vec:=[seq(int(alist[i],varibe),i=1..nops(alist))]:
end if:
else
vec:="Not a list or vector of expressions in t":
end if:
vec
end proc:
>
Let's look at an example. Let's suppose that a projectile moving near the earth's surface has an initial position and an initial velocity, respectively, of
r
0 =
and
v
0 =
Let's use this information to determine the path of the projectile. First, we define our given vectors.
>
a:=[0,0,-32]; # Acceleration
v0:=[16,16,64]; #Initial Velocity
r0:=[0,0,6]; #Initial Position
>
Then we use our procedure "vec_int" to find the velocity and position of the projectile.
>
v:=vec_int(a,t)+v0;
r:=vec_int(v,t)+r0;
>
The "spacecurve" command can then be used to plot the motion of the projectile.
> spacecurve(r,t=0..4,color=black,axes=normal,thickness=2,orientation=[15,60]);
>
Let's notice that the motion of the projectile is in a vertical plane . Let's determine the equation of that plane. To do so, we use the fact that the velocity and the acceleration vectors are always in the plane of motion.
In particular, the cross product of v 0 and a is normal to the plane, and the point r 0 is in the plane.
>
n:=crossprod(a,v0); #Normal to the plane
n[1]*(x-r0[1])+n[2]*(y-r0[2])+n[3]*(z-r0[3])=0;
y:=solve(%,y);
>
Now let's animate the curve, the velocity, and the acceleration vector as they move through the plane.
>
p1:=spacecurve(r,t=0..4,color=grey,thickness=1,axes=normal,orientation=[15,60]):
p2:=plot3d([x,y,z],x=0..70,z=0..100,color=cyan,grid=[2,2]):
for i from 1 to 20 do
tnow:=4*i/20.0: #Current time
rnow:=subs(t=tnow,r): #Current Position
vnow:=subs(t=tnow,v): #Current Velocity
nnow:=convert(n,'list')/24: #Scale normal vector by 24
rpv:=rnow+1.1*vnow: #These are for placing labels
rpa:=rnow+1.1*a: #on the vectors
rpn:=rnow+1.1*nnow:
temp1:=spacecurve(r,t=0..tnow,color=blue,thickness=3):
temp2:=plots[arrow](rnow,vector(vnow),color=red):
temp2t:=textplot3d([rpv[1],rpv[2],rpv[3],"v"],font=[TIMES,BOLD,14],color=red):
temp3:=plots[arrow](rnow,vector(a),color=black):
temp3t:=textplot3d([rpa[1],rpa[2],rpa[3],"a"],font=[TIMES,BOLD,14],color=black):
temp4:=plots[arrow](rnow,vector(nnow),color=green):
temp4t:=textplot3d([rpn[1],rpn[2],rpn[3],"n"],font=[TIMES,BOLD,14],color=green):
titlestring:=cat("t=",convert(tnow,string)):
pp[i]:=display(temp1,temp2,temp2t,temp3,temp3t,temp4,temp4t,title=titlestring):
end do:
scene:=display(p1,p2):
motion:=display(seq(pp[i],i=1..20),insequence=true):
display(scene,motion,view=[0..80,0..80,-20..100]);
>
Moreover, if
r
(
t
) =
, then the
range
of the projectile is the length of
r
(
t
) when
z
(
t
) = 0, and the
maximum height
of the projectile is the maximum of
z
(
t
).
We will explore these ideas more closely in the exercises.