Answer:
% Create a program to plot the motion of the ping pong ball with drag.
% The program will take inputs for velocity in m/s and angle of launch.
% note that with a high speed camera I estmated a launch speed for a ping
% pong ball could be 30 m/s.
clear all
close all
clc
velStart=input('input the initial velocity in m/sec: ');
angle=20:5:80;
% convert the degrees into radians so MATLAB likes it
values_angle=angle*pi./180;
rangeAngle=length(values_angle);
hold on
%Lines 1 - 14 are fine
for i=1:rangeAngle
% set initial position and time
x=[];
y=[];
time=[];
vel=velStart;
VelocityX=[];
VelocityY=[];
x(1)=0; % meters
y(1)=.001; % meters
time(1)=0; % seconds
mass=.00247; %kg ping pong ball .00247 Kg
g=-9.8; % m/sec^2
c=0.0005; % coefficient of drag where Re is between 10^3 and 10^5
% so I can load an array for plotting
% start to increment the motion
index=1;
thisAngle=values_angle(i);
velx=vel*cos(thisAngle);
VelocityX(1)=velx;
vely=vel*sin(thisAngle);
VelocityY(1)=vely;
% set a time step
deltaTime=.001; % seconds
height=y(1);
flag=0;
velFinalX = 0;
velFinalY = 0;
%Don't see any issues here
while height>0 % check that the ball has not hit ground yet (1e-3 to speed things up, It hangs because it never leaves this line, check how height is calculated.)
index = index+1;
% *******************************************************
% break velocity into its components
if index == 2
velx = vel*cos(thisAngle);
vely = vel*sin(thisAngle);
else
velx = velFinalX;
vely = velFinalY;
end
% *******************************************************
% *******************************************************
% use an if/else statement to check to see if the ball is moving
% down (negative). If it is, then drag has an opposite sign
% as gravity in the acceleration formula. Otherwise gravity
% and drag have the same sign. Calculate the new acceleration in the y.
if vely < 0
adragy = g + (c*vely.^2)/mass;
velFinalY = vely + adragy.*deltaTime;
else
adragy = g - (c*vely.^2)/mass;
velFinalY = vely + adragy.*deltaTime;
end
% *******************************************************
% *******************************************************
% Now calculate the acceleration in the x .
adragx = (-c*velx.^2)/mass;
% *******************************************************
% *****************************************************
% calculate the new velocity at the end of the time step
% this will have X and Y components, so you need a variable
% for each. One is velFinalX and the other is velFinalY.
velFinalX = velx + adragx.*deltaTime;
% velFinalY = vely + adragy.*deltaTime;
% *******************************************************
% ******************************************************
% Get a new velocity vector and angle given the X and Y
% The velocity is the variable "vel" and angle is "angle"
vel = sqrt(velFinalX.^2 + velFinalY.^2);
angle = atan(velFinalY/velFinalX);
%*******************************************************
% now save my values at this time step
VelocityX(index)=velFinalX;
VelocityY(index)=velFinalY;
% and distance numbers
distX=VelocityX(index).*deltaTime;
distY=VelocityY(index).*deltaTime;
% save distance values
x(index)=x(index-1)+distX;
y(index)=y(index-1)+distY;
height=y(index);
time(index)=time(index-1)+deltaTime;
%lines 105-107 are good
if distY<0&&flag<=1
if height<.25
disp(distY)
fprintf('goal height detected at distance %.2f meters.',x(index));
flag =2;
LandingDistance(i)=x(index);
end
end
end
plot(x,y)
title('distance traveled by ping pong ball in meters')
xlabel('horizontal distance traveled (meters)')
ylabel('vertical distance traveled (meters)')
end
hold off
Step-by-step explanation: