34. Simular un péndulo sin aproximar el ángulo

La ecuación exacta del péndulo conserva el seno del ángulo. Al integrarla numéricamente podemos estudiar pequeñas y grandes amplitudes, cambios de período e incluso rotaciones sin reemplazar la geometría por un modelo lineal.

34.1 Modelo que vamos a programar

Representamos una masa puntual m unida a un soporte fijo mediante una varilla rígida, sin masa y de longitud L. El movimiento ocurre en un plano y el ángulo θ se mide desde la vertical hacia abajo.

El sentido positivo se elige hacia la derecha. La gravedad apunta verticalmente hacia abajo y el soporte no se mueve.

34.2 Ecuación no lineal exacta

El torque gravitatorio respecto del soporte es −mgL sen θ y el momento de inercia de la masa puntual es mL²:

mL²θ̈ = −mgL sen θ
θ̈ = −(g/L) sen θ

No reemplazamos sen θ por θ. La aceleración angular depende de manera no lineal del estado.

34.3 Estado angular

estado = { tiempoS, anguloRad, velocidadAngularRadS }

La velocidad angular suele representarse con Ω o θ̇. En el código usaremos un nombre completo para no confundirla con una frecuencia constante.

El estado mínimo no necesita almacenar posición cartesiana: puede calcularse desde θ cuando se dibuja.

34.4 Radianes dentro del modelo

Las funciones trigonométricas de JavaScript reciben radianes. Si una interfaz solicita grados:

θrad = θgrados · π/180

Convertimos una sola vez al ingresar y mantenemos radianes en cálculos, estado e integrador. Los grados pueden recuperarse sólo para mostrar resultados.

34.5 Aceleración angular como función

function aceleracionAngular({ gravedadMps2, longitudM }, estado) {
  return -(gravedadMps2 / longitudM) * Math.sin(estado.anguloRad);
}

const parametros = { gravedadMps2: 9.81, longitudM: 1 };
const estado = {
  tiempoS: 0,
  anguloRad: 60 * Math.PI / 180,
  velocidadAngularRadS: 0
};

console.log(aceleracionAngular(parametros, estado), "rad/s²");

Para 60°, el resultado es aproximadamente −8,496 rad/s². El signo apunta hacia el equilibrio.

34.6 Posición cartesiana para dibujar

Si el soporte está en (xs, ys) y el eje vertical de la pantalla crece hacia abajo:

x = xs + L sen θ
y = ys + L cos θ
function posicionPantalla(soporte, longitudPx, anguloRad) {
  return {
    xPx: soporte.xPx + longitudPx * Math.sin(anguloRad),
    yPx: soporte.yPx + longitudPx * Math.cos(anguloRad)
  };
}

console.log(posicionPantalla({ xPx: 300, yPx: 50 }, 200, Math.PI / 6));

La longitud en píxeles pertenece a la vista; no reemplaza L en metros dentro de la ecuación física.

34.7 Velocidad lineal de la masa

La rapidez tangencial es:

v = L|θ̇|

Sus componentes, con y positiva hacia abajo, son:

vx = Lθ̇ cos θ
vy = −Lθ̇ sen θ

Estas expresiones permiten dibujar vectores o comprobar que la velocidad sea perpendicular a la varilla.

34.8 Energía mecánica

Tomando energía potencial cero en el punto más bajo:

E = ½mL²θ̇² + mgL(1 − cos θ)

Sin amortiguamiento, E debe permanecer constante en el modelo continuo. En la simulación habrá un error que depende del integrador y del paso temporal.

function energiaPendulo({ masaKg, longitudM, gravedadMps2 }, estado) {
  const cineticaJ = 0.5 * masaKg * longitudM ** 2
    * estado.velocidadAngularRadS ** 2;
  const potencialJ = masaKg * gravedadMps2 * longitudM
    * (1 - Math.cos(estado.anguloRad));
  return { cineticaJ, potencialJ, totalJ: cineticaJ + potencialJ };
}

const p = { masaKg: 0.5, longitudM: 1.2, gravedadMps2: 9.81 };
const e = { anguloRad: Math.PI / 3, velocidadAngularRadS: 0 };
console.log(energiaPendulo(p, e));

34.9 Oscilación o rotación según la energía

La energía potencial máxima en la posición superior es:

Esuperior = 2mgL
  • E < 2mgL: hay oscilación entre dos puntos de retorno.
  • E = 2mgL: caso límite ideal que se aproxima a la parte superior.
  • E > 2mgL: el modelo de varilla rígida admite rotaciones completas.

Una cuerda flexible agrega la condición de tensión no negativa y puede dejar de permanecer extendida.

34.10 Tensión de la restricción

En la dirección radial hacia el soporte:

