g % 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.

Respuesta :

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

Explanation: