熱力学第1法則(エネルギー保存)

熱力学第1法則はエネルギー保存則の熱力学版です。力学のエネルギー保存則では運動エネルギーとポテンシャルエネルギーの間の変換を扱いますが、熱力学第1法則はという新たなエネルギー移動の形態を含めてエネルギー保存を拡張します。

本記事では、熱力学第1法則の定式化から、内部エネルギー、仕事、熱の関係を導出し、定容・定圧過程での具体的な応用を解説します。

本記事の内容

  • 熱力学第1法則の定義と意味
  • 内部エネルギー、仕事、熱の区別
  • 定容過程と定圧過程での第1法則
  • 具体的な計算例
  • Pythonによるエネルギー収支の可視化

前提知識

この記事を読む前に、以下の記事を読んでおくと理解が深まります。

熱力学第1法則の定義

閉鎖系において、内部エネルギーの変化は系に加えられた熱から系がした仕事を引いたものに等しくなります。

$$ \boxed{dU = \delta Q – \delta W} $$

ここで各量の意味は以下の通りです。

  • $dU$: 内部エネルギーの微小変化(状態量の完全微分)
  • $\delta Q$: 系に加えられる微小な熱(過程量、完全微分ではない)
  • $\delta W$: 系がする微小な仕事(過程量、完全微分ではない)

有限の変化量に対しては:

$$ \Delta U = Q – W $$

符号の規約

本記事では以下の符号規約を採用します。

$Q$ 系が熱を受け取る 系が熱を放出する
$W$ 系が外界に仕事をする 外界が系に仕事をする

内部エネルギー

内部エネルギー $U$ は、系を構成する分子の運動エネルギーとポテンシャルエネルギーの総和です。巨視的な運動エネルギーや外部ポテンシャルは含みません。

内部エネルギーの重要な性質:

  1. 状態量である: $U$ は系の状態($T$, $V$, $p$ など)のみで決まり、経路に依存しない
  2. 理想気体では $U$ は温度のみの関数: $U = U(T)$
  3. 循環過程では $\oint dU = 0$

理想気体の内部エネルギー変化は:

$$ \Delta U = n c_v \Delta T $$

ここで $c_v$ は定容モル比熱です。

仕事

体積変化による仕事

閉鎖系での準静的過程における仕事は、圧力と体積変化の積で表されます。

$$ \delta W = p \, dV $$

有限の過程では:

$$ W = \int_{V_1}^{V_2} p \, dV $$

この積分は $p$-$V$ 図において曲線の下の面積に対応します。

仕事の経路依存性

仕事は過程量であるため、同じ始状態と終状態を結ぶ経路でも仕事の値は異なります。これは前の記事で確認した通りです。

$Q$ は、温度差によって系と外界の間で移動するエネルギーです。仕事と同様に過程量であり、経路に依存します。

第1法則から:

$$ \delta Q = dU + \delta W = dU + p \, dV $$

この式は、系に加えられた熱が内部エネルギーの増加と外部への仕事に分配されることを意味しています。

定容過程($V = \text{const}$)

体積が一定の過程では $dV = 0$ なので仕事はゼロです。

$$ \delta W = p \, dV = 0 $$

したがって第1法則は:

$$ dU = \delta Q_V $$

つまり、定容過程では加えた熱がすべて内部エネルギーの増加になります。定容モル比熱 $c_v$ を用いると:

$$ \delta Q_V = n c_v \, dT $$

$$ \boxed{\Delta U = n c_v \Delta T = Q_V} $$

定圧過程($p = \text{const}$)

圧力が一定の過程では:

$$ W = \int_{V_1}^{V_2} p \, dV = p(V_2 – V_1) = p \Delta V $$

第1法則に代入すると:

$$ \begin{align} Q_p &= \Delta U + p \Delta V \\ &= (U_2 – U_1) + p(V_2 – V_1) \\ &= (U_2 + pV_2) – (U_1 + pV_1) \end{align} $$

ここでエンタルピー $H = U + pV$ を定義すると:

$$ \boxed{Q_p = \Delta H = H_2 – H_1} $$

定圧過程では、加えた熱がエンタルピーの変化に等しくなります。定圧モル比熱 $c_p$ を用いると:

$$ Q_p = n c_p \Delta T = \Delta H $$

具体例

例1: 理想気体の定容加熱

1 mol の単原子理想気体($c_v = \frac{3}{2}R$)を定容で 300 K から 500 K に加熱します。

$$ \begin{align} Q_V &= \Delta U = n c_v \Delta T \\ &= 1 \times \frac{3}{2} \times 8.314 \times (500 – 300) \\ &= 1 \times 12.471 \times 200 \\ &= 2494.2 \text{ J} \end{align} $$

仕事は $W = 0$ です。

例2: 理想気体の定圧加熱

同じ気体を定圧($p = 1$ atm)で 300 K から 500 K に加熱します。$c_p = \frac{5}{2}R$ より:

$$ \begin{align} Q_p &= n c_p \Delta T = 1 \times \frac{5}{2} \times 8.314 \times 200 = 4157.0 \text{ J} \\ \Delta U &= n c_v \Delta T = 2494.2 \text{ J} \\ W &= Q_p – \Delta U = 4157.0 – 2494.2 = 1662.8 \text{ J} \end{align} $$

定圧過程では、加えた熱の一部が仕事に使われるため、$Q_p > Q_V$ となります。

Pythonでの実装

import numpy as np
import matplotlib.pyplot as plt

R = 8.314  # 気体定数 [J/(mol·K)]
n = 1.0    # 物質量 [mol]
cv = 3/2 * R  # 単原子理想気体の定容モル比熱
cp = 5/2 * R  # 単原子理想気体の定圧モル比熱

T1, T2 = 300, 500  # 温度 [K]

fig, axes = plt.subplots(1, 3, figsize=(16, 5))

# --- (1) 定容過程と定圧過程のp-V図 ---
# 初期状態: p1, V1
p1 = 101325  # 1 atm [Pa]
V1 = n * R * T1 / p1  # 理想気体

# 定容過程(V = const)
V_cv = V1
p_cv_1 = p1
p_cv_2 = n * R * T2 / V_cv

# 定圧過程(p = const)
p_cp = p1
V_cp_1 = V1
V_cp_2 = n * R * T2 / p_cp

# プロット
V_range = np.linspace(V1 * 0.8, V_cp_2 * 1.2, 200)

# 等温線
p_T1 = n * R * T1 / V_range
p_T2 = n * R * T2 / V_range

axes[0].plot(V_range * 1000, p_T1 / 1000, 'b--', alpha=0.3, label=f'$T = {T1}$ K')
axes[0].plot(V_range * 1000, p_T2 / 1000, 'r--', alpha=0.3, label=f'$T = {T2}$ K')

# 定容過程
axes[0].plot([V_cv * 1000, V_cv * 1000], [p_cv_1 / 1000, p_cv_2 / 1000],
            'g-', linewidth=2.5, label='定容過程')
axes[0].annotate('', xy=(V_cv * 1000, p_cv_2 / 1000),
                xytext=(V_cv * 1000, p_cv_1 / 1000),
                arrowprops=dict(arrowstyle='->', color='green', lw=2))

# 定圧過程
axes[0].plot([V_cp_1 * 1000, V_cp_2 * 1000], [p_cp / 1000, p_cp / 1000],
            'm-', linewidth=2.5, label='定圧過程')
axes[0].annotate('', xy=(V_cp_2 * 1000, p_cp / 1000),
                xytext=(V_cp_1 * 1000, p_cp / 1000),
                arrowprops=dict(arrowstyle='->', color='purple', lw=2))

axes[0].set_xlabel('Volume $V$ [L]')
axes[0].set_ylabel('Pressure $p$ [kPa]')
axes[0].set_title('$p$-$V$ Diagram')
axes[0].legend(fontsize=8)
axes[0].grid(True, alpha=0.3)

# --- (2) エネルギー収支の棒グラフ ---
# 定容過程
Q_cv = n * cv * (T2 - T1)
W_cv = 0
dU_cv = Q_cv - W_cv

