def calc_polytrope_butcher(n, method="rk4", zmin=0, zmax=10, imax=10, analytic=None): f = lambda z, (w,v), dt, n : np.array([v, -2*v/z - np.power(w,n) if z>dt else -1./3.], dtype=cyb.DTYPE) dz = (zmax - zmin)/(imax - 1) data = np.zeros((imax, 3), dtype=cyb.DTYPE) data[0,0:3] = [zmin, 1.0, 0.0] l1error = 0.0 for i in range(1,imax): z = zmin + (i-1)*dz data[i,0] = zmin + i*dz data[i,1:3],k = cyb.butcher(f, data[i-1,1:3], z, dz, tableau(method),fargs=(dz,n)) if analytic and z>0: l1error += np.fabs(data[i,1]-analytic(data[i,0])) return data, l1error*dz
from time import time a= np.array([[ 0. , 0. , 0. ], [ 0.5, 0.5, 0. ], [ 0. , 0. , 1. ]], dtype=np.float64) f = lambda z,(w,v),dt,n : np.array([ v, -1./3. if z<dt else -2*v/z-w**n], dtype=np.float64) dt = 0.1 numsteps = 50 t = np.arange(0,numsteps + 1,dtype=np.float64)*dt data = [[1,0],] n=1 runtime = 0 l1err = 0 for curt in t[:-1]: starttime = time() data.append( butcher(f,np.array(data[-1],np.float64),curt,dt,a, fargs=(dt,n)) ) runtime += time() - starttime if curt != 0: l1err += np.abs(data[-1][0] - np.sin(curt)/curt)*dt print "l1err = %f"%l1err print "runtime = %f s"%(runtime / numsteps) data = np.array(data) #import pylab as py #py.scatter(t, data[:,0]) #py.show()