parser.add_argument('--smooth', dest='smooth', type=int, default=0) parser.add_argument('--tscale', dest='tscale', type=float, default=1) parser.add_argument('--start', dest='start', type=int, default=0) parser.add_argument('--stop', dest='stop', type=int, default=0) parser.add_argument('--f', dest='fname', type=str, default="") args = parser.parse_args() smooth = args.smooth start = args.start stop = args.stop tscale = max(args.tscale,1) xs = [] distances = [] for time, _, dlist in OrbitData.read(sys.stdin): xs.append(time) distances.append(dlist) print "Read all data" distances = numpy.transpose(distances) print "Transposed distance arrays" def movingaverage(interval, window_size): window = numpy.ones(int(window_size))/float(window_size) return numpy.convolve(interval, window, 'same') if smooth > 1: avrgdt = sum(b-a for a,b in zip(xs,xs[1:]))/(len(xs)-1)
from itertools import combinations import matplotlib.pyplot as plt from mpmath import cbrt import sys import OrbitData times = [] masses = None positions = [] for time, bodies, _ in OrbitData.read(sys.stdin): times.append(time) positions.append(map(lambda b: b[1:3], bodies)) masses = map(lambda b: b[0], bodies) scale = min(masses) masses = [12*cbrt(m/scale)**2 for m in masses] print "Read all data" def update_plot(i, scat, pos, mass): scat.set_offsets(pos[i]) scat.set_sizes(mass) return scat minx = min(map(lambda p: min(map(lambda c: c[0], p)), positions)) maxx = max(map(lambda p: max(map(lambda c: c[0], p)), positions)) miny = min(map(lambda p: min(map(lambda c: c[1], p)), positions)) maxy = max(map(lambda p: max(map(lambda c: c[1], p)), positions)) xbuf = (maxx - minx)/10 maxx += xbuf
#G is accounted for in vdt p.ax -= b.mass * dx / h3 p.ay -= b.mass * dy / h3 b.ax += p.mass * dx / h3 b.ay += p.mass * dy / h3 #Update velocity & position p.vx += p.ax*vdt p.vy += p.ay*vdt p.x += p.vx*dt p.y += p.vy*dt p.ax = 0 p.ay = 0 reader = OrbitData.read(sys.stdin) time, b_info, _ = reader.next() minmass = min(map(lambda t: t[0], b_info)) G = G*minmass bodies = [Body(data[0]/minmass, *data[1:]) for data in b_info] timestep = args.step output_interval = args.out end = args.end step(bodies, timestep, True) for s in xrange(time, end, timestep): step(bodies, timestep, False) if s % output_interval == 0: