Article
Thermodynamics · ⏱ ~11 min read

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.

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