# Binding energy
<!-- MICROSIMGEN:BEGIN v1.7 — generated by g08_place_microsims.py; three.js first (§15); do not hand-edit inside -->
## Microsims — three.js
### Binding energy (three.js)
<div class="microsim-player">
<iframe src="https://wikitube-3d-microsims.netlify.app/Binding_energy.html" width="100%" height="620" frameborder="0" loading="lazy" sandbox="allow-scripts allow-same-origin" title="Binding energy — three.js microsim"></iframe>
</div>
**Open it full-screen:** [Binding_energy.html](https://wikitube-3d-microsims.netlify.app/Binding_energy.html) · library `threejs` · route `microsim/threejs/`
### Related microsims
Live sims on neighbouring articles:
- [[Entropy]]
- [[Kinetic_theory_of_gases]]
- [[Second_law_of_thermodynamics]]
*Sim hosted off-article; the article owns the reference, not the runtime (WIKI_RULES §10.4). Placed by `g08_place_microsims.py`.*
<!-- MICROSIMGEN:END -->
## Microsim
### Live player
<div class="microsim-player">
<iframe src="https://editor.p5js.org/sciencenibber/full/qRQ8UgF6G" width="100%" height="620" frameborder="0" sandbox="allow-scripts allow-same-origin"></iframe>
</div>
<div class="microsim-fallback">
<img src="Microsims/thumbs/Binding_energy.png" alt="Binding_energy 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/qRQ8UgF6G">open sketch in the p5.js editor</a></em></p>
</div>
**Editor URL:** https://editor.p5js.org/sciencenibber/sketches/qRQ8UgF6G
**Description (100 words):**
The microsim plots binding energy per nucleon B/A against mass number A from 1 to 260, computed live from the Bethe-Weizsacker semi-empirical mass formula. Five sliders weight the volume, surface, Coulomb, asymmetry, and pairing terms; the curve reshapes in real time as the reader changes them. Green dots mark measured B/A for He-4, C-12, O-16, Fe-56, Sn-120, and U-235, with a magenta line at the 8.79 MeV iron peak. A yellow draggable marker reads off A, Z, total B, and B/A; warm-toned curve segments mark the fusion side, cool-toned the fission side.
```js
// =====================================================================
// Binding_energy.js -- Wikitube microsim
// Article: Binding_energy en.wikitube.io/wiki/Binding_energy
// Room: Helium Pattern: D (parametric curves,
// efficiency analysis)
// ---------------------------------------------------------------------
// Idea: an interactive binding-energy-per-nucleon curve B/A as a
// function of mass number A, computed live from the Bethe-Weizsacker
// semi-empirical mass formula (SEMF). Five sliders expose the five
// SEMF coefficients -- volume, surface, Coulomb, asymmetry, pairing --
// and the reader watches the canonical "iron peak" curve reshape as
// the underlying terms are weighted differently.
//
// The SEMF (MeV):
//
// B(A, Z) = aV * A
// - aS * A^(2/3)
// - aC * Z*(Z-1) / A^(1/3)
// - aA * (A - 2*Z)^2 / A
// + delta(A, Z)
//
// delta = + aP / sqrt(A) if A even and Z even
// 0 if A odd
// - aP / sqrt(A) if A even and Z odd
//
// Z(A) is taken on the line of beta stability, the SEMF minimum:
//
// Z(A) ~ A / (2 + 0.0155 * A^(2/3))
//
// Canonical coefficient set (Kaplan / Krane textbook fit, MeV):
// aV = 15.75, aS = 17.80, aC = 0.711, aA = 23.70, aP = 11.18
//
// Famous landmarks shown on the curve:
// * He-4 (A=4, B/A ~ 7.07 MeV) -- doubly magic alpha particle
// * C-12 (A=12, B/A ~ 7.68 MeV)
// * O-16 (A=16, B/A ~ 7.98 MeV) -- doubly magic
// * Fe-56 (A=56, B/A ~ 8.79 MeV) -- the iron peak
// * U-235 (A=235, B/A ~ 7.59 MeV) -- fission fuel
// * U-238 (A=238, B/A ~ 7.57 MeV)
//
// The peak around Fe-56 is the physical reason that fusion releases
// energy for A < 56 (going right toward the peak) and fission releases
// energy for A > 56 (going left toward the peak). The microsim makes
// this geometric: the reader drags a marker along the curve, and any
// motion toward the peak is exoergic.
//
// Visual layout (720 x 520 canvas):
// * top-left: HUD title + en.wikitube.io/wiki/Binding_energy
// * top-right: control hints (drag marker, sliders rescale curve)
// * center: B/A vs A curve, A x-axis 1-260, B/A y-axis 0-10 MeV
// * landmark dots labeled inline (He-4, C-12, O-16, Fe-56, U-238)
// * the reader's marker is a yellow draggable dot
// * bottom-left: 5 sliders for the 5 SEMF coefficients
// * bottom-right: live (A, Z, B, B/A) readout + canonical equation
//
// Conventions (Wikitube Betterfire Standard v0):
// * single ARTICLE constant at the top, single quotes
// * p5.disableFriendlyErrors = true to keep the editor console clean
// * non-ASCII (Greek delta, dots, arrows) lives in COMMENTS ONLY;
// every text() string literal is ASCII
// * Energy-room palette (P5_JS_EDITOR section 4): dark BG, HOT/COLD
// tones, STRUCT grey, TRAJ accent
// =====================================================================
const ARTICLE = 'Binding_energy';
const TITLE = ARTICLE.replace(/_/g, ' ');
p5.disableFriendlyErrors = true;
// ----- Energy room palette (P5_JS_EDITOR section 4) ------------------
const BG = 18;
const FG = 240;
const DIM = [240, 240, 240, 140];
const HOT = [220, 110, 60]; // fusion side (light nuclei)
const COLD = [60, 130, 220]; // fission side (heavy nuclei)
const STRUCT = [120, 130, 150]; // axes, grid scaffold
const TRAJ = [240, 220, 80]; // reader's draggable marker
const SCRATCH = [120, 120, 120, 90]; // light grid lines
const ACCENT = [200, 100, 220]; // iron-peak highlight
const LANDMK = [120, 220, 140]; // famous-nucleus dots
// ----- SEMF canonical coefficients (MeV) -----------------------------
// Kaplan / Krane fit; sliders below let the reader perturb them.
const AV_DEF = 15.75;
const AS_DEF = 17.80;
const AC_DEF = 0.711;
const AA_DEF = 23.70;
const AP_DEF = 11.18;
// ----- Plot rectangle (canvas-space pixels) --------------------------
const PLOT_X0 = 70;
const PLOT_X1 = 690;
const PLOT_Y0 = 60;
const PLOT_Y1 = 360;
const A_MIN = 1;
const A_MAX = 260;
const BA_MIN = 0; // MeV per nucleon
const BA_MAX = 10; // MeV per nucleon
// ----- Famous-nucleus landmarks: [A, label, measured B/A in MeV] -----
// Measured B/A values from AME2020 atomic mass evaluation.
const LANDMARKS = [
[4, 'He-4', 7.074],
[12, 'C-12', 7.680],
[16, 'O-16', 7.976],
[56, 'Fe-56', 8.790],
[120, 'Sn-120', 8.504],
[235, 'U-235', 7.591],
];
// ----- UI controls ---------------------------------------------------
let aVSlider, aSSlider, aCSlider, aASlider, aPSlider;
let resetBtn;
let markerA = 56; // reader's draggable A (starts at the peak)
let draggingMarker = false;
// =====================================================================
// setup()
// =====================================================================
function setup() {
createCanvas(720, 520);
pixelDensity(2);
textFont('system-ui');
// SEMF coefficient sliders, vertical column bottom-left.
// Layout: label-row at y, slider sits directly to the right of the label.
const sx = 100; // slider x
const sw = 160; // slider width
const sy0 = 400; // first slider y
const dy = 22; // row spacing
aVSlider = createSlider(0, 25, AV_DEF, 0.05).position(sx, sy0 + 0 * dy).size(sw);
aSSlider = createSlider(0, 35, AS_DEF, 0.05).position(sx, sy0 + 1 * dy).size(sw);
aCSlider = createSlider(0, 1.5, AC_DEF, 0.005).position(sx, sy0 + 2 * dy).size(sw);
aASlider = createSlider(0, 50, AA_DEF, 0.05).position(sx, sy0 + 3 * dy).size(sw);
aPSlider = createSlider(0, 25, AP_DEF, 0.05).position(sx, sy0 + 4 * dy).size(sw);
resetBtn = createButton('reset coefficients').position(sx, sy0 + 5 * dy + 4);
resetBtn.mousePressed(() => {
aVSlider.value(AV_DEF);
aSSlider.value(AS_DEF);
aCSlider.value(AC_DEF);
aASlider.value(AA_DEF);
aPSlider.value(AP_DEF);
});
}
// =====================================================================
// draw()
// =====================================================================
function draw() {
background(BG);
// Read sliders once at the top, into named locals (Energy convention).
const aV = aVSlider.value();
const aS = aSSlider.value();
const aC = aCSlider.value();
const aA = aASlider.value();
const aP = aPSlider.value();
drawAxes();
drawGrid();
drawCurve(aV, aS, aC, aA, aP);
drawLandmarks();
drawMarker(aV, aS, aC, aA, aP);
drawSliderLabels(aV, aS, aC, aA, aP);
drawReadout(aV, aS, aC, aA, aP);
drawHUD();
}
// =====================================================================
// axis transforms: data <-> canvas pixels
// =====================================================================
function aToPx(A) {
return map(A, A_MIN, A_MAX, PLOT_X0, PLOT_X1);
}
function pxToA(px) {
return map(px, PLOT_X0, PLOT_X1, A_MIN, A_MAX);
}
function baToPy(BA) {
return map(BA, BA_MIN, BA_MAX, PLOT_Y1, PLOT_Y0); // y inverted
}
// =====================================================================
// Z on the line of beta-stability (SEMF minimum w.r.t. Z)
// =====================================================================
function zOfA(A) {
// Standard parabolic-minimum approximation derived from setting
// dB/dZ = 0 at fixed A in the SEMF.
return A / (2 + 0.0155 * Math.pow(A, 2 / 3));
}
// =====================================================================
// SEMF: total binding energy B(A, Z) in MeV
// =====================================================================
function bindingEnergy(A, Z, aV, aS, aC, aA, aP) {
if (A < 1) return 0;
const volume = aV * A;
const surface = aS * Math.pow(A, 2 / 3);
const coulomb = aC * Z * (Z - 1) / Math.pow(A, 1 / 3);
const asymmetry = aA * Math.pow(A - 2 * Z, 2) / A;
// Pairing term: even-Z even-N gets bonus, odd-odd a penalty,
// odd-A nothing. Here Z is generally fractional (line of stability),
// so round to the nearest integer for parity classification.
const Zi = Math.round(Z);
const Ni = A - Zi;
let pairing = 0;
if ((A % 2) === 0) {
if ((Zi % 2) === 0 && (Ni % 2) === 0) pairing = aP / Math.sqrt(A);
else pairing = -aP / Math.sqrt(A);
}
return volume - surface - coulomb - asymmetry + pairing;
}
// =====================================================================
// drawAxes() -- plot rect, axis labels
// =====================================================================
function drawAxes() {
// Plot border
noFill();
stroke(STRUCT);
strokeWeight(1);
rect(PLOT_X0, PLOT_Y0, PLOT_X1 - PLOT_X0, PLOT_Y1 - PLOT_Y0);
// X-axis ticks at A = 0, 50, 100, 150, 200, 250
fill(DIM);
noStroke();
textSize(11);
textAlign(CENTER, TOP);
for (let A = 0; A <= 250; A += 50) {
const px = aToPx(A);
stroke(STRUCT);
line(px, PLOT_Y1, px, PLOT_Y1 + 4);
noStroke();
fill(DIM);
text(A, px, PLOT_Y1 + 6);
}
textAlign(CENTER, TOP);
fill(FG);
textSize(12);
text('mass number A', (PLOT_X0 + PLOT_X1) / 2, PLOT_Y1 + 22);
// Y-axis ticks at B/A = 0, 2, 4, 6, 8, 10
textAlign(RIGHT, CENTER);
for (let BA = 0; BA <= 10; BA += 2) {
const py = baToPy(BA);
stroke(STRUCT);
line(PLOT_X0 - 4, py, PLOT_X0, py);
noStroke();
fill(DIM);
text(BA.toFixed(0), PLOT_X0 - 7, py);
}
push();
translate(PLOT_X0 - 38, (PLOT_Y0 + PLOT_Y1) / 2);
rotate(-HALF_PI);
textAlign(CENTER, CENTER);
fill(FG);
textSize(12);
text('binding energy per nucleon B/A (MeV)', 0, 0);
pop();
}
// =====================================================================
// drawGrid() -- light scratch grid inside the plot rect
// =====================================================================
function drawGrid() {
stroke(SCRATCH);
strokeWeight(1);
// Vertical gridlines every 50 in A
for (let A = 50; A < 250; A += 50) {
const px = aToPx(A);
line(px, PLOT_Y0, px, PLOT_Y1);
}
// Horizontal gridlines every 2 in B/A
for (let BA = 2; BA < 10; BA += 2) {
const py = baToPy(BA);
line(PLOT_X0, py, PLOT_X1, py);
}
// Highlight the iron-peak horizontal at 8.79 MeV
stroke(ACCENT[0], ACCENT[1], ACCENT[2], 100);
strokeWeight(1);
const peakPy = baToPy(8.79);
line(PLOT_X0, peakPy, PLOT_X1, peakPy);
}
// =====================================================================
// drawCurve() -- SEMF B/A(A) sampled along the integer A axis
// =====================================================================
function drawCurve(aV, aS, aC, aA, aP) {
// Two-tone curve: HOT (fusion side) for A < 56, COLD (fission side)
// for A > 56. Drawn as a single polyline with the segment color
// chosen at each step.
strokeWeight(2);
noFill();
let prevPx = null, prevPy = null;
for (let A = 1; A <= A_MAX; A++) {
const Z = zOfA(A);
const B = bindingEnergy(A, Z, aV, aS, aC, aA, aP);
const BA = B / A;
const px = aToPx(A);
const py = baToPy(constrain(BA, BA_MIN - 2, BA_MAX + 2));
if (prevPx !== null) {
if (A < 56) stroke(HOT);
else stroke(COLD);
line(prevPx, prevPy, px, py);
}
prevPx = px;
prevPy = py;
}
}
// =====================================================================
// drawLandmarks() -- famous nuclei with measured B/A
// =====================================================================
function drawLandmarks() {
noStroke();
textAlign(LEFT, BOTTOM);
textSize(10);
for (const [A, label, BA_meas] of LANDMARKS) {
const px = aToPx(A);
const py = baToPy(BA_meas);
fill(LANDMK);
circle(px, py, 6);
fill(LANDMK[0], LANDMK[1], LANDMK[2], 220);
// Stagger labels above-or-below to avoid the SEMF curve.
if (A < 60) text(label, px + 6, py - 4);
else text(label, px - 4, py + 14);
}
}
// =====================================================================
// drawMarker() -- draggable yellow dot, shows live (A, Z, B, B/A)
// =====================================================================
function drawMarker(aV, aS, aC, aA, aP) {
const A = markerA;
const Z = zOfA(A);
const B = bindingEnergy(A, Z, aV, aS, aC, aA, aP);
const BA = B / A;
const px = aToPx(A);
const py = baToPy(constrain(BA, BA_MIN, BA_MAX));
// Vertical drop line.
stroke(TRAJ[0], TRAJ[1], TRAJ[2], 90);
strokeWeight(1);
line(px, py, px, PLOT_Y1);
// Marker dot.
noStroke();
fill(TRAJ);
circle(px, py, 10);
// Small label near the dot.
fill(FG);
textSize(11);
textAlign(LEFT, BOTTOM);
text('A=' + A + ' B/A=' + BA.toFixed(2) + ' MeV', px + 8, py - 4);
}
// =====================================================================
// drawSliderLabels() -- coefficient name + live value next to slider
// =====================================================================
function drawSliderLabels(aV, aS, aC, aA, aP) {
noStroke();
fill(FG);
textSize(11);
textAlign(RIGHT, CENTER);
const lx = 96;
const sy0 = 408;
const dy = 22;
text('aV', lx, sy0 + 0 * dy);
text('aS', lx, sy0 + 1 * dy);
text('aC', lx, sy0 + 2 * dy);
text('aA', lx, sy0 + 3 * dy);
text('aP', lx, sy0 + 4 * dy);
textAlign(LEFT, CENTER);
fill(DIM);
const rx = 268;
text(aV.toFixed(2) + ' MeV', rx, sy0 + 0 * dy);
text(aS.toFixed(2) + ' MeV', rx, sy0 + 1 * dy);
text(aC.toFixed(3) + ' MeV', rx, sy0 + 2 * dy);
text(aA.toFixed(2) + ' MeV', rx, sy0 + 3 * dy);
text(aP.toFixed(2) + ' MeV', rx, sy0 + 4 * dy);
}
// =====================================================================
// drawReadout() -- bottom-right: marker state + canonical equation
// =====================================================================
function drawReadout(aV, aS, aC, aA, aP) {
const A = markerA;
const Z = zOfA(A);
const Zi = Math.round(Z);
const B = bindingEnergy(A, Z, aV, aS, aC, aA, aP);
const BA = B / A;
const bx = 420;
const by = 408;
const dy = 18;
noStroke();
fill(FG);
textSize(12);
textAlign(LEFT, CENTER);
text('marker readout', bx, by);
textSize(11);
fill(DIM);
text('A = ' + A, bx, by + 1 * dy);
text('Z ~ ' + Zi + ' (stability line)', bx, by + 2 * dy);
text('B = ' + B.toFixed(2) + ' MeV', bx, by + 3 * dy);
text('B/A = ' + BA.toFixed(3) + ' MeV/nucleon', bx, by + 4 * dy);
// Canonical SEMF equation -- ASCII only inside text().
fill(DIM);
textSize(10);
text('B = aV*A - aS*A^(2/3) - aC*Z(Z-1)/A^(1/3) - aA*(A-2Z)^2/A + delta',
PLOT_X0, 500);
}
// =====================================================================
// drawHUD() -- top-left title + wikitube URL, top-right control hints
// =====================================================================
function drawHUD() {
noStroke();
textAlign(LEFT, TOP);
fill(FG);
textSize(22);
text(TITLE, 14, 14);
fill(DIM);
textSize(12);
text('Wikitube microsim . en.wikitube.io/wiki/' + ARTICLE, 14, 40);
// Top-right control hints.
textAlign(RIGHT, TOP);
textSize(11);
fill(DIM);
text('drag yellow marker . sliders rescale curve', width - 12, 16);
text('iron peak at A=56 . fusion left, fission right', width - 12, 32);
}
// =====================================================================
// input: drag the yellow marker along the A axis
// =====================================================================
function mousePressed() {
// Begin drag if the click lands inside the plot rect.
if (mouseX >= PLOT_X0 && mouseX <= PLOT_X1 &&
mouseY >= PLOT_Y0 && mouseY <= PLOT_Y1) {
draggingMarker = true;
markerA = Math.round(constrain(pxToA(mouseX), A_MIN, A_MAX));
}
}
function mouseDragged() {
if (draggingMarker) {
markerA = Math.round(constrain(pxToA(mouseX), A_MIN, A_MAX));
}
}
function mouseReleased() {
draggingMarker = false;
}
function keyPressed() {
// Arrow keys nudge the marker one A unit at a time.
if (keyCode === LEFT_ARROW) markerA = Math.max(A_MIN, markerA - 1);
if (keyCode === RIGHT_ARROW) markerA = Math.min(A_MAX, markerA + 1);
}
```
## Links (Wikipedia order)
<!-- injected from _registry/childlinks/Binding_energy.json (2026-07-30T02:09:12Z) -->
`Astrophysics` · `Atom` · [[Atomic_mass]] · `Atomic_nucleus` · `Atomic_orbital` · `Atomic_physics` · [[Beta_decay]] · `Biology` · `Bond_energy` · [[Caesium]] · `Chemical_bond` · `Chemical_energy` · [[Chemistry]] · `Condensed_matter_physics` · [[Copper]] · `Deuterium` · [[Earth]] · `Electronvolt` · `Elementary_particle` · [[Energy]] · `Energy_level` · `Fuel` · `Gluon` · `Gravitational_binding_energy` · [[Gravitational_field]] · `Hadron` · [[Helium]] · `Inelastic_collision` · `Internal_conversion` · `Internal_energy` · `International_Union_of_Pure_and_Applied_Chemistry` · `Ionization_energies_of_the_elements_(data_page)` · [[Ionization_energy]] · `Kinetic_energy` · `Lambda_baryon` · `Mass` · `Mass_in_special_relativity` · `Mass_number` · `Mass–energy_equivalence` · `Meson` · `Molecular_physics` · `Molecule` · [[Neutron]] · `Nickel-62` · `Nuclear_binding_energy` · `Nuclear_fission` · `Nuclear_force` · [[Nuclear_fusion]] · `Nuclear_physics` · `Nuclear_reaction` · `Nucleon` · `Particle` · [[Photon]] · [[Physics]] · [[Proton]] · `Prout's_hypothesis` · `Q_value_(nuclear_science)` · `Quantum_chemistry` · `Quantum_chromodynamics_binding_energy` · `Quark` · `Radiation` · `Semi-empirical_mass_formula` · `Separation_energy` · `Strong_interaction` · [[Sun]] · `Virial_mass` · [[Wayback_Machine]] · `Wiley-VCH`
## From the vault media library
!Binding energy thumb.png
*Binding Energy — from the vault's own media holdings, placed 2026-07-09. MTN / Wikitube.io original · CC BY-SA 4.0.*
<!-- LOCAL-MEDIA-PASS:END -->
> **Room:** [[Helium]] · **Status:** ✅ shipped
## Overview
Binding energy is the [[Energy|energy]] required to disassemble a bound [[System|system]] into its separated constituents, or equivalently, the energy released when those constituents come together to form the bound state. Across [[Physics|physics]] it links to mass through Einstein's relation E = Δm·c², which means the bound system weighs less than the sum of its free parts; the missing mass is the mass defect. Chemical bond energies sit at the electronvolt scale, while nuclear binding energies are roughly a million times larger, measured in mega-electronvolts per nucleon.
For atomic nuclei the canonical summary is the binding-energy-per-nucleon curve, which rises sharply for the lightest nuclei, plateaus through the medium-mass range, and reaches a broad maximum near iron-56 at about 8.79 MeV per nucleon before slowly declining. Light nuclei therefore release energy by fusing toward iron; heavy nuclei release energy by splitting toward it. Helium-4 is an outlier, anchored at 7.07 MeV per nucleon by its doubly magic closed-shell [[Structure|structure]] — the reason alpha particles are emitted as a unit in [[Radioactive_decay|radioactive decay]] and why fusion to helium dominates stellar energy budgets.
The Bethe–Weizsäcker semi-empirical mass formula approximates the nuclear binding energy as a sum of volume, surface, Coulomb, asymmetry, and pairing terms, reproducing the gross shape of the curve and predicting the valley of stability. Analogous binding-energy concepts govern [[Electron|electron]] orbitals in atoms, chemical bonds in molecules, and the gravitational self-energy of stars and planets.
## See also
- Room hub: [[Helium]]
- p5.js Editor conventions: P5 JS EDITOR
- Wiki root: MAIN
---
*Scaffolded by `generative-microsim` from row 51 of the Helium sheet on 2026-05-12T01:40:19Z.*
<!-- REAL-GENERATIVE-MEDIA:START -->
## From the Real GENERATIVE library
> In physics and chemistry, binding energy is the smallest amount of energy required to remove a particle from a system of particles or to disassemble a system of particles into individual parts.[1] In the former meaning the term is predominantly used in condensed matter physics, atomic physics, and chemistry, whereas in nuclear physics the term separation ene ([Wikipedia](https://en.wikipedia.org/wiki/Binding_energy))
<!-- REAL-GENERATIVE-MEDIA:END -->
<!-- LOCAL-MEDIA-PASS:START -->
<!-- CRAFT-LINK:START g12 -->
*Built to the [[WT!P5_js_Microsim_Master_Class|p5.js Master Class]].*
<!-- CRAFT-LINK:END -->
## Wikipedia : Wikitube
**Strict pair:** [Wikipedia](https://en.wikipedia.org/wiki/Binding_energy) : [Wikitube](https://en.wikitube.io/wiki/Binding_energy)
## Previous hub tags
Tree parent: [[Helium]].
Legacy hubs: none.
---
*Sources: 1 legacy note. Minted wave 1, 2026-07-30 (v1.6 order).*