def update(self): """時間発展(タイムオーダーは成長よりも短くすること) 各点にかかる力は,それぞれに付いているバネから受ける力の合力。 Runge-Kutta法を用いて運動方程式を解く。 この内部でglow関数を呼ぶ --- Arguments --- point (class): 参照するPointクラスを指定する h (float): シミュレーションの時間発展の刻み t_max (float): シミュレーションを終了する時間 """ # 初期条件 X = np.array([self.point.position_x, self.point.position_y, self.point.vel_x, self.point.vel_y ]) # X = [[x0, x1, ... , xN-1], # [y1, y2, ... , yN-1], # [x'0, x'1, ... , x'N-1], # [y'1, y'2, ..., y'N-1]] # solver = RK4(self.force) # Runge-Kutta method # solver = RK4(self.force_with_more_viscosity) # Runge-Kutta method # solver = Euler(self.force) # Euler method solver = Euler(self.force_with_more_viscosity) # Euler method count_grow, frame = 1, 0 grow_interval = 1000 plot_interval = 8 while self.t < self.t_max: print self.t if not self.pause: print "solver" X = solver.solve(X, self.t, self.h) # update values self.point.position_x, self.point.position_y = X[0], X[1] self.point.vel_x, self.point.vel_y = X[2], X[3] # ある時間間隔で新しく線素を追加する print self.h * grow_interval * count_grow if self.t > self.h * grow_interval * count_grow: print "add point" X = self.point.add() count_grow += 1 # self avoiding if self.self_avoiding: self.update_position_self_avoiding() # 一定の間隔で描画を行う if self.t > self.h * plot_interval * frame: log.info(self.t) log.info("N: " + str(self.point.N)) log.info("x: " + str(self.point.position_x)) log.info("y: " + str(self.point.position_y)) log.info("d: " + str(self.point.distances( self.point.position_x, self.point.position_y))) log.info("nl: " + str(self.point.natural_length)) log.info("K: " + str(self.point.K)) if self.point.is_open: yield [self.point.position_x, self.point.position_y] else: yield [np.append(self.point.position_x, self.point.position_x[0]), np.append(self.point.position_y, self.point.position_y[0])] frame += 1 self.t = self.t + self.h else: time.sleep(0.1) if self.point.is_open: yield [self.point.position_x, self.point.position_y] else: yield [np.append(self.point.position_x, self.point.position_x[0]), np.append(self.point.position_y, self.point.position_y[0])] print "Done!"
def update(self): """時間発展(タイムオーダーは成長よりも短くすること) 各点にかかる力は,それぞれに付いているバネから受ける力の合力。 Runge-Kutta法を用いて運動方程式を解く。 この内部でglow関数を呼ぶ --- Arguments --- point (class): 参照するPointクラスを指定する h (float): シミュレーションの時間発展の刻み t_max (float): シミュレーションを終了する時間 """ # 初期条件 X = np.array([ self.point.position_x, self.point.position_y, self.point.vel_x, self.point.vel_y ]) # X = [[x0, x1, ... , xN-1], # [y1, y2, ... , yN-1], # [x'0, x'1, ... , x'N-1], # [y'1, y'2, ..., y'N-1]] # solver = RK4(self.force) # Runge-Kutta method # solver = RK4(self.force_with_more_viscosity) # Runge-Kutta method # solver = Euler(self.force) # Euler method solver = Euler(self.force_with_more_viscosity) # Euler method t_count, frame = 0, 0 while self.t < self.t_max: if not self.pause: X = solver.solve(X, self.t, self.h) # update values self.point.position_x, self.point.position_y = X[0], X[1] self.point.vel_x, self.point.vel_y = X[2], X[3] # 各バネの自然長を増加させる & バネ定数を変化させる self.point.grow(self.grow_func, self.grow_func_k) # 各点間の距離が基準値を超えていたら,間に新たな点を追加する X = self.point.divide_if_extended(X) # self avoiding if self.self_avoiding: self.update_position_self_avoiding() # 一定の間隔で描画を行う if self.t > self.h * 12 * frame: # TODO: 要検討 log.info(self.t) log.info("N: " + str(self.point.N)) log.info("x: " + str(self.point.position_x)) log.info("y: " + str(self.point.position_y)) log.info("d: " + str( self.point.get_distances(self.point.position_x, self.point.position_y))) log.info("nl: " + str(self.point.natural_length)) log.info("K: " + str(self.point.K)) if self.point.is_open: yield [self.point.position_x, self.point.position_y] else: yield [ np.append(self.point.position_x, self.point.position_x[0]), np.append(self.point.position_y, self.point.position_y[0]) ] frame += 1 t_count += 1 self.t = self.h * t_count else: time.sleep(0.1) if self.point.is_open: yield [self.point.position_x, self.point.position_y] else: yield [ np.append(self.point.position_x, self.point.position_x[0]), np.append(self.point.position_y, self.point.position_y[0]) ] print "Done!"
def update(self): """時間発展(タイムオーダーは成長よりも短くすること) 各点にかかる力は,それぞれに付いているバネから受ける力の合力。 Runge-Kutta法を用いて運動方程式を解く。 この内部でglow関数を呼ぶ --- Arguments --- point (class): 参照するPointクラスを指定する h (float): シミュレーションの時間発展の刻み t_max (float): シミュレーションを終了する時間 """ # 初期条件 X = np.array([self.point.position_x, self.point.position_y, self.point.vel_x, self.point.vel_y ]) # X = [[x0, x1, ... , xN-1], # [y1, y2, ... , yN-1], # [x'0, x'1, ... , x'N-1], # [y'1, y'2, ..., y'N-1]] # solver = RK4(self.force) # Runge-Kutta method # solver = RK4(self.force_with_more_viscosity) # Runge-Kutta method # solver = Euler(self.force) # Euler method solver = Euler(self.force_with_more_viscosity) # Euler method t_count, frame = 0, 0 while self.t < self.t_max: if not self.pause: X = solver.solve(X, self.t, self.h) # update values self.point.position_x, self.point.position_y = X[0], X[1] self.point.vel_x, self.point.vel_y = X[2], X[3] # 各バネの自然長を増加させる & バネ定数を変化させる self.point.grow(self.grow_func, self.grow_func_k) # 各点間の距離が基準値を超えていたら,間に新たな点を追加する X = self.point.divide_if_extended(X) # self avoiding if self.self_avoiding: self.update_position_self_avoiding() # 一定の間隔で描画を行う if self.t > self.h * 12 * frame: # TODO: 要検討 log.info(self.t) log.info("N: " + str(self.point.N)) log.info("x: " + str(self.point.position_x)) log.info("y: " + str(self.point.position_y)) log.info("d: " + str(self.point.get_distances( self.point.position_x, self.point.position_y))) log.info("nl: " + str(self.point.natural_length)) log.info("K: " + str(self.point.K)) if self.point.is_open: yield [self.point.position_x, self.point.position_y] else: yield [np.append(self.point.position_x, self.point.position_x[0]), np.append(self.point.position_y, self.point.position_y[0])] frame += 1 t_count += 1 self.t = self.h * t_count else: time.sleep(0.1) if self.point.is_open: yield [self.point.position_x, self.point.position_y] else: yield [np.append(self.point.position_x, self.point.position_x[0]), np.append(self.point.position_y, self.point.position_y[0])] print "Done!"