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
00023 multiply(dydx, hh, yt)
00024 add(yt, y, yt)
00025 derivs(xh, yt, dyt)
00026
00027
00028 multiply(hh, dyt, yt)
00029 add(yt, y, yt)
00030 derivs(xh, yt, dym)
00031
00032
00033
00034 multiply(dym, h, yt)
00035 add(yt, y, yt)
00036 add(dym, dyt, dym)
00037
00038 derivs(x+h, yt, dyt)
00039
00040
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