JHONGONZALEZ commited on
Commit
96b9af3
·
1 Parent(s): d33ecd0

Añadir archivo movimiento_parabolico.py

Browse files
Files changed (1) hide show
  1. movimiento_parabolico.py +115 -0
movimiento_parabolico.py ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+
2
+ !pip install gradio matplotlib pillow # Instalar las bibliotecas necesarias
3
+ !pip install huggingface_hub
4
+ import numpy as np
5
+ import gradio as gr
6
+ import matplotlib.pyplot as plt
7
+ from PIL import Image
8
+
9
+ # Cargar la imagen del logo (asegúrate de que el archivo esté en la ruta correcta)
10
+ logo_image = "/content/LOGOCIPDOQUEBRADAS.png"
11
+
12
+ def calcular_movimiento_parabolico(v0, angulo, h_inicial):
13
+ g = 9.81 # Aceleración debido a la gravedad (m/s^2)
14
+ angulo_rad = np.radians(angulo)
15
+
16
+ # Tiempo de vuelo considerando altura inicial
17
+ t_vuelo = (v0 * np.sin(angulo_rad) + np.sqrt((v0 * np.sin(angulo_rad))**2 + 2 * g * h_inicial)) / g
18
+
19
+ # Tiempo en intervalos
20
+ t = np.linspace(0, t_vuelo, num=500)
21
+
22
+ # Trayectoria
23
+ x = v0 * np.cos(angulo_rad) * t
24
+ y = h_inicial + v0 * np.sin(angulo_rad) * t - 0.5 * g * t**2
25
+
26
+ # Altura máxima
27
+ h_max = h_inicial + (v0**2 * np.sin(angulo_rad)**2) / (2 * g)
28
+
29
+ # Alcance máximo
30
+ alcance_max = v0 * np.cos(angulo_rad) * t_vuelo
31
+
32
+ return x, y, h_max, alcance_max, t_vuelo
33
+
34
+ def graficar(v0, angulo, h_inicial):
35
+ x, y, h_max, alcance_max, t_vuelo = calcular_movimiento_parabolico(v0, angulo, h_inicial)
36
+
37
+ plt.figure(figsize=(10, 5))
38
+ plt.plot(x, y, label='Trayectoria', color='purple')
39
+ plt.title('Movimiento Parabólico')
40
+ plt.xlabel('Distancia (m)')
41
+ plt.ylabel('Altura (m)')
42
+ plt.grid(True)
43
+
44
+ # Cálculo de componentes de velocidad
45
+ vx = v0 * np.cos(np.radians(angulo))
46
+ vy = v0 * np.sin(np.radians(angulo))
47
+
48
+ # Añadir vectores
49
+ plt.quiver(0, h_inicial, vx, vy, angles='xy', scale_units='xy', scale=1, color='r', label='Vector de Lanzamiento (V0)')
50
+ plt.quiver(0, h_inicial, vx, 0, angles='xy', scale_units='xy', scale=1, color='g', label='Componente x (Vx)')
51
+ plt.quiver(0, h_inicial, 0, vy, angles='xy', scale_units='xy', scale=1, color='b', label='Componente y (Vy)')
52
+
53
+ plt.axhline(0, color='k', linewidth=0.5, linestyle='--')
54
+ plt.axvline(0, color='k', linewidth=0.5, linestyle='--')
55
+
56
+ plt.xlim(0, alcance_max * 1.1)
57
+ plt.ylim(0, h_max * 1.1)
58
+
59
+ # Dibujar el arco del ángulo
60
+ angulo_rad = np.arctan2(vy, vx)
61
+ arco_x = np.linspace(0, vx, 100)
62
+ arco_y = h_inicial + (arco_x * np.tan(angulo_rad))
63
+ plt.plot(arco_x, arco_y, color='orange', label='Ángulo de Lanzamiento')
64
+ plt.text(vx / 2, h_inicial + 2, f'Ángulo: {angulo}°', fontsize=12, color='orange', ha='center')
65
+
66
+ plt.legend()
67
+ plt.savefig('plot.png') # Guardar la gráfica
68
+ plt.close()
69
+
70
+ # Formatear la salida del texto con las ecuaciones en formato LaTeX
71
+ resultado = (
72
+ "**Ecuaciones del Movimiento Parabólico:** \n"
73
+ "$$ h_{max} = h_0 + \\frac{v_0^2 \\sin^2(\\theta)}{2g} $$ \n"
74
+ "$$ R = \\frac{v_0 \\cos(\\theta)}{g} \\left( v_0 \\sin(\\theta) + \\sqrt{(v_0 \\sin(\\theta))^2 + 2gh_0} \\right) $$ \n"
75
+ "$$ t_{vuelo} = \\frac{v_0 \\sin(\\theta) + \\sqrt{(v_0 \\sin(\\theta))^2 + 2gh_0}}{g} $$ \n"
76
+ "Ecuaciones de posición: \n"
77
+ "$$ x(t) = v_0 \\cos(\\theta) \\cdot t $$ \n"
78
+ "$$ y(t) = h_0 + v_0 \\sin(\\theta) \\cdot t - \\frac{1}{2} g \\cdot t^2 $$ \n\n"
79
+ "**Valores calculados:** \n"
80
+ f"- Altura máxima (h_max): {h_max:.2f} m \n"
81
+ f"- Alcance máximo (R): {alcance_max:.2f} m \n"
82
+ f"- Tiempo de vuelo (t_vuelo): {t_vuelo:.2f} s"
83
+ )
84
+
85
+ return Image.open('plot.png'), resultado, 'plot.png' # Devolver la ruta del archivo
86
+
87
+ # Crear la interfaz de Gradio
88
+ with gr.Blocks() as interfaz:
89
+ # Mostrar el logo en la parte superior con tamaño ajustado
90
+ with gr.Row():
91
+ gr.Image(logo_image, show_label=False, interactive=False, width=300, height=150) # Ajusta los valores según sea necesario
92
+
93
+ # Título de la interfaz
94
+ gr.Markdown("## **Simulación de Movimiento Parabólico - UNAD CIP Dosquebradas ECBTI**")
95
+ gr.Markdown("**Ingrese los valores para la simulación**")
96
+
97
+ # Entradas para velocidad, ángulo y altura inicial usando sliders
98
+ with gr.Row():
99
+ v0_input = gr.Slider(label="Velocidad Inicial (m/s)", minimum=0, maximum=100, value=20, step=1)
100
+ angulo_input = gr.Slider(label="Ángulo de Lanzamiento (grados)", minimum=0, maximum=90, value=45, step=1)
101
+ h_inicial_input = gr.Number(label="Altura Inicial (m)", value=0)
102
+
103
+ # Salidas para la gráfica y resultados
104
+ output_image = gr.Image(type="pil")
105
+ output_markdown = gr.Markdown(label="Ecuaciones y Valores Calculados")
106
+
107
+ # Botón para generar gráfica
108
+ boton_graficar = gr.Button("Generar Gráfica")
109
+ boton_descargar = gr.File(label="Descargar Gráfica", type="filepath") # Cambiado a filepath
110
+
111
+ # Funcionalidad del botón
112
+ boton_graficar.click(fn=graficar, inputs=[v0_input, angulo_input, h_inicial_input], outputs=[output_image, output_markdown, boton_descargar])
113
+
114
+ # Lanzar la interfaz
115
+ interfaz.launch()