Spaces:
Sleeping
Sleeping
Commit
·
96b9af3
1
Parent(s):
d33ecd0
Añadir archivo movimiento_parabolico.py
Browse files- 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()
|