# 定圧過程
Q_cp = n * cp * (T2 - T1)
W_cp = p_cp * (V_cp_2 - V_cp_1)
dU_cp = Q_cp - W_cp

x = np.arange(2)
width = 0.25

bars1 = axes[1].bar(x - width, [Q_cv, Q_cp], width, label='$Q$(熱)', color='red', alpha=0.7)
bars2 = axes[1].bar(x, [dU_cv, dU_cp], width, label='$\\Delta U$(内部エネルギー変化)', color='blue', alpha=0.7)
bars3 = axes[1].bar(x + width, [W_cv, W_cp], width, label='$W$(仕事)', color='green', alpha=0.7)

axes[1].set_xticks(x)
axes[1].set_xticklabels(['定容過程', '定圧過程'])
axes[1].set_ylabel('Energy [J]')
axes[1].set_title('Energy Balance: $\\Delta U = Q - W$')
axes[1].legend(fontsize=8)
axes[1].grid(True, alpha=0.3, axis='y')

# 数値を棒の上に表示
for bar_group in [bars1, bars2, bars3]:
    for bar in bar_group:
        height = bar.get_height()
        if height > 0:
            axes[1].text(bar.get_x() + bar.get_width()/2., height,
                        f'{height:.0f}', ha='center', va='bottom', fontsize=8)

# --- (3) 温度に対する内部エネルギーとエンタルピー ---
T_range = np.linspace(200, 600, 200)
U = n * cv * T_range     # U(T) = ncvT(定数を除く)
H = n * cp * T_range     # H(T) = ncpT(定数を除く)

axes[2].plot(T_range, U, 'b-', linewidth=2, label=f'$U = nc_vT$ ($c_v = {cv:.1f}$ J/(mol·K))')
axes[2].plot(T_range, H, 'r-', linewidth=2, label=f'$H = nc_pT$ ($c_p = {cp:.1f}$ J/(mol·K))')
axes[2].fill_between(T_range, U, H, alpha=0.15, color='green', label='$pV = nRT$')
axes[2].axvline(x=T1, color='gray', linestyle='--', alpha=0.5)
axes[2].axvline(x=T2, color='gray', linestyle='--', alpha=0.5)
axes[2].set_xlabel('Temperature $T$ [K]')
axes[2].set_ylabel('Energy [J]')
axes[2].set_title('$U(T)$ and $H(T)$ for Ideal Gas')
axes[2].legend(fontsize=8)
axes[2].grid(True, alpha=0.3)

plt.tight_layout()
plt.savefig('first_law_thermodynamics.png', dpi=150, bbox_inches='tight')
plt.show()

# 数値結果の表示
print("=== 定容過程 ===")
print(f"Q_V = {Q_cv:.1f} J")
print(f"W   = {W_cv:.1f} J")
print(f"ΔU  = {dU_cv:.1f} J")
print(f"検証: Q - W = {Q_cv - W_cv:.1f} = ΔU ✓")

print("\n=== 定圧過程 ===")
print(f"Q_p = {Q_cp:.1f} J")
print(f"W   = {W_cp:.1f} J")
print(f"ΔU  = {dU_cp:.1f} J")
print(f"検証: Q - W = {Q_cp - W_cp:.1f} = ΔU ✓")
print(f"ΔH  = Q_p = {Q_cp:.1f} J")

まとめ

本記事では、熱力学第1法則について解説しました。

  • 熱力学第1法則: $dU = \delta Q – \delta W$(エネルギー保存の熱力学版)
  • 内部エネルギー $U$ は状態量、 $Q$ と仕事 $W$ は過程量
  • 定容過程: $W = 0$, $Q_V = \Delta U = nc_v\Delta T$
  • 定圧過程: $W = p\Delta V$, $Q_p = \Delta H = nc_p\Delta T$
  • 定圧過程のほうが同じ温度変化に対して多くの熱が必要(一部が仕事に使われるため)

次のステップとして、以下の記事も参考にしてください。