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() |