def second(de, x, tstart, tend, steps): t=tstart dt=float(tend-tstart)/steps for i in range(steps): # step forward one step in x dx=de(t,x) xt=[a+b*dt for (a,b) in zip(x,dx)] t+=dt # find new derivative dx2=de(t+dt,xt) # step forward using average if two derivatives x=[a+(b+c)*dt/2 for (a,b,c) in zip(x,dx,dx2)] #step forward again. return x def ball(t,x): g=9.8 v=x[0] return [g,v] p=[0,0] print second(ball,p,0.0,1.0,10) print second(ball,p,0.0,2.0,10) print second(ball,p,0.0,3.0,10) print second(ball,p,0.0,4.0,10) print second(ball,p,0.0,5.0,10) p=[0,0] p= second(ball,p,0.0,1.0,10) print p p = second(ball,p,1.0,2.0,10) print p p = second(ball,p,2.0,3.0,10) print p p = second(ball,p,4.0,5.0,10) print p p=[0,0] p= second(ball,p,0.0,1.0,10) print p p= second(ball,p,0.0,1.0,10) print p p= second(ball,p,0.0,1.0,10) print p p= second(ball,p,0.0,1.0,10) print p p= second(ball,p,0.0,1.0,10) print p p=[0,0] print second(ball,p,0.0,5.0,1000)