PROGRAM drag ! assume drag force proportional to v^2 CALL initial(y,y0,v,t,g,vt2,dt,dt_2) CALL print_table(y,y0,t,dt,nshow) DO until t >= 0 CALL Euler_Richardson(y,v,t,g,vt2,dt,dt_2) LOOP CALL print_table(y,y0,t,dt,nshow) ! values at t = 0 LET counter = 0 DO while t <= 0.80 CALL Euler_Richardson(y,v,t,g,vt2,dt,dt_2) LET counter = counter + 1 IF mod(counter,nshow) = 0 then CALL print_table(y,y0,t,dt,nshow) END IF LOOP END SUB initial(y,y0,v,t0,g,vt2,dt,dt_2) LET t0 = -0.132 ! initial time (see Table 3.1) LET y0 = 0 LET y = y0 LET v = 0 ! initial velocity INPUT prompt "terminal velocity (m/s) = ": vt LET vt2 = vt*vt LET dt = 0.001 LET dt_2 = 0.5*dt LET g = 9.8 END SUB SUB Euler_Richardson(y,v,t,g,vt2,dt,dt_2) ! Euler-Richardson method LET v2 = v*v LET a = -g*(1 - v2/vt2) LET vmid = v + a*dt_2 ! velocity at midpoint LET ymid = y + v*dt_2 ! position at midpoint LET vmid2 = vmid*vmid LET amid = -g*(1 - vmid2/vt2) ! acceleration at midpoint LET v = v + amid*dt LET y = y + vmid*dt LET t = t + dt END SUB SUB print_table(y,y0,t,dt,nshow) IF t < 0 then LET show_time = 0.1 ! time interval between output ! choice of dt = 0.001 convenient LET nshow = int(show_time/dt) CLEAR PRINT "time","displacement" PRINT END IF LET distance_fallen = y0 - y PRINT t,distance_fallen END SUB