Article
Thermodynamics · ⏱ ~11 min read · Last updated: 22 June 2026

Carnot Cycle & the Limits of Heat Engines

In 1824, Sadi Carnot proved that no heat engine operating between two fixed temperatures can be more efficient than a fully reversible engine — and derived exactly what that maximum efficiency is. The result is startling: it depends only on the temperatures, not on the working fluid, engine design, or fuel. Understanding why reveals the deepest connection between work, heat, and entropy.

TL;DR: The Carnot cycle is an idealised four-step engine (isothermal and adiabatic expansion, then isothermal and adiabatic compression) that sets the absolute maximum efficiency any heat engine can reach: η = 1 − T_c/T_h, using only the hot and cold reservoir temperatures. Real engines like Otto, Diesel and Rankine always fall short of this limit.

1. Heat Engines and the Second Law

A heat engine absorbs heat Q_h from a hot reservoir at temperature T_h, converts some of it into work W, and dumps the remainder Q_c into a cold reservoir at T_c. Energy conservation gives:

First Law: W = Q_h − Q_c Thermal efficiency: η = W / Q_h = 1 − Q_c/Q_h Second Law (Kelvin-Planck): No engine can convert heat entirely into work in a cyclic process — Q_c > 0 always.

Carnot's theorem states that all reversible engines operating between the same two temperatures have identical efficiency, and any irreversible engine has a strictly lower efficiency.

2. The Four Reversible Processes

1 → 2 Isothermal Expansion

Gas expands at T_h absorbing Q_h. Work W₁₂ = nRT_h·ln(V₂/V₁). Temperature constant → internal energy unchanged.

2 → 3 Adiabatic Expansion

Gas expands with no heat exchange. Temperature drops from T_h to T_c. Work W₂₃ = nCᵥ(T_h − T_c). PVᵞ = const.

3 → 4 Isothermal Compression

Gas compressed at T_c rejecting Q_c. Work W₃₄ = −nRT_c·ln(V₃/V₄). Must expel heat to maintain temperature.

4 → 1 Adiabatic Compression

Gas compressed back to initial state. Temperature rises from T_c to T_h. Work W₄₁ = −nCᵥ(T_h − T_c).

The adiabatic steps cancel each other in work (W₂₃ + W₄₁ = 0), so the net work of the cycle equals the difference of the two isothermal works.

3. PV Diagram and Work

On a pressure–volume diagram, the enclosed area is the net work output per cycle:

Isothermal (T const): PV = nRT → P = nRT/V (hyperbola) Adiabatic: PVᵞ = K → P = K/Vᵞ (steeper curve, γ = Cₚ/Cᵥ) Net work per cycle: W_net = W₁₂ + W₃₄ = nR(T_h − T_c) · ln(V₂/V₁) Heat absorbed: Q_h = nRT_h · ln(V₂/V₁) Heat rejected: Q_c = nRT_c · ln(V₃/V₄) = nRT_c · ln(V₂/V₁) (because adiabatic constraint: V₂/V₁ = V₃/V₄)

4. Carnot Efficiency

Combining Q_h and Q_c, the logarithm cancels, leaving a remarkably clean result:

η_Carnot = 1 − Q_c/Q_h = 1 − T_c/T_h Temperatures must be in Kelvin (absolute scale). Example — steam turbine (T_h = 600 K, T_c = 300 K): η_max = 1 − 300/600 = 0.50 = 50% Best real steam plant achieves ~42% (irreversibilities reduce it). To increase efficiency: ↑ T_h (superheat steam) → technical limit: materials ↓ T_c (cold condenser water) → practical limit: environment

This result is profound: efficiency depends only on the ratio T_c/T_h. A perfect engine at room temperature and body temperature (T_h=310 K, T_c=293 K) has a maximum efficiency of merely 5.5%.

5. Entropy and the TS Diagram

Entropy S is defined via reversible heat exchange: dS = δQ_rev / T. The Carnot cycle is a rectangle on a temperature–entropy diagram:

Process ΔS 1→2 (isotherm T_h): ΔS = +Q_h/T_h (entropy increases) 2→3 (adiabat): ΔS = 0 (no heat exchange) 3→4 (isotherm T_c): ΔS = −Q_c/T_c (entropy decreases) 4→1 (adiabat): ΔS = 0 Reversibility: Q_h/T_h = Q_c/T_c → cycle ΔS_total = 0 TS rectangle area = W_net = (T_h − T_c)·ΔS For irreversible engine: Q_c/T_c > Q_h/T_h → entropy generated → Clausius inequality: ∮ δQ/T ≤ 0

