From ced3a58cb9c8ae2bcbd9b43094e40d1edc998236 Mon Sep 17 00:00:00 2001 From: Oscar Suescun Elizalde Date: Wed, 28 May 2025 16:40:26 +0200 Subject: [PATCH] clase simulador --- src/claseSimulador.py | 135 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 135 insertions(+) create mode 100644 src/claseSimulador.py diff --git a/src/claseSimulador.py b/src/claseSimulador.py new file mode 100644 index 0000000..ec947dc --- /dev/null +++ b/src/claseSimulador.py @@ -0,0 +1,135 @@ +from funcionesSimELectrica import * +from funcionesSimFisica import * +from scipy.integrate import cumulative_trapezoid + +__author__ = 'Oscar Suescun' + +class Simulador: + def __init__(self, longitudVastago, diametroVastago, longitudBobina, + diametroInteriorBobina, diametroCuBobina, espirasBobina): + ''' + Se define el vastago + + ''' + + self.espirasBobina = espirasBobina + self.longitudBobina = longitudBobina + + self.diametroVastago = diametroVastago + + self.anguloDisparo = anguloDisparo + + self.masa = calcular_masa(diametroVastago, longitudVastago) + + self.resistencia, self.reluctancia = calcular_bobina(longitudVastago, diametroVastago, longitudBobina, + diametroInteriorBobina, diametroCuBobina, espirasBobina) + + self.inductancia = self.espirasBobina**2 / self.reluctancia + + + + def modulo_inicial(self, tension, capacitancia, tiempo): + + + corriente = solver_manual(tension, self.resistencia, self.inductancia, capacitancia, tiempo) + fuerza = fuerza_magnetica(corriente, self.reluctancia, self.espirasBobina, self.diametroVastago) + aceleracion = calcular_aceleracion(self.masa, self.anguloDisparo, fuerza) + aceleracion[aceleracion<0]=0 + velocidad = cumulative_trapezoid(aceleracion, tiempo, initial=0) + posicion = cumulative_trapezoid(velocidad, tiempo, initial=0) + + idx = posicion <= self.longitudBobina + + tiempo = tiempo[idx] + posicion = posicion[idx] + velocidad = velocidad[idx] + aceleracion = aceleracion[idx] + + self.resultado = { + 'tiempo' : tiempo, + 'posicion' : posicion, + 'velocidad' : velocidad, + 'aceleracion' : aceleracion, + 'fuerza' : fuerza, + 'corriente' : corriente + } + + def modulo(self, tension, capacidad, tiempo): + + + corriente = solver_manual(tension, self.resistencia, self.inductancia, capacidad, tiempo) + fuerza = fuerza_magnetica(corriente, self.reluctancia, self.espirasBobina, self.diametroVastago) + aceleracion = calcular_aceleracion(self.masa, self.anguloDisparo, fuerza) + + tiempo = np.append(self.resultado['tiempo'], tiempo + self.resultado['tiempo'][-1]) + + aceleracion = np.append(self.resultado['aceleracion'], aceleracion) + velocidad = cumulative_trapezoid(aceleracion, tiempo, initial=0) + posicion = cumulative_trapezoid(velocidad, tiempo, initial=0) + + idx = posicion <= self.longitudBobina + self.resultado['posicion'][-1] + + tiempo = tiempo[idx] + posicion = posicion[idx] + velocidad = velocidad[idx] + aceleracion = aceleracion[idx] + + self.resultado = { + 'tiempo' : tiempo, + 'posicion' : posicion, + 'velocidad' : velocidad, + 'aceleracion' : aceleracion, + 'fuerza' : fuerza, + 'corriente' : corriente + } + + def mostrar_resultados(self): return self.resultado + + + + +if __name__=='__main__': + import matplotlib.pyplot as plt + import os + + tiempoSimulacion = 10e-3 + step = tiempoSimulacion / 1e6 + + numeroModulos = 3 + + longitudBobina = 53.21e-3 # m + diametroInteriorBobina = 6.035e-3 * 2 # m + espirasBobina = 500 + diametroCuBobina = 0.8e-3 # m + + longitudVastago = 96e-3 # m + diametroVastago = 3.045e-3 * 2 # m + + anguloDisparo = 40 + + Tension = 30 # V + Capacitancia = 10e-3 # F + + simular = Simulador(longitudVastago, diametroVastago, longitudBobina, + diametroInteriorBobina, diametroCuBobina, espirasBobina) + + tiempo = np.arange(0, tiempoSimulacion, step) + + simular.modulo_inicial(Tension, Capacitancia, tiempo) + + for i in range(1,numeroModulos): + + print(f'{i+1}/{numeroModulos}') + + simular.modulo(Tension, Capacitancia, tiempo) + + + plt.figure() + #plt.plot(t, fuerza, label = 'Fuerza') + #plt.plot(resultado['tiempo'], resultado['aceleracion'], label='aceleracion') + #plt.plot(resultado['tiempo'], resultado['velocidad'], label = 'velocidad') + plt.plot(simular.resultado['posicion'], simular.resultado['velocidad']) + plt.xlabel('Posicion [m]') + plt.ylabel('Velocidad [m/s]') + plt.show() +