T = m(Lθ̇² + g cos θ)

Para una varilla, T negativa representa compresión. Una cuerda no puede empujar: si el cálculo exige T < 0, el modelo de trayectoria circular con cuerda tensa deja de ser válido.

34.11 Agregar amortiguamiento angular

Podemos incluir un torque viscoso τb = −cθ̇, donde c se mide en N·m·s:

mL²θ̈ + cθ̇ + mgL sen θ = 0
θ̈ = −(g/L)sen θ − [c/(mL²)]θ̇

También puede definirse una tasa γ mediante c/(mL²) = 2γ. No debemos reutilizar un coeficiente lineal b sin convertir sus unidades.

34.12 Euler semimplícito para θ

θ̇n+1 = θ̇n + θ̈nΔt
θn+1 = θn + θ̇n+1Δt
function pasoPendulo(parametros, estado, dtS) {
  const { gravedadMps2: g, longitudM: L, gammaS1 = 0 } = parametros;
  const aceleracionRadS2 = -(g / L) * Math.sin(estado.anguloRad)
    - 2 * gammaS1 * estado.velocidadAngularRadS;
  const velocidadAngularRadS = estado.velocidadAngularRadS
    + aceleracionRadS2 * dtS;
  return {
    tiempoS: estado.tiempoS + dtS,
    anguloRad: estado.anguloRad + velocidadAngularRadS * dtS,
    velocidadAngularRadS
  };
}

const p = { gravedadMps2: 9.81, longitudM: 1, gammaS1: 0 };
const e0 = { tiempoS: 0, anguloRad: Math.PI / 3, velocidadAngularRadS: 0 };
console.log(pasoPendulo(p, e0, 0.01));

34.13 RK4 para el estado angular

Podemos aplicar RK4 al vector [θ, θ̇] usando:

dθ/dt = θ̇
dθ̇/dt = −(g/L)sen θ − 2γθ̇

Cada etapa debe evaluar el seno con su ángulo intermedio. Usar la aceleración del comienzo en las cuatro etapas reduce incorrectamente RK4 a una aproximación de orden menor.

34.14 Escala temporal y paso

El período de ángulo pequeño proporciona una referencia:

T₀ = 2π√(L/g)

Aunque una oscilación grande tenga un período mayor, expresar Δt como fracción de T₀ sigue siendo práctico. Debemos confirmar los resultados reduciendo el paso.

Cerca de la parte inferior, una rotación energética puede tener una escala todavía más rápida asociada a |θ̇|.

34.15 No normalizar el estado durante la física

Los ángulos θ, θ + 2π y θ − 2π describen la misma orientación, pero no el mismo número acumulado de vueltas.

Para dibujar podemos obtener un ángulo equivalente en (−π, π]. El integrador debería conservar el ángulo continuo si necesitamos contar rotaciones o calcular desplazamiento angular.

34.16 Detectar cruces y puntos de retorno

  • Un cruce del equilibrio ocurre cuando θ cambia de signo.
  • Un punto de retorno aparece cuando θ̇ cambia de signo.
  • Una vuelta positiva se completa cuando el ángulo continuo atraviesa otro múltiplo de 2π.

El evento sucede entre muestras. Para estimar mejor su instante podemos interpolar o usar un buscador de raíces dentro del paso.

34.17 Comparar el modelo exacto con el lineal

Exacto: θ̈ = −(g/L)sen θ
Lineal: θ̈ = −(g/L)θ

La comparación es útil si ambos modelos parten del mismo estado, usan el mismo paso y el mismo integrador. Así la separación entre curvas revela el efecto de aproximar el seno.

Con amplitudes pequeñas coinciden aproximadamente. A amplitudes mayores, el péndulo exacto tarda más y acumula diferencia de fase.

34.18 Simulación completa en JavaScript

function simularPendulo({ g, L, gamma, theta0, omega0, dt, duracion }) {
  if (g <= 0 || L <= 0 || gamma < 0 || dt <= 0 || duracion < 0) {
    throw new RangeError("Parámetros inválidos");
  }
  let t = 0, theta = theta0, omega = omega0;
  const muestras = [{ t, theta, omega }];

  while (t < duracion - 1e-12) {
    const paso = Math.min(dt, duracion - t);
    const alfa = -(g / L) * Math.sin(theta) - 2 * gamma * omega;
    omega += alfa * paso;
    theta += omega * paso;
    t += paso;
    if (![theta, omega].every(Number.isFinite)) throw new Error("Estado no finito");
    muestras.push({ t, theta, omega });
  }
  return muestras;
}

const datos = simularPendulo({ g: 9.81, L: 1, gamma: 0.02,
  theta0: 120 * Math.PI / 180, omega0: 0, dt: 0.001, duracion: 5 });
console.log({ cantidad: datos.length, estadoFinal: datos.at(-1) });

34.19 Laboratorio no lineal

La figura superior muestra el estado del péndulo exacto. La gráfica inferior compara la integración no lineal con el modelo que reemplaza sen θ por θ.

Los valores del instante seleccionado aparecen debajo.
━ Modelo no lineal┄ Modelo lineal│ Instante seleccionado
Período lineal T₀2,006 s
Ángulo exacto+60,00°
Velocidad angular0,000 rad/s
Diferencia con lineal0,000°
Energía mecánica4,905 J/kg
Tensión por unidad de masa4,905 N/kg

A 60°, el modelo lineal ya acumula una diferencia visible respecto del seno exacto.

34.20 Qué observar en el laboratorio

  • Con 5°, las curvas permanecen cercanas durante varios ciclos.
  • Con 120°, el modelo exacto completa cada ciclo más lentamente.
  • Reducí Δt para separar el error de integración de la diferencia entre modelos.
  • Agregá amortiguamiento y observá que el ángulo disminuye hacia la región donde la aproximación lineal mejora.
  • Aplicá velocidad inicial y distinguí oscilaciones de rotaciones mediante la energía.

34.21 Comprobaciones mínimas

  • En θ = 0 y θ̇ = 0, la aceleración debe ser cero.
  • Cambiar θ por −θ y θ̇ por −θ̇ debe invertir la evolución angular.
  • Con γ = 0, la energía debería permanecer aproximadamente constante.
  • Con γ > 0, la energía debe presentar una tendencia decreciente.
  • Para ángulos pequeños, el período debe acercarse a 2π√(L/g).
  • Reducir Δt debería acercar los resultados numéricos.

En el tema 35 convertiremos estas comprobaciones en un procedimiento sistemático de verificación.

34.22 Límites del modelo

El péndulo programado no incluye resistencia del aire dependiente de la rapidez, elasticidad de la cuerda, masa distribuida, movimiento del soporte ni fuerzas tridimensionales.

Para una cuerda, también debemos vigilar la tensión. Si deja de estar tensa, la masa abandona temporalmente la trayectoria circular y se necesita otro modelo con detección de eventos.

34.23 Errores frecuentes y ejercicio

  • Pasar grados a Math.sin: JavaScript espera radianes.
  • Usar −gθ/L en una simulación “exacta”: conserva la aproximación lineal.
  • Usar x = L cos θ con θ desde la vertical: intercambia las componentes.
  • Normalizar θ en cada paso: impide contar vueltas completas.
  • Confundir θ̇ con rapidez lineal: se relacionan mediante v = L|θ̇|.
  • Ignorar tensión negativa en una cuerda: la restricción circular dejó de ser válida.

Un péndulo de m = 0,5 kg y L = 1,2 m parte desde θ₀ = 60° con θ̇₀ = 0. Calculá la aceleración angular, la energía y la tensión inicial usando g = 9,81 m/s².

Ver solución y explicación
θ₀ = 60·π/180 = π/3 rad
θ̈₀ = −(9,81/1,2)sen(π/3) ≈ −7,080 rad/s²
E₀ = 0,5·9,81·1,2·(1 − cos 60°) ≈ 2,943 J
T₀ = 0,5·(1,2·0² + 9,81 cos 60°) ≈ 2,453 N
const masaKg = 0.5;
const longitudM = 1.2;
const gravedadMps2 = 9.81;
const anguloRad = 60 * Math.PI / 180;
const velocidadAngularRadS = 0;

const aceleracionAngularRadS2 = -(gravedadMps2 / longitudM)
  * Math.sin(anguloRad);
const energiaJ = 0.5 * masaKg * longitudM ** 2 * velocidadAngularRadS ** 2
  + masaKg * gravedadMps2 * longitudM * (1 - Math.cos(anguloRad));
const tensionN = masaKg * (longitudM * velocidadAngularRadS ** 2
  + gravedadMps2 * Math.cos(anguloRad));

console.log({ aceleracionAngularRadS2, energiaJ, tensionN });

34.24 Ideas para recordar

  • La ecuación exacta es θ̈ = −(g/L)sen θ.
  • El estado angular contiene tiempo, ángulo continuo y velocidad angular.
  • Los cálculos trigonométricos deben usar radianes.
  • La posición de pantalla se deriva del estado, no necesita integrarse.
  • La energía permite distinguir oscilaciones, casos límite y rotaciones.
  • Una cuerda exige tensión no negativa; una varilla también puede comprimir.
  • El modelo lineal y el no lineal divergen al crecer la amplitud.
  • El paso debe relacionarse con T₀ y comprobarse mediante refinamiento.