6. Real Engines: Otto, Diesel, Stirling

Real thermodynamic cycles approximate the Carnot ideal in different ways:

Otto Cycle

Gasoline engine. Two adiabats + two isochores (constant volume). η_Otto = 1 − r^(1−γ), r = compression ratio. Typical η ≈ 25–35%.

Diesel Cycle

Compression ignition. Two adiabats + one isochore + one isobar. Higher compression ratio r than Otto → slightly better efficiency ≈ 35–45%.

Stirling Cycle

Two isotherms + two isochores with a regenerator. Theoretically achieves Carnot efficiency! Used in solar dish concentrators and submarines.

Rankine Cycle

Steam power plant cycle. Pump → boiler → turbine → condenser. Real plants use reheat and regeneration to approach 40–42% efficiency.

7. JavaScript Simulation

// Carnot cycle simulation — ideal gas, n moles
const R = 8.314; // J/(mol·K)

function carnotCycle(n, Th, Tc, V1, gamma = 1.4) {
  // Adiabatic constraint: V2/V1 = (Th/Tc)^(1/(γ-1))
  const adRatio = Math.pow(Th / Tc, 1 / (gamma - 1));
  const V2 = V1 * adRatio;
  // Isothermal expansion gives V3 = V2*(Tc/Th)^(1/(γ-1)) ... simplified:
  const V4 = V1;          // adiabatic compression returns to V1
  const V3 = V2 * adRatio; // symmetric adiabatic

  const Qh = n * R * Th * Math.log(V2 / V1);
  const Qc = n * R * Tc * Math.log(V3 / V4);
  const W  = Qh - Qc;
  const eta = 1 - Tc / Th;

  return { Qh, Qc, W, eta, V1, V2, V3, V4, Th, Tc };
}

// Generate PV curve points for plotting
function pvCurve(type, V_start, V_end, T_or_K, n, gamma, steps = 60) {
  const pts = [];
  for (let i = 0; i <= steps; i++) {
    const V = V_start + (V_end - V_start) * i / steps;
    let P;
    if (type === 'isothermal') {
      P = n * R * T_or_K / V;
    } else { // adiabatic: PVᵞ = K
      P = T_or_K / Math.pow(V, gamma);
    }
    pts.push({V, P});
  }
  return pts;
}

// Draw PV diagram on canvas
function drawPV(ctx, cycle, W, H) {
  const {Qh, Qc, Th, Tc, V1, V2, V3, V4} = cycle;
  const n = 1, gamma = 1.4;
  const P1 = n * R * Th / V1;
  const K_ad12 = P1 * Math.pow(V1, gamma); // adiabatic constant 2→3

  const allV = [V1,V2,V3,V4], allP = [P1];
  allP.push(n*R*Th/V2, n*R*Tc/V3, n*R*Tc/V4);
  const vMin = Math.min(...allV), vMax = Math.max(...allV);
  const pMin = Math.min(...allP) * 0.8, pMax = Math.max(...allP) * 1.2;

  const toX = v => 60 + (v-vMin)/(vMax-vMin) * (W-80);
  const toY = p => H-50 - (p-pMin)/(pMax-pMin) * (H-80);

  ctx.clearRect(0, 0, W, H);
  ctx.strokeStyle = '#f97316'; ctx.lineWidth = 2;
  ctx.beginPath();
  const segments = [
    pvCurve('isothermal', V1, V2, Th, n, gamma),
    pvCurve('adiabatic', V2, V3, K_ad12, n, gamma),
    pvCurve('isothermal', V3, V4, Tc, n, gamma),
    pvCurve('adiabatic', V4, V1, K_ad12*0.5, n, gamma)
  ];
  let first = true;
  for (const seg of segments) {
    for (const {V, P} of seg) {
      first ? ctx.moveTo(toX(V), toY(P)) : ctx.lineTo(toX(V), toY(P));
      first = false;
    }
  }
  ctx.closePath();
  ctx.fillStyle = '#f9731620'; ctx.fill(); ctx.stroke();
}

// Example usage
const cycle = carnotCycle(1, 600, 300, 0.001);
console.log(`η = ${(cycle.eta*100).toFixed(1)}%`); // η = 50.0%

8. Applications and Limits