Esempio n. 1
0
    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!"
Esempio n. 2
0
    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!"
Esempio n. 3
0
    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!"