# Pendulum ## Microsim ### Live player <div class="microsim-player"> <iframe src="https://editor.p5js.org/sciencenibber/full/vtdlSNRup" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe> </div> <div class="microsim-fallback"> <img src="Microsims/thumbs/Pendulum.png" alt="Pendulum microsim poster" style="width:100%;border:1px solid #4445;border-radius:6px;"> <p><em>Live microsim (desktop) · <a href="https://editor.p5js.org/sciencenibber/sketches/vtdlSNRup">open sketch in the p5.js editor</a></em></p> </div> **Editor URL:** https://editor.p5js.org/sciencenibber/sketches/vtdlSNRup **Description (100 words):** A live simple gravity pendulum integrated by [[Velocity|velocity]]-Verlet on the angular variables. Five sliders sweep the design — rod length L, bob mass m, gravity g, damping b, and release angle theta0 — and the simulation re-arms automatically whenever theta0 is dragged. The right-hand panel shows the swinging rig with a fading trail; the lower-left plots the (theta, theta_dot) phase portrait whose closed orbit at b = 0 collapses into a spiral as damping rises; the lower-right scope traces theta(t) and theta_dot(t). Live readouts give omega_0, the small-angle T0, the elliptic-corrected exact period, and KE/PE/E. ```js // ===================================================================== // Wikitube microsim - Pendulum // Slug: Pendulum // URL: en.wikitube.io/wiki/Pendulum // Pattern: A reskin - Classical mechanics constructions (Energy room) // // What it shows // The simple gravity pendulum // // theta'' + (b/I) theta' + (g/L) sin(theta) = 0, I = m L^2 // // integrated with velocity-Verlet on the angular variables. Five // sliders sweep the design (length, mass, gravity, damping) plus the // initial release angle. A live pendulum animation sits at the right // under the HUD; below it sit the (theta, theta_dot) phase portrait // and a time scope showing theta(t) and theta_dot(t). Three energy // readouts show kinetic, potential, and total mechanical energy so // the reader can watch conservation hold (b = 0) or bleed away under // damping. // // The footer compares the small-angle period T0 = 2 pi sqrt(L/g) to // the exact large-amplitude period via the leading elliptic-integral // expansion T = T0 * (1 + theta0^2/16 + 11 theta0^4/3072 + ...). // // Controls // L length of rod (m) // m bob mass (kg) // g gravitational accel (m/s^2) // b damping coefficient (kg m^2 / s) // theta0 release angle (rad) // reset restores theta = theta0, theta_dot = 0, t = 0 // // Pitfall guards (see Skills/P5js .../pitfalls.md) // - p5.disableFriendlyErrors = true no FES noise in the editor // - all canvas-side strings are ASCII; Unicode lives in comments only // - sliders sit in a dedicated left column so the thumb never floats // over a readout line // ===================================================================== const ARTICLE = "Pendulum"; p5.disableFriendlyErrors = true; // ---------- Energy palette (per Articles/P5_JS_EDITOR.md, section 4) - const BG = 18; const FG = 240; const HOT = [220, 110, 60]; // gravity arrow on the bob const COLD = [ 60, 130, 220]; // theta(t) trajectory const STRUCT = [120, 130, 150]; // pivot, ground line, axes const TRAJ = [240, 220, 80]; // pendulum bob and current-state dot const GAUGE = [120, 220, 140]; // theta_dot(t) trace and gauges // ---------- DOM controls (created in setup()) ---------- let LSlider, mSlider, gSlider, bSlider, theta0Slider, resetBtn; // ---------- Integration state ---------- // theta is measured CCW from the downward vertical (so theta = 0 means // the bob hangs straight down; theta > 0 tilts the bob to the right // when looking at the canvas). let theta = 0.6; // rad let omega = 0.0; // rad/s let t = 0; // s let lastT0 = 0.6; // remembers theta0 so a slider drag re-arms theta const buf = []; // ring buffer of {t, theta, omega} // ---------- Layout constants (set in setup()) ---------- let PIVOT_X, PIVOT_Y; let PHASE_X, PHASE_Y, PHASE_W, PHASE_H; let SCOPE_X, SCOPE_Y, SCOPE_W, SCOPE_H; function setup() { createCanvas(720, 520); pixelDensity(2); // Pivot sits in the top-right quadrant. The bob hangs below it; the // arc of swing extends to either side. With L_max = 2.5 m and the // L_PX = L * 50 mapping, the bob extends 125 px max below the pivot. PIVOT_X = 520; PIVOT_Y = 90; // Phase portrait, bottom-left PHASE_X = 180; PHASE_Y = 250; PHASE_W = 260; PHASE_H = 230; // Scope panel, bottom-right SCOPE_X = 460; SCOPE_Y = 250; SCOPE_W = 250; SCOPE_H = 230; // ---------- Sliders, stacked in the left control column ---------- // Defaults: a 1 m rod under Earth gravity, a 30 deg release, light // damping. The reader sees a clean, slowly decaying swing with // tidy phase-portrait spirals and an obvious natural period. LSlider = createSlider(0.2, 2.5, 1.0, 0.05).position(20, 82).size(140); mSlider = createSlider(0.1, 5.0, 1.0, 0.1 ).position(20, 117).size(140); gSlider = createSlider(1.0, 25, 9.81, 0.01).position(20, 152).size(140); bSlider = createSlider(0, 1.5, 0.1, 0.01).position(20, 187).size(140); theta0Slider = createSlider(-3.0, 3.0, 0.6, 0.02).position(20, 222).size(140); resetBtn = createButton("reset"); resetBtn.position(20, 258); resetBtn.mousePressed(resetState); } function resetState() { theta = theta0Slider.value(); omega = 0.0; t = 0; buf.length = 0; lastT0 = theta; } // ===================================================================== // MAIN DRAW LOOP // ===================================================================== function draw() { background(BG); // ---------- Read controls once per frame ---------- const L = LSlider.value(); const m = mSlider.value(); const g = gSlider.value(); const b = bSlider.value(); const theta0 = theta0Slider.value(); // Cap dt so a paused tab cannot blow up the integrator on resume const dt = min(deltaTime / 1000, 0.05); // If the reader drags the theta0 slider, re-arm the simulation // automatically. This makes the slider feel "live" without forcing // the user to hit reset every time. if (abs(theta0 - lastT0) > 1e-6) { theta = theta0; omega = 0; t = 0; buf.length = 0; lastT0 = theta0; } // ---------- Derived quantities ---------- // Small-amplitude angular frequency and period: // omega_0 = sqrt(g/L), T0 = 2 pi sqrt(L/g) // Plus the leading two corrections of the exact pendulum period // T(theta0) = T0 * (1 + theta0^2/16 + 11 theta0^4/3072 + ...) // (the full expression is T = (4/omega_0) K(sin(theta0/2))). const omega0 = sqrt(g / L); const T0 = TWO_PI / omega0; const a2 = theta0 * theta0; const a4 = a2 * a2; const Texact = T0 * (1 + a2 / 16 + 11 * a4 / 3072); // ---------- Velocity-Verlet integration step ---------- // Equation of motion (Newton's second law for rotations): // I theta'' = -m g L sin(theta) - b theta' // with I = m L^2. Dividing through gives // theta'' = -(g/L) sin(theta) - (b/I) theta'. // Velocity-Verlet is symplectic, so total mechanical energy stays // honest in the conservative limit (b = 0); under damping it // monotonically decreases as it should. const I = m * L * L; const acc1 = -(g / L) * sin(theta) - (b / I) * omega; omega += 0.5 * acc1 * dt; theta += omega * dt; t += dt; const acc2 = -(g / L) * sin(theta) - (b / I) * omega; omega += 0.5 * acc2 * dt; // ---------- Trajectory bookkeeping ---------- buf.push({ t: t, theta: theta, omega: omega }); while (buf.length > 800) buf.shift(); // ---------- Energies (instantaneous) ---------- // Use the lowest point of the swing as PE = 0 (the natural choice // for a hanging pendulum). Then PE = m g L (1 - cos(theta)) is // always non-negative, and KE = (1/2) I theta_dot^2. const KE = 0.5 * I * omega * omega; const PE = m * g * L * (1 - cos(theta)); const E = KE + PE; // ---------- Render in stacking order: structure -> data -> HUD ---- drawPendulumRig(L, m, g); drawPhasePortrait(); drawScope(); drawSliderLabels(); drawReadouts(omega0, T0, Texact, KE, PE, E); drawHud(); drawEquationFooter(); } // ===================================================================== // PENDULUM RIG pivot, rod, bob, gravity arrow, swing trail // ===================================================================== function drawPendulumRig(L, m, g) { const L_PX = L * 50; // 50 px per metre const bobX = PIVOT_X + L_PX * sin(theta); const bobY = PIVOT_Y + L_PX * cos(theta); // Mounting bracket above the pivot - a small filled triangle so the // pivot reads as fixed noStroke(); fill(...STRUCT); triangle(PIVOT_X - 12, PIVOT_Y - 14, PIVOT_X + 12, PIVOT_Y - 14, PIVOT_X, PIVOT_Y); // Hatching above the bracket stroke(...STRUCT); strokeWeight(1); for (let i = -16; i <= 16; i += 6) { line(PIVOT_X + i, PIVOT_Y - 14, PIVOT_X + i - 5, PIVOT_Y - 22); } // Faint reference arc - the path the bob traces at the current L noFill(); stroke(...STRUCT, 80); strokeWeight(1); arc(PIVOT_X, PIVOT_Y, 2 * L_PX, 2 * L_PX, HALF_PI - 1.3, HALF_PI + 1.3); // Vertical reference (theta = 0) - faint dashed line stroke(...STRUCT, 60); for (let y = PIVOT_Y; y < PIVOT_Y + L_PX + 8; y += 6) { line(PIVOT_X, y, PIVOT_X, y + 3); } // Swing trail from the buffer - the most recent samples, drawn with // a fading alpha so the eye sees recent motion without clutter. if (buf.length >= 2) { noFill(); const tail = min(buf.length, 120); for (let i = buf.length - tail; i < buf.length - 1; i++) { const a = map(i, buf.length - tail, buf.length - 1, 30, 180); const s1 = buf[i]; const s2 = buf[i + 1]; const x1 = PIVOT_X + L_PX * sin(s1.theta); const y1 = PIVOT_Y + L_PX * cos(s1.theta); const x2 = PIVOT_X + L_PX * sin(s2.theta); const y2 = PIVOT_Y + L_PX * cos(s2.theta); stroke(...TRAJ, a); strokeWeight(1.4); line(x1, y1, x2, y2); } } // The rod stroke(...STRUCT); strokeWeight(2); line(PIVOT_X, PIVOT_Y, bobX, bobY); // The pivot itself (drawn after the rod so the joint reads cleanly) noStroke(); fill(...STRUCT); circle(PIVOT_X, PIVOT_Y, 8); // The bob - radius scales gently with mass so heavier looks heavier const rad = constrain(8 + 4 * sqrt(m), 8, 24); noStroke(); fill(...TRAJ); circle(bobX, bobY, 2 * rad); // Gravity arrow on the bob (length proportional to g, capped) const gPx = constrain(g * 2.0, 8, 50); stroke(...HOT); strokeWeight(2); noFill(); line(bobX, bobY + rad, bobX, bobY + rad + gPx); line(bobX, bobY + rad + gPx, bobX - 4, bobY + rad + gPx - 5); line(bobX, bobY + rad + gPx, bobX + 4, bobY + rad + gPx - 5); noStroke(); fill(...HOT); textSize(10); textAlign(LEFT, TOP); text("g", bobX + 6, bobY + rad + gPx - 6); // Small caption beside the rod's midpoint const midX = (PIVOT_X + bobX) / 2; const midY = (PIVOT_Y + bobY) / 2; noStroke(); fill(...STRUCT); textSize(11); textAlign(LEFT, CENTER); text("theta = " + nf(theta, 1, 2) + " rad", midX + 10, midY); } // ===================================================================== // PHASE PORTRAIT trajectory in the (theta, theta_dot) plane // ===================================================================== function drawPhasePortrait() { push(); translate(PHASE_X, PHASE_Y); // Panel frame and crosshairs noFill(); stroke(...STRUCT, 80); strokeWeight(1); rect(0, 0, PHASE_W, PHASE_H); line(0, PHASE_H / 2, PHASE_W, PHASE_H / 2); line(PHASE_W / 2, 0, PHASE_W / 2, PHASE_H); // Map: theta in [-3.2, 3.2] -> x; omega in [-10, 10] rad/s -> y // (y inverted because canvas y grows downward). if (buf.length >= 2) { noFill(); stroke(...COLD); strokeWeight(1.4); beginShape(); for (const s of buf) { const px = map(s.theta, -3.2, 3.2, 0, PHASE_W); const py = map(s.omega, -10, 10, PHASE_H, 0); vertex(px, py); } endShape(); } // Current state dot - the eye locks onto "now" const last = buf[buf.length - 1]; if (last) { const px = map(last.theta, -3.2, 3.2, 0, PHASE_W); const py = map(last.omega, -10, 10, PHASE_H, 0); noStroke(); fill(...TRAJ); circle(px, py, 7); } // Panel + axis labels noStroke(); fill(...STRUCT); textSize(11); textAlign(LEFT, TOP); text("phase portrait (theta, theta_dot)", 8, 8); textAlign(RIGHT, TOP); text("theta_dot", PHASE_W / 2 - 4, 4); textAlign(RIGHT, BOTTOM); text("theta", PHASE_W - 6, PHASE_H / 2 - 2); pop(); } // ===================================================================== // TIME SCOPE theta(t) in cyan, theta_dot(t) in green // ===================================================================== function drawScope() { push(); translate(SCOPE_X, SCOPE_Y); // Panel border + zero line noFill(); stroke(...STRUCT, 80); strokeWeight(1); rect(0, 0, SCOPE_W, SCOPE_H); line(0, SCOPE_H / 2, SCOPE_W, SCOPE_H / 2); if (buf.length >= 2) { const tMin = buf[0].t; const tMax = buf[buf.length - 1].t; // theta(t) trace - cyan noFill(); stroke(...COLD); strokeWeight(1.6); beginShape(); for (const s of buf) { vertex(map(s.t, tMin, tMax, 0, SCOPE_W), map(s.theta, -3.2, 3.2, SCOPE_H, 0)); } endShape(); // theta_dot(t) trace - green noFill(); stroke(...GAUGE, 200); strokeWeight(1.2); beginShape(); for (const s of buf) { vertex(map(s.t, tMin, tMax, 0, SCOPE_W), map(s.omega, -10, 10, SCOPE_H, 0)); } endShape(); } // Legend noStroke(); textSize(11); textAlign(LEFT, TOP); fill(...COLD); text("theta(t)", 8, 8); fill(...GAUGE); text("theta_dot(t)", 64, 8); fill(...STRUCT); textAlign(LEFT, BOTTOM); text("time ->", 8, SCOPE_H - 6); pop(); } // ===================================================================== // SLIDER LABELS drawn as canvas text so they sit ABOVE each slider // ===================================================================== function drawSliderLabels() { noStroke(); fill(...STRUCT); textSize(11); textAlign(LEFT, BOTTOM); text("L (m)", 20, 78); text("m (kg)", 20, 113); text("g (m/s^2)", 20, 148); text("b (kg m^2 / s)", 20, 183); text("theta0 (rad)", 20, 218); } // ===================================================================== // LIVE READOUTS natural freq, periods, and the energy ledger // ===================================================================== function drawReadouts(omega0, T0, Texact, KE, PE, E) { noStroke(); textSize(12); textAlign(LEFT, BOTTOM); // Period readouts: small-angle vs first-correction "exact" fill(...GAUGE); text("omega_0 = " + nf(omega0, 1, 2) + " rad/s", 16, 308); text("T0 = " + nf(T0, 1, 3) + " s", 16, 326); text("T(theta0)= " + nf(Texact, 1, 3) + " s", 16, 344); // Energy ledger - color coded so KE / PE / total stand apart fill(...TRAJ); text("KE = " + nf(KE, 1, 2) + " J", 16, 362); fill(...HOT); text("PE = " + nf(PE, 1, 2) + " J", 16, 380); fill(...COLD); text("E = " + nf(E, 1, 2) + " J", 16, 398); } // ===================================================================== // HUD title, URL line, control hint - the "watermark" per standard // ===================================================================== function drawHud() { noStroke(); // Top-left: human-readable article title fill(FG); textSize(20); textAlign(LEFT, TOP); text("Pendulum", 16, 10); // URL line below the title (per Betterfire Standard) fill(170); textSize(12); text("Wikitube microsim - en.wikitube.io/wiki/" + ARTICLE, 16, 36); // Top-right: control hint - inputs line, then integrator line fill(170); textSize(11); textAlign(RIGHT, TOP); text("sliders: L, m, g, b, theta0 reset re-arms theta = theta0", width - 14, 12); text("velocity-Verlet on theta'' + (b/I) theta' + (g/L) sin(theta) = 0", width - 14, 28); } // ===================================================================== // EQUATION FOOTER bottom-right, ASCII only (see pitfalls.md) // ===================================================================== function drawEquationFooter() { noStroke(); fill(120); textSize(11); textAlign(RIGHT, BOTTOM); text("T0 = 2 pi sqrt(L/g) | " + "T(theta0) = T0 (1 + theta0^2/16 + 11 theta0^4/3072 + ...)", width - 14, height - 6); } ``` ## Links (Wikipedia order) <!-- injected from _registry/childlinks/Pendulum.json (2026-07-30T02:09:12Z) --> `Accelerometer` · [[Age_of_Enlightenment]] · `Albert_A._Michelson` · `Albert_Einstein` · [[Alloy]] · `Altiplano` · `American_Journal_of_Physics` · `Amplitude` · `Anchor_escapement` · `And_yet_it_moves` · `Andes` · `Angle` · `Archimedes'_principle` · `Astronomers_Monument` · `Atmospheric_pressure` · `Atomic_clock` · `Balance_wheel` · `Bandwidth_(signal_processing)` · `Barton's_pendulums` · `Berlin_Observatory` · `Big_Ben` · `Bob_(physics)` · `Bowling_ball` · `Brass` · `Buoyancy` · `Burning_of_Parliament` · `Butterfly_effect` · [[Calculus]] · `Cayenne` · `Celatone` · `Censer` · `Center_of_mass` · `Center_of_percussion` · `Centrifugal_force` · [[Chaos_theory]] · [[Christiaan_Huygens]] · `Christopher_Wren` · `Classical_liberalism` · `Clock` · `Conical_pendulum` · `Conservation_of_energy` · [[Control_system]] · `Creep_(deformation)` · `Crystal_oscillator` · `Cycloid` · [[Damping]] · `Daniel_Bernoulli` · `Day` · `De_motu_antiquiora` · `Dialogue_Concerning_the_Two_Chief_World_Systems` · `Discourse_on_Comets` · `Discourse_on_the_Tides` · `Dominique,_comte_de_Cassini` · `Double_inverted_pendulum` · `Double_pendulum` · `Doubochinski's_pendulum` · `Dowsing` · [[Dynamics_(mechanics)]] · `Earthquake` · `Edgar_Allan_Poe` · `Edmund_Beckett,_1st_Baron_Grimthorpe` · `Edward_Bernard` · `Edward_Sabine` · `Electric_spark` · `Elinvar` · `Equations_of_motion` · `Equator` · `Equivalence_principle` · `Escapement` · `Figure_of_the_Earth` · `Florence` · `Fluid_mechanics` · `Foucault_pendulum` · `Francesco_Carlini` · `Francis_Bacon` · `French_Academy_of_Sciences` · `French_Guiana` · `Frequency` · `Friction` · `Furuta_pendulum` · `Fused_quartz` · `Gabriel_Mouton` · `Galilean_invariance` · `Galilean_moons` · `Galilean_transformation` · `Galileo's_Daughter` · `Galileo's_Dream` · `Galileo's_Leaning_Tower_of_Pisa_experiment` · `Galileo's_escapement` · `Galileo's_objective_lens` · `Galileo's_paradox` · `Galileo's_ship` · `Galileo_(1968_film)` · `Galileo_(1975_film)` · `Galileo_(spacecraft)` · `Galileo_Galilei` · `Galileo_Galilei_(opera)` · `Galileo_National_Telescope` · `Galileo_affair` · `Galileo_project` · `Galileo_thermometer` · `Gauss's_law_for_gravity` · `Geodesy` · `Geographical_pole` · `George_Graham_(clockmaker)` · `George_Skene_Keith` · `Grandfather_clock` · `Gravimetry` · `Gravitational_acceleration` · `Gravity` · `Gravity_of_Earth` · `Gridiron_pendulum` · `Gyroscope` · `Han_dynasty` · `Harmonic_oscillator` · `Harmonograph` · `Harry_Clarke` · `Henry_Kater` · `Horologium_(constellation)` · `Horologium_Oscillatorium` · `Hudibras` · `Hugh_Chisholm` · `Ibn_Yunus` · `Incense` · `Inch` · `Inch_of_mercury` · `Inertia` · `Inertia_wheel_pendulum` · `Inertial_platform` · `Injection_locking` · `Invar` · `Inverted_pendulum` · `Isaac_Beeckman` · [[Isaac_Newton]] · `James_George_Joseph_Penderel-Brodhurst` · `James_Steuart_(economist)` · `Jean-Charles_de_Borda` · `Jean_Picard` · `Jean_Richer` · `John_Harrison` · `John_Henry_Poynting` · `John_Milton_Visiting_Galileo_When_a_Prisoner_of_the_Inquisition` · `John_Riggs_Miller` · `Juan_Antonio_Llorente` · `Kapitza's_pendulum` · `Kater's_pendulum` · `Lamp_At_Midnight` · `Latitude` · `Le_Mecaniche` · `Length` · `Letter_to_Benedetto_Castelli` · `Letter_to_the_Grand_Duchess_Christina` · `Letters_on_Sunspots` · `Life_of_Galileo` · `Ligne` · `Lucien_LaCoste` · `Mainspring` · `Mantel_clock` · `Maria_Celeste` · `Marin_Mersenne` · `Marina_Gamba` · `Marquis_de_Condorcet` · `Mass` · `Mathematics` · `Max_Schuler` · `Mechanical_equilibrium` · [[Mercury_(element)]] · `Meridian_(geography)` · `Meridian_arc` · `Metre` · `Metre_per_second_squared` · `Metric_system` · `Metronome` · `Michelagnolo_Galilei` · `Michelson_interferometer` · `Mode_locking` · `Moment_of_inertia` · `Movement_(clockwork)` · `Museo_Galileo` · `Neo-Latin` · [[Nickel]] · `North_Pole` · `Observational_astronomy` · `Ole_Rømer` · [[Ordinary_differential_equation]] · `Pendulum_(disambiguation)` · `Pendulum_(mechanics)` · `Pendulum_clock` · `Pendulum_wave` · `Phases_of_Venus` · `Philosophiæ_Naturalis_Principia_Mathematica` · [[Physical_system]] · [[Physics]] · `Pierre_Bouguer` · `Pisa_Cathedral` · `Pisa_International_Airport` · `Planet` · `Primary_standard` · `Pulse` · `Q_factor` · `Quantum_pendulum` · `Quartz` · `Quartz_clock` · `Rayleigh–Lorentz_pendulum` · `Renaissance` · `René_Descartes` · `Restoring_force` · `Riefler_escapement` · `Rigid_body` · `Robert_Hooke` · `Roger_G._Newton` · `Ronald_Edward_Zupko` · `Royal_Society` · `Samuel_Butler_(poet)` · `Santorio_Santorio` · `Schuler_tuning` · `Science_education` · `Scientific_instrument` · `Sea_level` · `Second` · `Seconds_pendulum` · `Sector_(instrument)` · `Seismometer` · `Sidereus_Nuncius` · [[Simple_harmonic_motion]] · `Skagen` · `Spanish_Inquisition` · `Speed_of_light` · `Spherical_pendulum` · `Spring_(device)` · `Square_root` · `Starry_Messenger_(picture_book)` · [[Steel]] · `Strappado` · `Surveying` · `The_Assayer` · `The_Pit_and_the_Pendulum` · `Thermal_expansion` · `Thermoscope` · `Thomas_Jefferson` · `Thomas_Young_(scientist)` · `Thurible` · `Toise` · `Torr` · `Torture` · `Tribune_of_Galileo` · `Turret_clock` · `Two_New_Sciences` · `Unit_of_length` · `United_States_Coast_and_Geodetic_Survey` · `Verge_escapement` · `Villa_Il_Gioiello` · `Vincenzo_Galilei` · `Vincenzo_Gamba` · `Vincenzo_Viviani` · `WWV_(radio_station)` · [[Wayback_Machine]] · `Weight` · `Wigwag_(railroad)` · `Wrecking_ball` · `Yard` · `Zhang_Heng` · [[Zinc]] ## From the Real GENERATIVE library ![Pendulum](https://upload.wikimedia.org/wikipedia/commons/thumb/b/b2/Simple_gravity_pendulum.svg/300px-Simple_gravity_pendulum.svg.png) *Pendulum — placed from the Real G.E.N.E.R.A.T.I.V.E. course library (STEM and Music room). Source: Wikimedia Commons (via Wikipedia article media). [Details & license](https://commons.wikimedia.org/wiki/File:Simple_gravity_pendulum.svg).* ![Animated: Pendulum](https://upload.wikimedia.org/wikipedia/commons/4/45/Double-compound-pendulum.gif) *Animated: Pendulum — placed from the Real G.E.N.E.R.A.T.I.V.E. course library (STEM and Music room). Source: Wikimedia Commons (via Wikipedia article media). [Details & license](https://commons.wikimedia.org/wiki/File:Double-compound-pendulum.gif).* > A pendulum is a device made of a weight suspended from a pivot so that it can swing freely.[1] When a pendulum is displaced sideways from its resting, equilibrium position, it is subject to a restoring force due to gravity that will accelerate it back toward the equilibrium position. When released, the restoring force acting on the pendulum's mass causes it ([Wikipedia](https://en.wikipedia.org/wiki/Pendulum)) <!-- REAL-GENERATIVE-MEDIA:END --> <!-- LOCAL-MEDIA-PASS:START --> ## From the vault media library !Pendulum thumb.png *Pendulum — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.* <!-- LOCAL-MEDIA-PASS:END --> ## Media (PD/CC) <!-- MEDIA-DEPLOY:Pendulum/Double-compound-pendulum.gif --> !Gif Library/Pendulum/Double-compound-pendulum.gif *Double-compound-pendulum.gif · Public domain* <!-- /MEDIA-DEPLOY --> <!-- SIGN-SYSTEMS:START --> **Semiotic universals** (the notations and alphabet letters this article speaks — each opens its canonical card): energy · damping · amplitude · conservation · flow. Index: the glyph gallery · SEMIOTICS PORTAL. <!-- SIGN-SYSTEMS:END --> > **Room:** [[Energy]] · **Status:** ✅ shipped ## Overview A pendulum is a weight suspended from a pivot so it can swing freely under gravity. When pulled aside and released, gravity restores it toward the equilibrium directly beneath the pivot, but inertia carries it past, producing the back-and-forth motion that defines the device. The simple gravity pendulum — a point mass on a massless rod — obeys the nonlinear equation of motion `theta_ddot + (g/L) sin(theta) = 0`, with the small-angle approximation `sin(theta) approx theta` reducing it to [[Simple_harmonic_motion|simple harmonic motion]] of period `T = 2*pi*sqrt(L/g)`, independent of amplitude and mass. For larger swings the period lengthens, given exactly by a complete elliptic integral of the first kind. Galileo first noted the isochronism of small oscillations around 1602, and [[Christiaan_Huygens|Christiaan Huygens]] turned the observation into the pendulum clock in 1656, the most accurate timekeeper for nearly three centuries. Pendulums also detect the rotation of the [[Earth]] (Foucault, 1851), measure local gravity (geodetic surveying), seed seismographs, and form the testbed for nearly every introductory treatment of energy conservation, [[Damping|damping]], forced [[Oscillation|oscillation]], and the route to deterministic chaos through the driven double pendulum. ## See also - Room hub: [[Energy]] - p5.js Editor conventions: P5 JS EDITOR - Wiki root: MAIN --- *Scaffolded by `generative-microsim` from row 0 of the Energy sheet on 2026-04-30T07:24:37Z.* Letters: energy · damping · amplitude · conservation · flow · oscillation · rotation · harmonic <!-- REAL-GENERATIVE-MEDIA:START --> <!-- CRAFT-LINK:START g12 --> *Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].* <!-- CRAFT-LINK:END --> <!-- MATTERSIM:BEGIN g33 — Matter & Energy Cluster microsim (framework build, specs/sims/Pendulum.json); do not hand-edit inside --> **Microsim — three.js (Wikitube framework):** *Pendulum* <div class="wt-sim" data-src="https://wikitube-3d-microsims.netlify.app/matter/Pendulum.html" data-title="Pendulum"></div> *Built from `MICROSIM_GUIDE/specs/sims/Pendulum.json`; part of the [[PORTAL_Matter|Matter portal]] spine (section sims and See-also variants).* <!-- MATTERSIM:END --> ## Wikipedia : Wikitube **Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Pendulum) : [Wikitube](https://en.wikitube.io/wiki/Pendulum) ## Previous hub tags Tree parents: [[Dynamical_system]] · [[Phase_space]]. Legacy hubs: `GENERATIVE`. --- *Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*