Пример #1
0
    def simulate_line(self, rise_time: float, N: int = 50, plot: bool = True) -> \
            Tuple[List[float], List[float], List[float]]:
        """
        Simula la respuesta de la línea a un escalón
        """
        # parametros del circuito
        C = self.c * self.L
        R = self.r * self.L
        tao = 5 * R * C

        # parametros de la simulacion
        end_time = rise_time * 10
        time_step = end_time / 1e5

        # creamos los objetos
        source = ExpSource(2.5, rise_time)
        circuit = Circuit(R, C, source, self.uid, N)
        simulation = Simulation(time_step, end_time, circuit, self.uid)
        results = Results(self.uid)

        # simulamos y procesamos los resultados
        simulation.run(results.filename)
        results.process()

        # limpiamos los archivos
        circuit.clean()
        simulation.clean()
        results.clean()

        return results.time, results.vin, results.vout
Пример #2
0
    def min_sections(self,
                     tolerance: float = 5,
                     N_max: int = 150,
                     plot: bool = False) -> int:
        """
        Obtiene el mínimo N con el que se puede representar a la línea
        con cuadripolos RC, cada uno con valores rL/N y cL/N
        tolerance es el porcentaje del punto de la asíntota que consideramos
        Con plot se decide si plotear TpVsN
        """
        # parametros del circuito
        C = self.c * self.L
        R = self.r * self.L
        tao = 5 * R * C

        # parametros de la fuente
        V = 2.5
        pulse_width = tao
        period = pulse_width

        # parametros de la simulacion
        end_time = pulse_width
        time_step = end_time / 1e4

        # contenedores de los resultados
        T_vec = []
        N_vec = []

        for N in [N + 1 for N in range(N_max)]:

            # creamos los objetos
            source = StepSource(V, pulse_width, period)
            circuit = Circuit(R, C, source, self.uid, N)
            simulation = Simulation(time_step, end_time, circuit, self.uid)
            results = Results(self.uid)

            # simulamos y procesamos los resultados
            simulation.run(results.filename)
            results.process()
            T_vec.append(results.get_rise_time())
            N_vec.append(N)

            # limpiamos los archivos
            circuit.clean()
            simulation.clean()
            results.clean()

        if plot:
            plt.plot([int(n) for n in N_vec], [t * 1e15 for t in T_vec])
            plt.ylabel('Tiempo de crecimiento [fs]')
            plt.xlabel('Cantidad de cuadripolos')
            plt.title(
                f'Tiempo de crecimiento para línea de {int(np.ceil(self.L*1e6))} micro'
            )
            plt.grid()
            plt.savefig('TpVsN.png')
            plt.show()

        # Consideramos el N mínimo como el mínimo de los N que tienen un tiempo
        # de propagación no mayor a un {tolerancia}% de la asíntota
        N_min = N_vec[np.min(
            np.nonzero(T_vec < np.min(T_vec) * (1 + tolerance / 100)))]

        return N_min