c periodic force
realk,m
equivalence (dt,h)
ampl=2.
period=10.
k=1.
m=1.
b=0.2
omega=sqrt(k/m)
nstep=2000
t1=1./b
t2=1./omega
t3=period
tscale=min(t1,t2,t3)
dt=20.*tscale/float(nstep)
x0=1.
v0=0.
x1=v0*dt+x0
kprint=int(float(nstep)/100.)
kount=kprint
t=0.
write(6,100)t,x0,fuerza(0.,period,ampl)
do 10 i=2,nstep
t=float(i)*h
x2=2.*x1-x0-dt*(b/m)*(x1-x0)+dt**2*(-(k/m)*x1+
$fuerza(t-dt,period,ampl)/m)
v=(x2-x1)/dt
if(i.eq.kount)then
write(6,100)t,x2,fuerza(t,period,ampl)
kount=kount+kprint
endif
x0=x1
x1=x2
10 continue
100 format(3x,'t,x,force=',3x,e10.3,3x,e10.3,3x,e10.3)
stop
end
function fuerza(t,period,ampl)
half=period/2.
ifact=int(t/period)
tprime=t-float(ifact)*period
if(tprime.le.half)fuerza=+ampl
if(tprime.gt.half)fuerza= -ampl
return
end