A grid, a rule, and a question
I built a small 3D universe: a grid of cells, each holding a number I call "energy," and one rule that advances time. Every step, each cell splits its value evenly among its neighbors (and itself), and any share that would fall off an edge or into a wall bounces back. That's the whole rule.
It's conservative — the total never changes. Drop 9 units of energy into the center of a 3×3 board, run one step, and every one of the nine cells holds exactly 1, summing back to 9. It's clean and hypnotic to watch, and it's tempting to read grand meaning into the patterns it makes. But the honest question isn't "what could this be?" It's "what does this system actually do?" Answering that turned into a crisp lesson about the difference between two of the most important equations in physics — and the single term that separates them.
What the rule actually is: diffusion
Run it and the story is always the same: whatever you start with, the grid smooths toward one flat value — the average. Sharp spikes vanish in a step or two; broad blobs linger longer; everything ends uniform. That endpoint is maximum entropy for a fixed total, and the process that gets there is diffusion. Formally, the rule is a discretization of the heat equation:
∂φ/∂t = D ∇²φ
— the same equation that governs heat spreading through a bar or dye dispersing in water. The ∇² (the Laplacian) is just "the average of my neighbors minus me," which is exactly what my grid computes each step.
Signed energy makes it more fun to watch: positive cells glow green, negative red, and where they meet they cancel. Put a low pocket inside a field of high energy and energy flows in (it looks like attraction); pack high cells together and it flows out (it looks like repulsion). Those flows are real — they're the same gradient-driven flux that shapes the electrostatic potential — but they are the flows of diffusion, not forces with momentum. Which raises the test that mattered most.
The measurement that settled it
The patterns move. A pulse in the center spreads outward; something looks like it's propagating. Is that momentum — a disturbance that keeps going on its own — or is it just spreading? There's a clean way to tell, and it needs no opinion.
A front driven by pure diffusion grows like √t: it decelerates. A front carried by momentum grows like t: constant speed. So I dropped a spike at the center of a large grid, tracked the RMS radius of the energy over hundreds of steps, and fit the exponent.
It came back 0.5000.
Exactly √t. Not momentum — diffusion, to four decimal places. A second check confirmed it: as the field flattens, the motion doesn't coast to a stop, it halts the instant the gradient is gone. Momentum coasts; this doesn't. Whatever the animation suggested, the number was unambiguous — and that is the point. When a simulation seems to do something profound, the exponent, the conservation law, and "does it coast?" will tell you what it is, no matter what your eyes vote for.
The one term that makes it waves
Here's the satisfying part. Diffusion is first-order in time — a single ∂/∂t — so it can only relax toward equilibrium and stop. It has no inertia. The wave equation is almost identical, with one change:
∂²φ/∂t² = c² ∇²φ
A second time derivative. In code, that means giving every cell a velocity, and treating the neighbor-average not as a target the cell jumps to, but as a restoring force it accelerates toward. I added exactly that as a second integrator over the same grid, and the behavior inverted.
Now the center-9 spike on a 3×3 doesn't snap to 1 and freeze. It falls toward 1, overshoots to −7 on its own inertia, springs back to +9, and rings — forever — energy sloshing between motion and displacement instead of dissipating. On a bigger grid you get travelling waves that move at constant speed, reflect off walls, and interfere. That stored velocity is the momentum. One term — ∂/∂t versus ∂²/∂t² — is the entire difference between heat and waves, between a system that forgets and one that remembers.
Why it looks like physics — and where that stops
Drop the wave version into a central "well" (a potential that grows outward, trapping the field near the middle) and it settles into standing modes whose shapes look uncannily like atomic orbitals: a nodeless blob, a two-lobed dumbbell with a green side and a red side. That resemblance is real, and it has an honest cause. The Laplacian is the shared backbone of the heat equation, the wave equation, and the kinetic term of Schrödinger's equation. Same operator, same eigenmode shapes. A p-orbital and my two-lobed standing wave are both eigenfunctions of (−∇² + potential) — so of course they rhyme.
But resembles is not is, and the gap is worth stating plainly. To actually be a hydrogen atom, you need the Schrödinger equation — a complex probability amplitude evolving first-order in time via i·ℏ·∂ψ/∂t — neither of which a real scalar wave has. To be a proton you need quantum chromodynamics: quarks, gluons, color charge, confinement — none of which my grid contains. The model borrows the shapes (the spatial eigenmodes) and none of the quantum dynamics. It is a standing-wave analog of an orbital, not a simulation of matter. Saying that clearly is more useful than any hand-wave, and it's the difference between a demo you understand and one you're fooling yourself about.
The takeaway
If you build a simulation and it seems to touch something deep, the useful question isn't whether the patterns are beautiful — they usually are — but what the system actually is. Two habits did all the work here. Measure the signature — an exponent, a conserved quantity, whether motion coasts — instead of trusting the animation. And name the boundary where a resemblance stops being an identity. The reward is that you understand exactly what you built: in this case, a clean, conservative diffusion engine that becomes a wave engine with one extra time derivative, and rhymes with real physics for a precise and limited reason.
It's open source and runs in the browser if you want to poke at it — the code is at github.com/hexcreator/physics and a live demo is at hexcreator.github.io/physics. Flip the integrator between Diffusion and Wave and watch the same grid either forget or ring.