📄 balle.f
字号:
! balle - Program to compute the trajectory of a baseball! using the Euler method. program balle integer*4 MAXmaxStep parameter( MAXmaxStep = 100000 ) integer*4 iStep, maxStep, i real*8 y1, speed, theta, pi, airFlag, rho, Cd, area, grav, mass real*8 air_const, tau, t, normV real*8 r1(2), v1(2), r(2), v(2), accel(2) real*8 xplot(MAXmaxStep), yplot(MAXmaxStep) real*8 xNoAir(MAXmaxStep), yNoAir(MAXmaxStep) !* Set initial position and velocity of the baseball write(*,*) 'Enter initial height (meters): ' read(*,*) y1 r1(1) = 0 ! Initial vector position r1(2) = y1 write(*,*) 'Enter initial speed (m/s): ' read(*,*) speed write(*,*) 'Enter initial angle (degrees): ' read(*,*) theta pi = 3.141592654 v1(1) = speed*cos(theta*pi/180) ! Initial velocity (x) v1(2) = speed*sin(theta*pi/180) ! Initial velocity (y) r(1) = r1(1) r(2) = r1(2) ! Set initial position and velocity v(1) = v1(1) v(2) = v1(2) !* Set physical parameters (mass, Cd, etc.) Cd = 0.35 ! Drag coefficient (dimensionless) area = 4.3e-3 ! Cross-sectional area of projectile (m^2) grav = 9.81 ! Gravitational acceleration (m/s^2) mass = 0.145 ! Mass of projectile (kg) write(*,*) 'Air resistance? (Yes:1, No:0): ' read(*,*) airFlag if( airFlag .eq. 0 ) then rho = 0 ! No air resistance else rho = 1.2 ! Density of air (kg/m^3) endif air_const = -0.5*Cd*rho*area/mass ! Air resistance constant !* Loop until ball hits ground or max steps completed write(*,*) 'Enter timestep, tau (sec): ' read(*,*) tau maxStep = 1000 ! Maximum number of steps do iStep=1,maxStep !* Record position (computed and theoretical) for plotting xplot(iStep) = r(1) ! Record trajectory for plot yplot(iStep) = r(2) t = (iStep-1)*tau ! Current time xNoAir(iStep) = r1(1) + v1(1)*t yNoAir(iStep) = r1(2) + v1(2)*t - 0.5*grav*t**2 !* Calculate the acceleration of the ball normV = sqrt( v(1)*v(1) + v(2)*v(2) ) accel(1) = air_const*normV*v(1) ! Air resistance accel(2) = air_const*normV*v(2) ! Air resistance accel(2) = accel(2) - grav ! Gravity !* Calculate the new position and velocity using Euler method r(1) = r(1) + tau*v(1) ! Euler step r(2) = r(2) + tau*v(2) v(1) = v(1) + tau*accel(1) v(2) = v(2) + tau*accel(2) !* If ball reaches ground (y<0), break out of the loop if( r(2) .lt. 0 ) then xplot(iStep+1) = r(1) ! Record last values computed yplot(iStep+1) = r(2) goto 100 ! Break out of the for loop endif enddo100 continue !* Print maximum range and time of flight write(*,*) 'Maximum range is ', r(1), ' meters' write(*,*) 'Time of flight is ', iStep*tau, ' seconds' !* Print out the plotting variables: ! xplot, yplot, xNoAir, yNoAir open(11,file='xplot.txt',status='unknown') open(12,file='yplot.txt',status='unknown') open(13,file='xNoAir.txt',status='unknown') open(14,file='yNoAir.txt',status='unknown') do i=1,iStep+1 write(11,*) xplot(i) write(12,*) yplot(i) enddo do i=1,iStep write(13,*) xNoAir(i) write(14,*) yNoAir(i) enddo stop end!***** To plot in MATLAB; use the script below ********************!load xplot.txt; load yplot.txt; load xNoAir.txt; load yNoAir.txt;!clf; figure(gcf); % Clear figure window and bring it forward!% Mark the location of the ground by a straight line!xground = [0 max(xNoAir)]; yground = [0 0];!% Plot the computed trajectory and parabolic, no-air curve!plot(xplot,yplot,'+',xNoAir,yNoAir,'-',xground,yground,'-');!legend('Euler method','Theory (No air)');!xlabel('Range (m)'); ylabel('Height (m)');!title('Projectile motion');!*****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -