コード例 #1
0
ファイル: static_satellite.py プロジェクト: jackhall/Claude
def fitness(individual, numbers, classes):
	"""procedure to compute evolutionary fitness"""
	correct = 0.0
	p = fernpy.point2()
	for index, number in enumerate(numbers):
		p[0], p[1] = number[0], number[1]
		if individual.query(p) == classes[index]:
			correct += 1.0
	return correct
コード例 #2
0
ファイル: satellite_fern.py プロジェクト: jackhall/Claude
def dh(theta, h, control=None, thrust=.5):
	"""computes the derivative of angular momentum (torque thrust)"""
	if control is None:
		control = OptimalController()
	
	p = fernpy.point2()
	#p[0], p[1] = roll([theta, h]) 
	mode = control.query(p) 
	if mode is 0:
		torque = 0
	elif mode is 1:
		torque = -thrust
	elif mode is 2:
		torque = thrust		
	return torque
コード例 #3
0
ファイル: satellite_fern.py プロジェクト: jackhall/Claude
def simulate(t_final, dt, control=None, state0=None, thrust=.5):
	"""simulates a satellite (with event detection)"""
	if control is None:
		control = OptimalController()
		
	if state0 is None:
		state0 = random_state()
	
	state_tolerance = .01
	
	y_out, t_out = [], []
	solver = scipy.integrate.ode(fblank).set_integrator('dopri5') #vode cannot run in parallel
	solver.set_initial_value(state0, 0.0) #thinks state0 has only one number in it?
	p = fernpy.point2()
	max_time = time.clock() + 0.1 
	while solver.t < t_final and solver.successful():
		
		#select a control mode by setting torque
		p[0], p[1] = solver.y
		mode = control.query(p) 
		if mode is 0:
			solver.set_f_params(0.0)
		elif mode is 1:
			solver.set_f_params(-thrust)
		elif mode is 2:
			solver.set_f_params(thrust)

		if sum(abs(solver.y)) < state_tolerance: #dead zone around (0,0)
			solver.set_f_params(0.0)

		#run forward as far as possible
		while solver.successful() and solver.t < t_final:
			y_out.append(solver.y)
			t_out.append(solver.t)
			solver.integrate(solver.t + dt)
			#if abs(solver.y[0]) > pi:
			#	solver.set_initial_value(roll(solver.y), solver.t)
			p[0], p[1] = solver.y
			if sum(abs(solver.y)) < state_tolerance:
				solver.set_f_params(0.0)
			elif control.query(p) != mode:
				#print p, ", stopping at t = ", solver.t
				break
		
		#check if simulation is done
		if solver.t >= t_final or time.clock() > max_time or not solver.successful():
			y_out.append(solver.y)
			t_out.append(solver.t)
			break
		
		#go back one step, cut step size in half until switch time is known
		solver.set_initial_value(y_out[-1], t_out[-1])
		bisect_step = dt / 2.0
		while solver.successful(): #program hangs here somewhere
			y_current, t_current = solver.y, solver.t
			solver.integrate(solver.t + bisect_step)
			#if abs(solver.y[0]) > pi: #two if statements interacting to stop break
			#	solver.set_initial_value(roll(solver.y), solver.t)
			p[0], p[1] = solver.y
			#sys.stdout.write("\rstep size: %f" % bisect_step)
			#sys.stdout.flush()
			if control.query(p) != mode:
				if bisect_step < 0.001:
					break
				solver.set_initial_value(y_current, t_current)
			bisect_step /= 2.0
			if time.clock() > max_time:
				break
				
		if time.clock() > max_time: #solver hit time limit
				break
	
	#if solver hit the time limit
	if t_out[-1] < t_final: 
		y_out.append(solver.y*1000)
		t_out.append(t_final)
	
	return numpy.array(y_out), t_out