Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import numpy as np | |
| from scipy.integrate import odeint | |
| import matplotlib.pyplot as plt | |
| class Pendulum: | |
| def __init__(self, length, gravity): | |
| self.L = length | |
| self.g = gravity | |
| def derivatives(self, state, t): | |
| theta, omega = state | |
| dydt = [omega, -self.g/self.L * np.sin(theta)] | |
| return dydt | |
| def simulate(self, initial_angle, duration, time_points): | |
| initial_state = [initial_angle, 0] # angle and angular velocity | |
| t = np.linspace(0, duration, time_points) | |
| solution = odeint(self.derivatives, initial_state, t) | |
| return t, solution | |
| def main(): | |
| st.title("Simulación Simple del Mecanismo del Péndulo") | |
| # User inputs | |
| length = st.slider("Amplitud del Péndulo (m)", 0.1, 5.0, 1.0) | |
| initial_angle = st.slider("Angulo Inicial (grados)", -90.0, 90.0, 45.0) | |
| # Convert to radians | |
| initial_angle_rad = np.deg2rad(initial_angle) | |
| # Create and simulate pendulum | |
| pendulum = Pendulum(length=length, gravity=9.81) | |
| t, solution = pendulum.simulate(initial_angle_rad, duration=10, time_points=1000) | |
| # Plot results | |
| fig, ax = plt.subplots() | |
| ax.plot(t, np.rad2deg(solution[:, 0])) | |
| ax.set_xlabel('Tiempo (s)') | |
| ax.set_ylabel('Angulo (grados)') | |
| ax.grid(True) | |
| st.pyplot(fig) | |
| # Display energy conservation | |
| E_kinetic = 0.5 * length * solution[:, 1]**2 | |
| E_potential = 9.81 * length * (1 - np.cos(solution[:, 0])) | |
| E_total = E_kinetic + E_potential | |
| st.write("### Conservación de la Energía") | |
| st.line_chart({"Energía Total": E_total, | |
| "Energía Cinética": E_kinetic, | |
| "Energía Potencial": E_potential}) | |
| if __name__ == "__main__": | |
| main() |