rk4.py

Go to the documentation of this file.
00001 "simple 4th order Runge-Kutta integration"
00002 _rcsid="$Id: rk4.py,v 1.3 2003/05/30 13:31:56 mendenhall Release-20030716 $"
00003 
00004 from Numeric import *
00005 
00006 rk4nsave=0
00007 
00008 def rk4(y, dydx, n, x, h, yout, derivs):
00009     
00010     global rk4nsave, dyt, dym, yt
00011     
00012     if n!=rk4nsave:
00013         dyt=zeros(n,Float)
00014         dym=zeros(n,Float)
00015         yt=zeros(n,Float)
00016         rk4nsave=n
00017     
00018     hh=h*0.5
00019     h6=h/6.0
00020     xh=x+hh
00021     
00022     #dyt=derivs(xh, hh*dydx+y) the fast way
00023     multiply(dydx, hh, yt)
00024     add(yt, y, yt)
00025     derivs(xh, yt, dyt)
00026     
00027     #dym=derivs(xh, hh*dyt+y)
00028     multiply(hh, dyt, yt)
00029     add(yt, y, yt)
00030     derivs(xh, yt, dym)
00031     
00032     #yt=h*dym+y
00033     #dym=dym+dyt
00034     multiply(dym, h, yt)
00035     add(yt, y, yt)
00036     add(dym, dyt, dym)
00037     
00038     derivs(x+h, yt, dyt)
00039     
00040     #yout=h6*(2.0*dym+dyt+dydx)+y
00041     multiply(dym, 2.0, yt)
00042     add(yt, dyt, yt)
00043     add(yt, dydx, yt)
00044     multiply(yt, h6, yt)
00045     add(yt, y, yout)
00046 
00047 def rk4dumb(vstart, nvar, x1, x2, nstep, derivs):
00048     
00049     v=zeros(nvar, Float)
00050     vout=zeros(nvar,Float)
00051     dv=zeros(nvar,Float)
00052     
00053     y=zeros((nstep+1, nvar),Float)
00054     xx=zeros(nstep+1,Float)
00055     
00056     y[0,:]=vstart[:]
00057     v[:]=vstart[:]
00058     
00059     xx[0]=x1
00060     x=x1
00061     h=(x2-x1)/nstep
00062     
00063     for k in range(nstep):
00064         derivs(x, v, dv)
00065         rk4(v, dv, nvar, x, h, vout, derivs)
00066         x += h
00067         xx[k+1]=x
00068         v[:]=vout[:]
00069         y[k+1,:]=v[:]
00070     
00071     return (xx,y)
00072     

Generated on Wed Nov 21 10:18:31 2007 for analysis by  doxygen 1.5.4