This solves the classical 2D wave equation
∂²u/∂t² = c²∇²u entirely on the GPU. The height field
u is stored in floating-point textures, and a fragment shader
advances every grid cell in parallel each step using a leapfrog
update with a 9-point Laplacian.
u_next = 2u − u_prev + (c·dt)²·∇²u − damping·(u − u_prev).The 2D wave equation solved numerically on a grid. Drop disturbances and watch waves propagate, reflect off boundaries and interfere. Visualise standing waves, diffraction and superposition.
Finite difference method solves ∂²u/∂t² = c²∇²u on a discrete grid. Boundary conditions can be fixed (reflecting) or absorbing (open).
Click to create disturbances. Watch waves propagate outward, reflect from walls and interfere. Add slits to observe diffraction patterns.
The wave equation was first studied by d'Alembert in 1747 for vibrating strings. It describes sound, water waves, seismic waves and electromagnetic radiation — one equation for all wave phenomena.
This simulation integrates the classical wave equation, ∂²u/∂t² = c²∇²u, in real time using an explicit finite-difference leapfrog scheme. You can switch between a 1D plucked string of 600 points and a 2D drum membrane on a 100×100 grid, both with fixed (reflecting) ends. Because each step interferes the forward and reflected waves, you can watch standing waves, harmonics and 2D ripple interference emerge from one simple update rule.
The discretised wave equation: each grid point's next displacement is found from its current and previous values plus the curvature of its neighbours, scaled by r = c². The string uses the 1D Laplacian (u[i-1] - 2u[i] + u[i+1]); the membrane uses the 4-neighbour 2D Laplacian. A damping factor multiplies each step so energy gradually decays.
Toggle "String 1D" or "Membrane 2D". Click or drag on the canvas to inject a Gaussian disturbance. The Speed slider (1–20) sets the wave speed c, and Damping (0–50) sets energy loss per step. Use "Pluck" for a single impulse, "Continuous" to drive the string sinusoidally, the Mode menu to launch a pure 1st–4th harmonic, and Reset to clear the field.
The wave equation was first written down by Jean le Rond d'Alembert in 1747 to describe a vibrating string. Its solutions split into left- and right-travelling waves, and the same equation governs sound, light, water ripples and seismic waves alike.
It solves the classical second-order wave equation, ∂²u/∂t² = c²∇²u, where u is the transverse displacement and c is the wave speed. In the string mode the Laplacian is one-dimensional; in the membrane mode it is two-dimensional. The same equation describes a guitar string, a drum skin, sound and many other waves.
It uses an explicit finite-difference leapfrog scheme. Time and space are split into a grid, and each point's next value is computed as 2u(now) - u(previous) + r times the discrete Laplacian, with r = c². This three-time-level update is the standard second-order accurate way to march the wave equation forward in time.
Speed sets the wave propagation constant c that scales the stiffness term r = c², so higher values make waves travel and oscillate faster. Damping applies a multiplicative factor just below 1 to every step, draining energy so the vibration slowly dies away, much like air resistance and internal friction in a real string or membrane.
Qualitatively, yes. The ends are held fixed, so reflections produce standing waves whose nodes match real harmonics, and selecting a mode launches a clean sine profile sin(nπx/L). It is an idealised model, however: it ignores string stiffness and dispersion, and very high speeds can exceed the scheme's stability limit and distort the result.
A localised pluck is a superposition of waves travelling both ways along the string. When each reaches a fixed end it reflects with inverted phase, and the forward and reflected waves repeatedly interfere. Only wavelengths that fit the boundary survive constructively, so the chaotic initial pulse settles into the resonant standing-wave pattern you see.