Spontaneous vs Non-Spontaneous Reactions | Chemistry GuideSpontaneous and Non-Spontaneous Reactions
Understanding Natural Processes, Thermodynamic Criteria, and Real-World Examples
Reactant A
Reactant B
Product AB
Energy Input
Spontaneous – Reaction proceeds naturally
A spontaneous process occurs autonomously, transitioning from a non-equilibrium state to an equilibrium state without external intervention.
- (i) Water flow: Water flows from higher to lower elevation.
- (ii) Acid-base neutralisation: NaOH + HCl → NaCl + H₂O
NaOH (aq) + HCl (aq) → NaCl (aq) + H2O (l)
A reaction is spontaneous if it requires initial energy but then proceeds autonomously. Combustion of coal is spontaneous once ignited.
Non-Spontaneous Processes
A non-spontaneous process does not occur on its own without external energy input.
- (i) Pumping water uphill (requires work).
- (ii) Refrigerator heat transfer (requires electrical work).
- (iii) N₂ + O₂ → 2NO (requires lightning energy).
N2(g) + O2(g) → 2NO(g) (non-spontaneous)
Thermodynamic Criterion
Spontaneity at constant temperature and pressure is determined by Gibbs free energy (ΔG):
ΔG = ΔH – TΔS
- ΔG < 0 → Spontaneous
- ΔG > 0 → Non-spontaneous
- ΔG = 0 → Equilibrium
Examples
- Spontaneous: Dissolution of salt, rusting of iron, expansion of gas.
- Non-spontaneous: Electrolysis of water, photosynthesis, charging a battery.
Complete Lecture: Spontaneous vs Non-Spontaneous Reactions
Key Takeaways
- Spontaneous processes occur naturally without external energy input after initiation.
- Non-spontaneous processes require continuous energy input from an external source.
- The sign of ΔG determines spontaneity.
(function() {
var canvas = document.getElementById(‘spontCanvas’);
if (!canvas) return;
var ctx = canvas.getContext(‘2d’);var isRunning = true;
var mode = ‘spontaneous’;
var progress = 0.0;
var speed = 0.0025;var reactantsA = [], reactantsB = [], products = [], energyParticles = [], collisions = [];function initParticles() {
reactantsA = []; reactantsB = []; products = []; energyParticles = []; collisions = [];
for (var i = 0; i < 14; i++) {
reactantsA.push({ x: 30 + Math.random() * 140, y: 30 + Math.random() * 310, vx: (Math.random() – 0.5) * 0.6, vy: (Math.random() – 0.5) * 0.6, size: 10 + Math.random() * 3, active: true });
reactantsB.push({ x: 50 + Math.random() * 150, y: 30 + Math.random() * 310, vx: (Math.random() – 0.5) * 0.6, vy: (Math.random() – 0.5) * 0.6, size: 10 + Math.random() * 3, active: true });
products.push({ x: 580 + Math.random() * 160, y: 30 + Math.random() * 310, vx: (Math.random() – 0.5) * 0.4, vy: (Math.random() – 0.5) * 0.4, size: 13 + Math.random() * 3, active: false });
}
for (var i = 0; i < 10; i++) {
energyParticles.push({ x: 150 + Math.random() * 450, y: 30 + Math.random() * 310, vx: (Math.random() – 0.5) * 0.8, vy: (Math.random() – 0.5) * 0.8, size: 5 + Math.random() * 3, phase: Math.random() * 6.28 });
}
}
initParticles();function updateMeter() {
var pct = Math.round(progress * 100);
var meter = document.getElementById('simMeter');
var label = document.getElementById('simPercent');
if (meter) meter.style.width = pct + '%';
if (label) label.textContent = pct;
}function checkCollision(p1, p2) {
var dx = p1.x – p2.x, dy = p1.y – p2.y;
return Math.sqrt(dx*dx + dy*dy) < (p1.size + p2.size – 2);
}function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.fillStyle = '#0d1e2b';
ctx.fillRect(0, 0, canvas.width, canvas.height);// Energy graph
var gx = 30, gy = 280, gw = 720, gh = 100;
ctx.fillStyle = 'rgba(20,40,60,0.6)';
ctx.strokeStyle = 'rgba(100,180,220,0.25)';
ctx.lineWidth = 2;
ctx.fillRect(gx, gy – gh, gw, gh);
ctx.strokeRect(gx, gy – gh, gw, gh);ctx.strokeStyle = 'rgba(100,180,220,0.08)';
ctx.lineWidth = 0.5;
for (var i = 0; i ‘, gx + gw / 2, gy + 20);ctx.fillStyle = ‘rgba(255,255,255,0.30)’;
ctx.font = ‘bold 12px system-ui’;
ctx.textAlign = ‘center’;
ctx.fillText(‘Reactants’, gx + 50, gy + 12);
ctx.fillText(‘Products’, gx + gw – 50, gy + 12);ctx.fillStyle = mode === ‘spontaneous’ ? ‘#2ecc71’ : ‘#e74c3c’;
ctx.font = ‘bold 18px system-ui’;
ctx.textAlign = ‘center’;
ctx.fillText(mode === ‘spontaneous’ ? ‘DG 0’, midX, (mode === ‘spontaneous’ ? gy – gh * 0.45 : gy – gh * 0.75) + 10);if (mode === ‘nonspontaneous’ && progress > 0.05) {
ctx.fillStyle = ‘rgba(231,76,60,0.20)’;
ctx.fillRect(gx + 20, gy – 10, 80, 8);
ctx.fillStyle = ‘rgba(231,76,60,0.5)’;
ctx.font = ‘bold 10px system-ui’;
ctx.textAlign = ‘center’;
ctx.fillText(‘Energy Input’, gx + 60, gy – 16);
}// Energy particles – only in non-spontaneous
if (mode === ‘nonspontaneous’) {
for (var i = 0; i < energyParticles.length; i++) {
var p = energyParticles[i];
ctx.beginPath();
ctx.arc(p.x, p.y, p.size, 0, 6.28);
ctx.fillStyle = '#f39c12';
ctx.shadowColor = '#f39c12';
ctx.shadowBlur = 16;
ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#fff';
ctx.font = 'bold 8px system-ui';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText('E', p.x, p.y + 1);
ctx.textBaseline = 'alphabetic';
}
}// Reactants
for (var i = 0; i < reactantsA.length; i++) {
var r = reactantsA[i];
if (!r.active) continue;
ctx.beginPath();
ctx.arc(r.x, r.y, r.size, 0, 6.28);
ctx.fillStyle = '#3498db';
ctx.shadowColor = '#3498db';
ctx.shadowBlur = 8;
ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#fff';
ctx.font = 'bold 10px system-ui';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText('A', r.x, r.y + 0.5);
ctx.textBaseline = 'alphabetic';
}
for (var i = 0; i < reactantsB.length; i++) {
var r = reactantsB[i];
if (!r.active) continue;
ctx.beginPath();
ctx.arc(r.x, r.y, r.size, 0, 6.28);
ctx.fillStyle = '#9b59b6';
ctx.shadowColor = '#9b59b6';
ctx.shadowBlur = 8;
ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#fff';
ctx.font = 'bold 10px system-ui';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText('B', r.x, r.y + 0.5);
ctx.textBaseline = 'alphabetic';
}// Products
for (var i = 0; i < products.length; i++) {
var p = products[i];
if (!p.active) continue;
ctx.beginPath();
ctx.arc(p.x, p.y, p.size, 0, 6.28);
ctx.fillStyle = '#2ecc71';
ctx.shadowColor = '#2ecc71';
ctx.shadowBlur = 10;
ctx.fill();
ctx.shadowBlur = 0;
ctx.fillStyle = '#fff';
ctx.font = 'bold 9px system-ui';
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
ctx.fillText('AB', p.x, p.y + 0.5);
ctx.textBaseline = 'alphabetic';
}// Collisions
var newCollisions = [];
for (var i = 0; i < collisions.length; i++) {
var c = collisions[i];
c.life -= 0.04;
if (c.life 1.0) progress = 1.0;
for (var i = 0; i < reactantsA.length; i++) {
var r = reactantsA[i];
if (!r.active) continue;
var dx = centerX – r.x;
var dy = 320 – r.y + Math.sin(r.x * 0.03) * 40;
r.x += dx * 0.002 * (1 + progress * 0.6);
r.y += dy * 0.001;
r.x += r.vx; r.y += r.vy;
if (r.x 480) r.vx *= -1;
if (r.y 340) r.vy *= -1;
}
for (var i = 0; i < reactantsB.length; i++) {
var r = reactantsB[i];
if (!r.active) continue;
var dx = centerX – r.x;
var dy = 320 – r.y + Math.cos(r.x * 0.025) * 40;
r.x += dx * 0.002 * (1 + progress * 0.6);
r.y += dy * 0.001;
r.x += r.vx; r.y += r.vy;
if (r.x 480) r.vx *= -1;
if (r.y 340) r.vy *= -1;
}
var toRemoveA = [], toRemoveB = [];
for (var i = 0; i < reactantsA.length; i++) {
var a = reactantsA[i];
if (!a.active) continue;
for (var j = 0; j < reactantsB.length; j++) {
var b = reactantsB[j];
if (!b.active) continue;
if (checkCollision(a, b) && Math.random() < 0.06 + progress * 0.04) {
for (var k = 0; k < products.length; k++) {
if (!products[k].active) {
products[k].active = true;
products[k].x = (a.x + b.x) / 2 + (Math.random() – 0.5) * 20;
products[k].y = (a.y + b.y) / 2 + (Math.random() – 0.5) * 20;
products[k].vx = (a.vx + b.vx) / 2 + (Math.random() – 0.5) * 0.3;
products[k].vy = (a.vy + b.vy) / 2 + (Math.random() – 0.5) * 0.3;
collisions.push({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, size: 22, life: 0.8 });
toRemoveA.push(i); toRemoveB.push(j);
break;
}
}
}
}
}
toRemoveA.sort(function(a, b) { return b – a; });
toRemoveB.sort(function(a, b) { return b – a; });
for (var i = 0; i < toRemoveA.length; i++) reactantsA[toRemoveA[i]].active = false;
for (var i = 0; i 0.92) {
progress = 0.08;
var deactivated = 0;
for (var i = 0; i < products.length && deactivated < 3; i++) {
if (products[i].active) {
products[i].active = false;
deactivated++;
for (var j = 0; j 0; j++) {
if (!reactantsA[j].active) {
reactantsA[j].active = true;
reactantsA[j].x = 30 + Math.random() * 120;
reactantsA[j].y = 30 + Math.random() * 310;
deactivated–; break;
}
}
for (var j = 0; j 0; j++) {
if (!reactantsB[j].active) {
reactantsB[j].active = true;
reactantsB[j].x = 50 + Math.random() * 130;
reactantsB[j].y = 30 + Math.random() * 310;
deactivated–; break;
}
}
}
}
collisions.push({ x: 390, y: 160, size: 30, life: 0.6 });
}
for (var i = 0; i < reactantsA.length; i++) {
var r = reactantsA[i];
if (!r.active) continue;
var dx = centerX – r.x;
var dy = 320 – r.y + Math.sin(r.x * 0.03) * 40;
r.x += dx * 0.001 * (1 + progress * 0.3);
r.y += dy * 0.0005;
r.x += r.vx * 0.5; r.y += r.vy * 0.5;
if (r.x 480) r.vx *= -1;
if (r.y 340) r.vy *= -1;
}
for (var i = 0; i < reactantsB.length; i++) {
var r = reactantsB[i];
if (!r.active) continue;
var dx = centerX – r.x;
var dy = 320 – r.y + Math.cos(r.x * 0.025) * 40;
r.x += dx * 0.001 * (1 + progress * 0.3);
r.y += dy * 0.0005;
r.x += r.vx * 0.5; r.y += r.vy * 0.5;
if (r.x 480) r.vx *= -1;
if (r.y 340) r.vy *= -1;
}
var toRemoveA = [], toRemoveB = [];
for (var i = 0; i < reactantsA.length; i++) {
var a = reactantsA[i];
if (!a.active) continue;
for (var j = 0; j < reactantsB.length; j++) {
var b = reactantsB[j];
if (!b.active) continue;
if (checkCollision(a, b) && Math.random() 0.3) {
for (var k = 0; k < products.length; k++) {
if (!products[k].active) {
products[k].active = true;
products[k].x = (a.x + b.x) / 2 + (Math.random() – 0.5) * 20;
products[k].y = (a.y + b.y) / 2 + (Math.random() – 0.5) * 20;
products[k].vx = (a.vx + b.vx) / 2 + (Math.random() – 0.5) * 0.3;
products[k].vy = (a.vy + b.vy) / 2 + (Math.random() – 0.5) * 0.3;
collisions.push({ x: (a.x + b.x) / 2, y: (a.y + b.y) / 2, size: 20, life: 0.7 });
toRemoveA.push(i); toRemoveB.push(j);
break;
}
}
}
}
}
toRemoveA.sort(function(a, b) { return b – a; });
toRemoveB.sort(function(a, b) { return b – a; });
for (var i = 0; i < toRemoveA.length; i++) reactantsA[toRemoveA[i]].active = false;
for (var i = 0; i < toRemoveB.length; i++) reactantsB[toRemoveB[i]].active = false;
}for (var i = 0; i < products.length; i++) {
var p = products[i];
if (!p.active) continue;
var targetX = 600 – (1 – progress) * 80;
p.x += (targetX – p.x) * 0.003;
p.x += p.vx; p.y += p.vy;
if (p.x 760) p.vx *= -1;
if (p.y 340) p.vy *= -1;
}if (mode === ‘nonspontaneous’) {
var time = Date.now() / 1000;
for (var i = 0; i < energyParticles.length; i++) {
var p = energyParticles[i];
p.x += Math.sin(time * 0.5 + p.phase) * 0.3;
p.y += Math.cos(time * 0.4 + p.phase * 0.7) * 0.3;
p.x += p.vx * 0.05; p.y += p.vy * 0.05;
if (p.x canvas.width – 20) p.vx *= -1;
if (p.y canvas.height – 20) p.vy *= -1;
}
}var activeA = 0, activeB = 0;
for (var i = 0; i < reactantsA.length; i++) if (reactantsA[i].active) activeA++;
for (var i = 0; i < reactantsB.length; i++) if (reactantsB[i].active) activeB++;
if (activeA < 4) {
for (var i = 0; i = 8) break;
}
}
}
if (activeB < 4) {
for (var i = 0; i = 8) break;
}
}
}
updateMeter();
}function animate() {
if (!isRunning) return;
update();
draw();
animId = requestAnimationFrame(animate);
}// Buttons
var btnSpont = document.getElementById(‘btnSpont’);
var btnNonSpont = document.getElementById(‘btnNonSpont’);
var btnReset = document.getElementById(‘btnReset’);
var btnPause = document.getElementById(‘btnPause’);
var statusEl = document.getElementById(‘simStatus’);if (btnSpont) {
btnSpont.addEventListener(‘click’, function() {
mode = ‘spontaneous’;
btnSpont.className = ‘active-spont’;
btnNonSpont.className = ”;
speed = 0.0025;
if (statusEl) statusEl.innerHTML = ‘
Spontaneous – Reaction proceeds naturally’;
var meter = document.getElementById(‘simMeter’);
if (meter) meter.className = ‘sim-meter-fill spont-fill’;
progress = 0.0; initParticles(); updateMeter();
});
}if (btnNonSpont) {
btnNonSpont.addEventListener(‘click’, function() {
mode = ‘nonspontaneous’;
btnNonSpont.className = ‘active-nonspont’;
btnSpont.className = ”;
speed = 0.0015;
if (statusEl) statusEl.innerHTML = ‘
Non-Spontaneous – Requires continuous energy input’;
var meter = document.getElementById(‘simMeter’);
if (meter) meter.className = ‘sim-meter-fill nonspont-fill’;
progress = 0.0; initParticles(); updateMeter();
});
}if (btnReset) {
btnReset.addEventListener(‘click’, function() {
progress = 0.0; initParticles(); updateMeter();
});
}if (btnPause) {
btnPause.addEventListener(‘click’, function() {
isRunning = !isRunning;
btnPause.textContent = isRunning ? ‘Pause’ : ‘Play’;
if (isRunning) animate();
});
}draw();
animate();
})();
Download Complete Notes Below
Proudly Powered By

Leave a Comment