第2章:熱処理プロセス

Annealing, Quenching & Tempering, Age Hardening, TTT/CCT Diagrams

📖 読了時間: 40-50分 📊 難易度: 中級 💻 コード例: 7個

熱処理プロセスは、材料の機械的性質(強度、硬度、靱性)を制御する中核技術です。加熱・保持・冷却の温度履歴により、相変態、拡散、析出を制御し、目標特性を実現します。この章では、焼鈍、焼入れ・焼戻し、時効硬化の原理をPythonシミュレーションで学び、TTT/CCT図を活用した実践的な熱処理設計を習得します。

学習目標

この章を読むことで、以下を習得できます:

2.1 焼鈍(Annealing)プロセス

2.1.1 焼鈍の種類と目的

焼鈍(Annealing)は、材料を高温に加熱・保持し、徐冷することで以下の効果を得ます:

焼鈍の種類 目的 温度範囲 組織変化
完全焼鈍
(Full Annealing)
軟化、加工性向上 Ac₃ + 30-50℃ フェライト+パーライト
応力除去焼鈍
(Stress Relief)
残留応力除去 500-650℃ 組織変化なし
再結晶焼鈍
(Recrystallization)
加工硬化除去、結晶粒微細化 500-700℃ 新結晶粒形成
球状化焼鈍
(Spheroidizing)
炭化物球状化、切削性向上 Ac₁近傍、長時間 球状セメンタイト

2.1.2 拡散律速プロセスと保持時間

焼鈍では、原子拡散が組織均質化の鍵です。Fickの第2法則により、拡散距離は時間の平方根に比例:

$$ x = \sqrt{D t} $$

Arrheniusの式(温度依存性):

$$ D = D_0 \exp\left(-\frac{Q}{RT}\right) $$

コード例2-1: 拡散距離と保持時間の計算

import numpy as np
import matplotlib.pyplot as plt

def arrhenius_diffusion_coefficient(T_celsius, Q, D0):
    """
    Arrheniusの式による拡散係数計算

    Parameters
    ----------
    T_celsius : float
        温度(℃)
    Q : float
        活性化エネルギー(J/mol)
    D0 : float
        頻度因子(m²/s)

    Returns
    -------
    D : float
        拡散係数(m²/s)
    """
    R = 8.314  # J/mol·K
    T_kelvin = T_celsius + 273.15

    D = D0 * np.exp(-Q / (R * T_kelvin))

    return D


def diffusion_distance(D, time):
    """
    拡散距離の計算

    Parameters
    ----------
    D : float
        拡散係数(m²/s)
    time : float
        時間(秒)

    Returns
    -------
    x : float
        拡散距離(m)
    """
    x = np.sqrt(D * time)
    return x


# 鉄中の炭素拡散(典型値)
Q_C_in_Fe = 142000  # J/mol
D0_C_in_Fe = 2.0e-5  # m²/s

# 温度範囲でのシミュレーション
temperatures = np.array([700, 800, 900, 1000])  # ℃
time_hours = np.linspace(0, 10, 100)  # 時間(時間)
time_seconds = time_hours * 3600

plt.figure(figsize=(12, 6))

for T in temperatures:
    D = arrhenius_diffusion_coefficient(T, Q_C_in_Fe, D0_C_in_Fe)
    distances = [diffusion_distance(D, t) * 1e6 for t in time_seconds]  # μm

    plt.plot(time_hours, distances, linewidth=2, label=f'{T}°C')

    # 保持時間の推定(拡散距離100μmに到達)
    target_distance = 100e-6  # m
    required_time = (target_distance ** 2) / D / 3600  # 時間
    print(f"Temperature: {T}°C")
    print(f"  Diffusion Coefficient: {D:.2e} m²/s")
    print(f"  Time to diffuse 100 μm: {required_time:.2f} hours\n")

plt.xlabel('Time (hours)')
plt.ylabel('Diffusion Distance (μm)')
plt.title('Carbon Diffusion in Iron (Annealing Process)')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('diffusion_annealing.png', dpi=150, bbox_inches='tight')
plt.show()

# 結果:
# 700℃で100μm拡散 → 約10時間必要
# 1000℃で100μm拡散 → 約0.5時間(30分)
# → 高温ほど短時間で均質化可能

2.1.3 再結晶と粒成長

冷間加工後の焼鈍では、再結晶(新結晶粒の核生成・成長)と粒成長(粒界移動)が進行します。

Beck-Spaepen粒成長則

$$ d^n - d_0^n = K t $$

コード例2-2: 粒成長シミュレーション

import numpy as np
import matplotlib.pyplot as plt

def grain_growth(d0, K, time, n=2):
    """
    Beck-Spaepen粒成長モデル

    Parameters
    ----------
    d0 : float
        初期粒径(μm)
    K : float
        成長定数(μm^n / s)
    time : ndarray
        時間(秒)
    n : int
        成長指数(デフォルト2)

    Returns
    -------
    d : ndarray
        粒径履歴(μm)
    """
    d = (d0 ** n + K * time) ** (1 / n)
    return d


# パラメータ設定
d0 = 10  # μm(初期粒径)
K = 0.5  # μm²/s(800℃での成長定数)
time_hours = np.linspace(0, 10, 100)
time_seconds = time_hours * 3600

# 粒成長計算
grain_size = grain_growth(d0, K, time_seconds, n=2)

# プロット
plt.figure(figsize=(10, 6))
plt.plot(time_hours, grain_size, 'b-', linewidth=2)
plt.xlabel('Annealing Time (hours)')
plt.ylabel('Average Grain Size (μm)')
plt.title('Grain Growth during Annealing (800°C)')
plt.grid(True, alpha=0.3)
plt.axhline(y=50, color='r', linestyle='--', label='Target: 50 μm')
plt.legend()
plt.savefig('grain_growth.png', dpi=150, bbox_inches='tight')
plt.show()

# 目標粒径(50μm)到達時間の計算
target_size = 50  # μm
required_time = ((target_size ** 2) - (d0 ** 2)) / K
required_hours = required_time / 3600

print(f"Grain Growth Analysis:")
print(f"  Initial Grain Size: {d0} μm")
print(f"  Target Grain Size: {target_size} μm")
print(f"  Required Annealing Time: {required_hours:.2f} hours")
print(f"  Final Grain Size after 10h: {grain_size[-1]:.1f} μm")

2.2 焼入れ(Quenching)と焼戻し(Tempering)

2.2.1 焼入れとマルテンサイト変態

焼入れ(Quenching)は、オーステナイト(γ相)から急冷し、マルテンサイト(過飽和固溶体)を生成します。マルテンサイトは高硬度ですが、脆性が大きいため、焼戻しで調整します。

冷却速度 冷却媒体 生成組織 硬度(HV)
>200 ℃/s 水、ブライン マルテンサイト 600-800
50-200 ℃/s マルテンサイト+ベイナイト 500-700
10-50 ℃/s 空冷(風冷) ベイナイト 400-600
<10 ℃/s 炉冷 パーライト 200-400

Newton冷却則(簡易モデル):

$$ \frac{dT}{dt} = -h (T - T_{\text{medium}}) $$

コード例2-3: 焼入れ冷却カーブシミュレーション

import numpy as np
import matplotlib.pyplot as plt

def quenching_cooling_curve(T0, T_medium, h, time):
    """
    Newton冷却則による冷却カーブ

    Parameters
    ----------
    T0 : float
        初期温度(℃)
    T_medium : float
        冷却媒体温度(℃)
    h : float
        冷却係数(1/s)
    time : ndarray
        時間(秒)

    Returns
    -------
    T : ndarray
        温度履歴(℃)
    """
    T = T_medium + (T0 - T_medium) * np.exp(-h * time)
    return T


# 冷却条件設定
T_austenitize = 850  # ℃(オーステナイト化温度)
time = np.linspace(0, 60, 500)  # 秒

quenching_conditions = [
    {'name': 'Water Quench', 'T_med': 25, 'h': 0.3, 'color': 'blue'},
    {'name': 'Oil Quench', 'T_med': 60, 'h': 0.1, 'color': 'orange'},
    {'name': 'Air Cool', 'T_med': 25, 'h': 0.02, 'color': 'green'},
    {'name': 'Furnace Cool', 'T_med': 25, 'h': 0.005, 'color': 'red'}
]

plt.figure(figsize=(12, 8))

# マルテンサイト開始温度(Ms)とベイナイト範囲
Ms_temp = 350  # ℃
Bs_temp = 550  # ℃

plt.axhline(y=Ms_temp, color='purple', linestyle='--', linewidth=2,
            label=f'Ms (Martensite Start): {Ms_temp}°C')
plt.axhspan(Bs_temp, Ms_temp, alpha=0.2, color='cyan',
            label='Bainite Range')

for cond in quenching_conditions:
    T_curve = quenching_cooling_curve(
        T_austenitize, cond['T_med'], cond['h'], time
    )
    plt.plot(time, T_curve, linewidth=2.5,
             color=cond['color'], label=cond['name'])

    # 冷却速度計算(800℃→500℃の平均)
    idx_800 = np.argmin(np.abs(T_curve - 800))
    idx_500 = np.argmin(np.abs(T_curve - 500))
    cooling_rate = (T_curve[idx_800] - T_curve[idx_500]) / (time[idx_500] - time[idx_800])

    print(f"{cond['name']}:")
    print(f"  Cooling Rate (800→500℃): {cooling_rate:.1f} ℃/s")
    print(f"  Time to Ms ({Ms_temp}℃): {time[np.argmin(np.abs(T_curve - Ms_temp))]:.1f} s\n")

plt.xlabel('Time (s)')
plt.ylabel('Temperature (°C)')
plt.title('Quenching Cooling Curves and Microstructure Formation')
plt.legend(loc='upper right')
plt.grid(True, alpha=0.3)
plt.xlim(0, 60)
plt.ylim(0, 900)
plt.savefig('quenching_curves.png', dpi=150, bbox_inches='tight')
plt.show()

2.2.2 Jominy焼入性試験

Jominy試験は、鋼材の焼入性(Hardenability)を評価する標準試験法です。一端を水冷し、冷却速度勾配により硬度分布を測定します。

flowchart LR A[オーステナイト化
850℃, 30分] --> B[試験片を保持
一端のみ水冷] B --> C[冷却速度勾配
端部: 速い
内部: 遅い] C --> D[硬度測定
端面からの距離 vs HRC] D --> E[焼入性評価
硬度低下が緩やか=高] style A fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff style E fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff

コード例2-4: Jominy焼入性カーブのシミュレーション

import numpy as np
import matplotlib.pyplot as plt

def jominy_hardness_profile(distance_mm, HRC_max, DI, steel_type='Low Alloy'):
    """
    Jominy焼入性カーブのモデル

    Parameters
    ----------
    distance_mm : ndarray
        端面からの距離(mm)
    HRC_max : float
        最大硬度(HRC)
    DI : float
        Ideal Diameter(理想臨界直径、焼入性指標)
    steel_type : str
        鋼種

    Returns
    -------
    hardness : ndarray
        硬度分布(HRC)
    """
    # Grossmannの焼入性モデル(簡易版)
    # HRC = HRC_max * exp(-k * distance)
    k = 0.1 / DI  # 減衰定数

    hardness = HRC_max * np.exp(-k * distance_mm)

    # 最小硬度(フェライト+パーライト組織)
    HRC_min = 20
    hardness = np.maximum(hardness, HRC_min)

    return hardness


# 3種類の鋼材の比較
distance = np.linspace(0, 50, 100)  # mm

steels = [
    {'name': 'S45C (Plain Carbon)', 'HRC_max': 62, 'DI': 10},
    {'name': 'SCM440 (Cr-Mo)', 'HRC_max': 60, 'DI': 30},
    {'name': 'SNC815 (Ni-Cr)', 'HRC_max': 58, 'DI': 50}
]

plt.figure(figsize=(12, 7))

for steel in steels:
    hardness = jominy_hardness_profile(distance, steel['HRC_max'], steel['DI'])
    plt.plot(distance, hardness, linewidth=2.5, label=steel['name'])

    # 焼入性評価(硬度がHRC 50に低下する距離)
    idx_hrc50 = np.argmin(np.abs(hardness - 50))
    distance_hrc50 = distance[idx_hrc50]

    print(f"{steel['name']}:")
    print(f"  Maximum Hardness: {steel['HRC_max']} HRC")
    print(f"  Ideal Diameter (DI): {steel['DI']} mm")
    print(f"  Distance to HRC 50: {distance_hrc50:.1f} mm\n")

plt.axhline(y=50, color='k', linestyle='--', alpha=0.5, label='Target: HRC 50')
plt.xlabel('Distance from Quenched End (mm)')
plt.ylabel('Hardness (HRC)')
plt.title('Jominy Hardenability Test: Steel Comparison')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('jominy_hardenability.png', dpi=150, bbox_inches='tight')
plt.show()

# 結果解釈:
# - Plain Carbon(S45C):焼入性低い、表面のみ硬化
# - Cr-Mo(SCM440):中程度の焼入性
# - Ni-Cr(SNC815):高焼入性、深部まで硬化

2.2.3 焼戻しと硬度制御

焼戻し(Tempering)は、焼入れマルテンサイトを適切な温度で再加熱し、硬度と靱性のバランスを調整します。

Hollomon-Jaffe式(焼戻しパラメータ):

$$ P = T (C + \log_{10} t) \times 10^{-3} $$

コード例2-5: 焼戻し硬度予測

import numpy as np
import matplotlib.pyplot as plt

def hollomon_jaffe_parameter(temp_celsius, time_hours, C=20):
    """
    Hollomon-Jaffe焼戻しパラメータ

    Parameters
    ----------
    temp_celsius : float
        焼戻し温度(℃)
    time_hours : float
        焼戻し時間(時間)
    C : float
        定数(デフォルト20)

    Returns
    -------
    P : float
        焼戻しパラメータ
    """
    T_kelvin = temp_celsius + 273.15
    P = T_kelvin * (C + np.log10(time_hours)) * 1e-3

    return P


def tempered_hardness(P, HRC_initial=65):
    """
    焼戻しパラメータから硬度予測

    Parameters
    ----------
    P : float
        焼戻しパラメータ
    HRC_initial : float
        焼入れ後の初期硬度(HRC)

    Returns
    -------
    HRC : float
        焼戻し後の硬度(HRC)
    """
    # 経験式(鋼種により異なる)
    HRC = HRC_initial - 0.15 * (P - 10) ** 1.5

    # 最小硬度制約
    HRC = np.maximum(HRC, 20)

    return HRC


# 温度と時間の影響評価
temperatures = [200, 300, 400, 500, 600]  # ℃
time_hours = np.logspace(-1, 2, 100)  # 0.1〜100時間

plt.figure(figsize=(12, 8))

for temp in temperatures:
    P_values = [hollomon_jaffe_parameter(temp, t) for t in time_hours]
    hardness = [tempered_hardness(P) for P in P_values]

    plt.plot(time_hours, hardness, linewidth=2.5, label=f'{temp}°C')

    # 目標硬度(HRC 45)到達時間
    idx_target = np.argmin(np.abs(np.array(hardness) - 45))
    time_target = time_hours[idx_target]

    print(f"Tempering at {temp}°C:")
    print(f"  Time to reach HRC 45: {time_target:.2f} hours\n")

plt.axhline(y=45, color='k', linestyle='--', alpha=0.5, label='Target: HRC 45')
plt.xscale('log')
plt.xlabel('Tempering Time (hours)')
plt.ylabel('Hardness (HRC)')
plt.title('Tempering: Hardness vs Time and Temperature')
plt.legend()
plt.grid(True, alpha=0.3, which='both')
plt.savefig('tempering_hardness.png', dpi=150, bbox_inches='tight')
plt.show()

# 等硬度線プロット(2Dマップ)
fig, ax = plt.subplots(figsize=(12, 8))

temp_range = np.linspace(150, 650, 50)
time_range = np.logspace(-1, 2, 50)
T_mesh, Time_mesh = np.meshgrid(temp_range, time_range)

Hardness_mesh = np.zeros_like(T_mesh)
for i in range(T_mesh.shape[0]):
    for j in range(T_mesh.shape[1]):
        P = hollomon_jaffe_parameter(T_mesh[i, j], Time_mesh[i, j])
        Hardness_mesh[i, j] = tempered_hardness(P)

contour = ax.contourf(T_mesh, Time_mesh, Hardness_mesh, levels=15, cmap='viridis')
contour_lines = ax.contour(T_mesh, Time_mesh, Hardness_mesh, levels=[40, 45, 50, 55, 60],
                             colors='white', linewidths=2)
ax.clabel(contour_lines, inline=True, fontsize=10, fmt='%d HRC')

ax.set_xlabel('Tempering Temperature (°C)')
ax.set_ylabel('Tempering Time (hours)')
ax.set_yscale('log')
ax.set_title('Tempering Map: Hardness Contours')
plt.colorbar(contour, label='Hardness (HRC)')
plt.savefig('tempering_map.png', dpi=150, bbox_inches='tight')
plt.show()

2.3 時効硬化(Age Hardening)

2.3.1 時効硬化のメカニズム

時効硬化(Age Hardening, Precipitation Hardening)は、過飽和固溶体から微細析出物を生成させ、転位運動を阻害して強度を向上させます。

時効硬化プロセス(Al合金の例):

  1. 溶体化処理(Solution Treatment):高温(500-550℃)で合金元素を固溶
  2. 急冷(Quenching):室温まで急冷し、過飽和固溶体(SSSS)を保持
  3. 時効処理(Aging):中温(100-200℃)で析出物を生成
    • GP zone(Guinier-Preston zone)形成
    • 中間相(θ''、θ')析出
    • 安定相(θ、Mg₂Si)粗大化
flowchart LR A[過飽和固溶体
SSSS] --> B[GP zone形成
数nm] B --> C[中間相θ''
準安定] C --> D[θ'相
数10nm] D --> E[安定相θ
粗大化] B -.-> F[ピーク強度
最適析出] D -.-> G[過時効
強度低下] style A fill:#fce7f3,stroke:#f093fb,stroke-width:2px style F fill:#f093fb,stroke:#f5576c,stroke-width:2px,color:#fff style G fill:#fee2e2,stroke:#ef4444,stroke-width:2px

Orowan機構(析出強化):

$$ \Delta \sigma = \frac{M G b}{\lambda} $$

コード例2-6: 時効硬化カーブのシミュレーション

import numpy as np
import matplotlib.pyplot as plt

def age_hardening_strength(time_hours, temp_celsius, k=0.5, n=0.3):
    """
    時効硬化の強度変化モデル(JMA方程式ベース)

    Parameters
    ----------
    time_hours : ndarray
        時効時間(時間)
    temp_celsius : float
        時効温度(℃)
    k : float
        速度定数
    n : float
        Avrami指数

    Returns
    -------
    strength : ndarray
        引張強度(MPa)
    """
    # 温度依存性(Arrhenius型)
    k_eff = k * np.exp(-(5000 / (temp_celsius + 273.15)))

    # JMA方程式(相変態分率)
    f = 1 - np.exp(-(k_eff * time_hours) ** n)

    # 強度モデル
    sigma_0 = 100  # 固溶体強度(MPa)
    delta_sigma_max = 300  # 最大析出強化(MPa)

    # ピーク時効後は過時効で低下
    peak_fraction = 0.6
    strength = sigma_0 + delta_sigma_max * f * np.exp(-2 * (f - peak_fraction) ** 2)

    return strength


# 温度依存性の評価
temperatures = [150, 180, 200, 220]
time_hours = np.logspace(-1, 3, 200)  # 0.1〜1000時間

plt.figure(figsize=(12, 8))

for temp in temperatures:
    strength = age_hardening_strength(time_hours, temp)
    plt.plot(time_hours, strength, linewidth=2.5, label=f'{temp}°C')

    # ピーク強度と到達時間
    peak_strength = np.max(strength)
    peak_time = time_hours[np.argmax(strength)]

    print(f"Age Hardening at {temp}°C:")
    print(f"  Peak Strength: {peak_strength:.1f} MPa")
    print(f"  Time to Peak: {peak_time:.2f} hours\n")

plt.xscale('log')
plt.xlabel('Aging Time (hours)')
plt.ylabel('Tensile Strength (MPa)')
plt.title('Age Hardening: Strength vs Time and Temperature')
plt.legend()
plt.grid(True, alpha=0.3, which='both')
plt.savefig('age_hardening_curve.png', dpi=150, bbox_inches='tight')
plt.show()

# 等強度線(2Dマップ)
fig, ax = plt.subplots(figsize=(12, 8))

temp_range = np.linspace(130, 250, 50)
time_range = np.logspace(-1, 3, 50)
T_mesh, Time_mesh = np.meshgrid(temp_range, time_range)

Strength_mesh = np.zeros_like(T_mesh)
for i in range(T_mesh.shape[0]):
    for j in range(T_mesh.shape[1]):
        strength_val = age_hardening_strength(np.array([Time_mesh[i, j]]), T_mesh[i, j])
        Strength_mesh[i, j] = strength_val[0]

contour = ax.contourf(T_mesh, Time_mesh, Strength_mesh, levels=15, cmap='plasma')
contour_lines = ax.contour(T_mesh, Time_mesh, Strength_mesh,
                             levels=[250, 300, 350, 380], colors='white', linewidths=2)
ax.clabel(contour_lines, inline=True, fontsize=10, fmt='%d MPa')

ax.set_xlabel('Aging Temperature (°C)')
ax.set_ylabel('Aging Time (hours)')
ax.set_yscale('log')
ax.set_title('Age Hardening Map: Strength Contours')
plt.colorbar(contour, label='Tensile Strength (MPa)')
plt.savefig('age_hardening_map.png', dpi=150, bbox_inches='tight')
plt.show()

2.4 TTT図とCCT図の活用

2.4.1 TTT図(Time-Temperature-Transformation)

TTT図(等温変態図)は、一定温度保持時の組織変態を表します。鋼の熱処理設計に不可欠です。

コード例2-7: TTT/CCT図の生成と熱処理シミュレーション

import numpy as np
import matplotlib.pyplot as plt

def generate_TTT_diagram():
    """
    簡易TTT図の生成(共析鋼0.8%C)
    """
    # パーライト変態開始・終了曲線(C曲線)
    time = np.logspace(-1, 5, 200)  # 秒

    # パーライトノーズ(約550℃で最速変態)
    T_pearlite_start = 700 - 150 * np.exp(-((np.log10(time) - 1.5) / 1.5) ** 2)
    T_pearlite_finish = T_pearlite_start - 50

    # ベイナイト変態(350-550℃)
    T_bainite_start = 500 - 150 * np.exp(-((np.log10(time) - 2.5) / 1.2) ** 2)
    T_bainite_finish = T_bainite_start - 50

    # マルテンサイト開始温度(時間無依存)
    Ms_temp = 250

    return time, T_pearlite_start, T_pearlite_finish, T_bainite_start, T_bainite_finish, Ms_temp


def simulate_cooling_path(cooling_rate, T_initial=850, time_max=1000):
    """
    冷却パスのシミュレーション

    Parameters
    ----------
    cooling_rate : float
        冷却速度(℃/s)
    T_initial : float
        初期温度(℃)
    time_max : float
        最大時間(秒)

    Returns
    -------
    time, temperature : ndarray
        冷却パス
    """
    time = np.linspace(0, time_max, 500)
    temperature = T_initial - cooling_rate * time
    temperature = np.maximum(temperature, 25)  # 室温下限

    return time, temperature


# TTT図の生成
time_ttt, T_p_start, T_p_finish, T_b_start, T_b_finish, Ms = generate_TTT_diagram()

# プロット
fig, ax = plt.subplots(figsize=(14, 10))

# TTT曲線
ax.plot(time_ttt, T_p_start, 'r-', linewidth=2.5, label='Pearlite Start')
ax.plot(time_ttt, T_p_finish, 'r--', linewidth=2.5, label='Pearlite Finish')
ax.plot(time_ttt, T_b_start, 'b-', linewidth=2.5, label='Bainite Start')
ax.plot(time_ttt, T_b_finish, 'b--', linewidth=2.5, label='Bainite Finish')
ax.axhline(y=Ms, color='purple', linestyle='-', linewidth=2.5, label=f'Ms (Martensite): {Ms}°C')

# 領域塗りつぶし
ax.fill_between(time_ttt, T_p_start, T_p_finish, alpha=0.3, color='red', label='Pearlite Region')
ax.fill_between(time_ttt, T_b_start, T_b_finish, alpha=0.3, color='blue', label='Bainite Region')
ax.fill_between(time_ttt, 0, Ms, alpha=0.2, color='purple', label='Martensite Region')

# 冷却パスの重ね合わせ
cooling_cases = [
    {'rate': 500, 'name': 'Water Quench (500°C/s)', 'color': 'green', 'linestyle': '-'},
    {'rate': 50, 'name': 'Oil Quench (50°C/s)', 'color': 'orange', 'linestyle': '-'},
    {'rate': 5, 'name': 'Air Cool (5°C/s)', 'color': 'brown', 'linestyle': '-'},
]

for case in cooling_cases:
    time_cool, temp_cool = simulate_cooling_path(case['rate'])
    ax.plot(time_cool, temp_cool, color=case['color'],
            linestyle=case['linestyle'], linewidth=3, label=case['name'])

ax.set_xscale('log')
ax.set_xlabel('Time (s)')
ax.set_ylabel('Temperature (°C)')
ax.set_title('TTT Diagram with Cooling Paths (Eutectoid Steel 0.8% C)')
ax.set_xlim(0.1, 1e4)
ax.set_ylim(0, 900)
ax.legend(loc='upper right', fontsize=9)
ax.grid(True, alpha=0.3, which='both')
plt.savefig('ttt_diagram_with_cooling.png', dpi=150, bbox_inches='tight')
plt.show()

# 組織予測
print("Microstructure Prediction:")
for case in cooling_cases:
    time_cool, temp_cool = simulate_cooling_path(case['rate'])

    # パーライトノーズ通過判定
    pearlite_time_min = time_ttt[np.argmin(T_p_start)]
    pearlite_temp_min = np.min(T_p_start)

    if case['rate'] > 100:
        microstructure = "100% Martensite (avoided pearlite nose)"
    elif case['rate'] > 20:
        microstructure = "Martensite + Bainite (partial transformation)"
    else:
        microstructure = "Pearlite + Ferrite (slow cooling)"

    print(f"{case['name']}: {microstructure}")

演習問題

演習2-1: 焼鈍保持時間の設計(Easy)

炭素鋼(0.5% C)の完全焼鈍において、厚さ20 mmの板材を均質化したい。拡散距離が少なくとも10 mmに達する必要がある。800℃で焼鈍する場合、必要な保持時間を計算せよ。(炭素の拡散係数:$D = 2.0 \times 10^{-5} \exp(-142000 / (8.314 \times T))$ m²/s、$T$はK)

解答例
# 与えられた条件
target_distance = 10e-3  # m(10 mm)
T_celsius = 800
T_kelvin = T_celsius + 273.15

# 拡散係数計算
Q = 142000  # J/mol
D0 = 2.0e-5  # m²/s
R = 8.314    # J/mol·K

D = D0 * np.exp(-Q / (R * T_kelvin))

# 保持時間計算(x² = D * t)
t_required = (target_distance ** 2) / D
t_hours = t_required / 3600

print(f"Complete Annealing Time Calculation:")
print(f"  Temperature: {T_celsius} °C")
print(f"  Target Diffusion Distance: {target_distance*1000} mm")
print(f"  Diffusion Coefficient: {D:.2e} m²/s")
print(f"  Required Holding Time: {t_hours:.2f} hours ({t_required/60:.1f} min)")

# 結果:約8時間必要
# 実務では安全率を考慮し、10-12時間保持が推奨される

演習2-2: 焼入れ後の組織予測(Easy)

共析鋼(0.8% C)を850℃でオーステナイト化後、以下の冷却速度で焼入れした場合の組織を予測せよ:(a) 200℃/s、(b) 30℃/s、(c) 3℃/s。TTT図を参照し、生成組織と予想硬度範囲を答えよ。

解答例

TTT図解析

  • (a) 200℃/s(水焼入れ):パーライトノーズ(約550℃、1秒)を回避 → 100%マルテンサイト、硬度 HRC 64-66
  • (b) 30℃/s(油焼入れ):パーライトノーズを通過するが短時間 → マルテンサイト + 上部ベイナイト、硬度 HRC 55-60
  • (c) 3℃/s(空冷):パーライト変態域に長時間滞在 → 微細パーライト、硬度 HRC 35-40

実験的検証:Jominy試験で実測し、予測と比較するのが理想的

演習2-3: 焼戻し条件の設計(Medium)

焼入れ後の工具鋼(HRC 65)を、目標硬度 HRC 55 に焼戻ししたい。400℃と500℃の2つの温度で焼戻しを行う場合、それぞれの必要時間を計算せよ。(Hollomon-Jaffeパラメータを使用)

解答例
# 逆算:目標硬度からPを求め、時間を計算
def inverse_tempered_hardness(HRC_target, HRC_initial=65):
    """目標硬度からHollomon-Jaffeパラメータを逆算"""
    # HRC = HRC_initial - 0.15 * (P - 10)^1.5
    # → P = 10 + ((HRC_initial - HRC) / 0.15)^(2/3)
    P_target = 10 + ((HRC_initial - HRC_target) / 0.15) ** (2/3)
    return P_target

HRC_target = 55
P_target = inverse_tempered_hardness(HRC_target)

print(f"Target Hollomon-Jaffe Parameter: P = {P_target:.2f}\n")

# 2つの温度で時間計算
temperatures = [400, 500]  # ℃

for temp in temperatures:
    T_kelvin = temp + 273.15
    C = 20

    # P = T * (C + log10(t)) * 1e-3
    # → log10(t) = (P / (T * 1e-3)) - C
    log10_t = (P_target / (T_kelvin * 1e-3)) - C
    t_hours = 10 ** log10_t

    print(f"Tempering at {temp}°C:")
    print(f"  Required Time: {t_hours:.2f} hours")
    print(f"  Practical Recommendation: {t_hours*1.2:.2f} hours (with safety margin)\n")

# 結果:
# 400℃ → 約10時間
# 500℃ → 約2時間
# → 高温ほど短時間で目標硬度に到達

演習2-4: 時効硬化の最適条件決定(Medium)

Al-Cu合金(Al-4%Cu)の時効硬化において、引張強度400 MPaを目標とする。180℃と200℃の2つの温度で時効処理可能な場合、それぞれの最適時効時間と生産性(throughput)を比較せよ。

解答例
# 時効硬化シミュレーション(強度400 MPa到達時間)
target_strength = 400  # MPa
temperatures = [180, 200]

time_hours_range = np.logspace(-1, 3, 500)

for temp in temperatures:
    strength_curve = age_hardening_strength(time_hours_range, temp)

    # 目標強度到達時間
    idx_target = np.argmin(np.abs(strength_curve - target_strength))
    time_target = time_hours_range[idx_target]
    strength_achieved = strength_curve[idx_target]

    # ピーク強度
    peak_strength = np.max(strength_curve)
    peak_time = time_hours_range[np.argmax(strength_curve)]

    print(f"Aging at {temp}°C:")
    print(f"  Time to reach {target_strength} MPa: {time_target:.2f} hours")
    print(f"  Achieved Strength: {strength_achieved:.1f} MPa")
    print(f"  Peak Strength: {peak_strength:.1f} MPa (at {peak_time:.2f} hours)")

    # 生産性評価(バッチ処理)
    batch_capacity = 100  # 部品数/バッチ
    throughput = batch_capacity / time_target  # 部品数/時間

    print(f"  Production Throughput: {throughput:.2f} parts/hour")
    print(f"  Daily Production (24h): {throughput*24:.0f} parts\n")

# 結果:
# 180℃ → 時間長いが、ピーク強度高い(安定)
# 200℃ → 時間短く、生産性高いが、過時効リスク
# → 生産性重視なら200℃、品質安定性重視なら180℃

演習2-5: Jominy試験データからの焼入性評価(Medium)

Jominy試験で以下の硬度データが得られた:端面(0 mm): HRC 62、5 mm: HRC 58、10 mm: HRC 52、15 mm: HRC 45。このデータから、直径30 mmの丸棒を焼入れした場合の中心硬度を予測せよ。

解答例
import numpy as np
from scipy.interpolate import interp1d

# Jominy試験データ
jominy_distance = np.array([0, 5, 10, 15])  # mm
jominy_hardness = np.array([62, 58, 52, 45])  # HRC

# 補間関数の作成
interp_func = interp1d(jominy_distance, jominy_hardness,
                        kind='cubic', fill_value='extrapolate')

# Grossmann換算表(簡易版):丸棒直径 → Jominy等価距離
# 直径30 mmの中心は、冷却速度的にJominy試験の約12-13 mm相当
# (実際の換算表やH-band法を使用すべきだが、ここでは簡易計算)

diameter = 30  # mm
equivalent_jominy_distance = 0.4 * diameter  # 簡易換算(中心部)

predicted_hardness = interp_func(equivalent_jominy_distance)

print(f"Jominy Hardenability Analysis:")
print(f"  Bar Diameter: {diameter} mm")
print(f"  Equivalent Jominy Distance (center): {equivalent_jominy_distance:.1f} mm")
print(f"  Predicted Center Hardness: {predicted_hardness:.1f} HRC")

# 表面硬度(Jominy 0 mm相当)
surface_hardness = interp_func(0)
print(f"  Predicted Surface Hardness: {surface_hardness:.1f} HRC")

# 硬化深さ(HRC 50以上の深さ)
hardness_threshold = 50
try:
    depth_threshold = np.interp(hardness_threshold, jominy_hardness[::-1], jominy_distance[::-1])
    # 丸棒での硬化深さ(簡易換算)
    effective_depth = depth_threshold / 0.4
    print(f"\nCase Depth (HRC ≥ 50): {effective_depth:.1f} mm from surface")
except:
    print(f"\nCase Depth: Exceeds measurement range")

# プロット
plt.figure(figsize=(10, 6))
jominy_fine = np.linspace(0, 20, 100)
hardness_fine = interp_func(jominy_fine)
plt.plot(jominy_fine, hardness_fine, 'b-', linewidth=2, label='Interpolated Curve')
plt.scatter(jominy_distance, jominy_hardness, color='red', s=100,
            zorder=5, label='Measured Data')
plt.axvline(x=equivalent_jominy_distance, color='green', linestyle='--',
            linewidth=2, label=f'Equivalent Position (30mm bar center)')
plt.axhline(y=predicted_hardness, color='green', linestyle='--', alpha=0.5)
plt.xlabel('Distance from Quenched End (mm)')
plt.ylabel('Hardness (HRC)')
plt.title('Jominy Hardenability and Center Hardness Prediction')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('jominy_prediction.png', dpi=150, bbox_inches='tight')
plt.show()

演習2-6: TTT図を用いた熱処理プロセス設計(Hard)

共析鋼(0.8% C)で、50%マルテンサイト + 50%ベイナイトの混合組織を得たい。TTT図を参考に、最適な冷却速度と等温保持条件を設計せよ。目標硬度はHRC 55-58。

解答例
# 戦略:オーステンパリング(Austempering)
# 1. 850℃でオーステナイト化
# 2. Ms温度(250℃)以下のベイナイト域(例:300℃)まで急冷
# 3. 等温保持でベイナイト変態(50%程度)
# 4. 室温まで冷却 → 残留オーステナイトがマルテンサイト化

T_austenitize = 850  # ℃
T_austempering = 300  # ℃(下部ベイナイト域)
Ms = 250  # ℃

# 冷却速度計算(Ms以下に入る前にベイナイト域到達)
# パーライトノーズ(550℃、1秒)を回避する必要
required_cooling_rate = (T_austenitize - T_austempering) / 5  # 5秒以内

print(f"Austempering Process Design:")
print(f"  Step 1: Austenitizing at {T_austenitize}°C")
print(f"  Step 2: Rapid quench to {T_austempering}°C")
print(f"    Required Cooling Rate: >{required_cooling_rate:.1f} °C/s")
print(f"    (Use oil or salt bath quench)")

# ベイナイト変態時間(TTT図から読み取り)
# 300℃での変態開始:約10秒、50%変態:約60秒
t_bainite_start = 10  # 秒
t_bainite_50pct = 60  # 秒

print(f"\n  Step 3: Isothermal hold at {T_austempering}°C")
print(f"    Bainite transformation starts: {t_bainite_start} s")
print(f"    Hold time for 50% bainite: {t_bainite_50pct} s")

# 残留オーステナイト → マルテンサイト変態
print(f"\n  Step 4: Cool to room temperature")
print(f"    Remaining austenite (50%) transforms to martensite below {Ms}°C")

# 組織と硬度予測
print(f"\nExpected Microstructure:")
print(f"  50% Lower Bainite (HRC 50-55)")
print(f"  50% Martensite (HRC 60-65)")
print(f"  Composite Hardness: HRC 55-58 ✓")

# 実験的検証の推奨
print(f"\nExperimental Verification:")
print(f"  1. Conduct dilatometry to confirm transformation kinetics")
print(f"  2. Metallographic examination (SEM, optical microscopy)")
print(f"  3. Hardness testing (Rockwell C scale)")
print(f"  4. Impact toughness testing (Charpy) for quality assurance")

演習2-7: 多段時効処理の最適化(Hard)

Al-Mg-Si合金で、2段時効処理(Two-Step Aging)を行う。第1段(低温、GP zone形成)と第2段(高温、中間相析出)の最適条件を、引張強度とコスト(エネルギー、時間)のトレードオフで決定せよ。

解答例
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import differential_evolution

def two_step_aging_strength(t1_hours, T1_celsius, t2_hours, T2_celsius):
    """
    2段時効処理の強度予測モデル

    Parameters
    ----------
    t1_hours, T1_celsius : float
        第1段時効(時間、温度)
    t2_hours, T2_celsius : float
        第2段時効(時間、温度)

    Returns
    -------
    strength : float
        引張強度(MPa)
    """
    # 第1段:GP zone形成(低温、長時間)
    strength_step1 = 200 + 100 * (1 - np.exp(-0.5 * t1_hours)) * np.exp(-T1_celsius / 200)

    # 第2段:中間相析出(高温、短時間)
    strength_step2 = 150 * (1 - np.exp(-0.2 * t2_hours)) * (1 - np.exp(-(T2_celsius - 150) / 50))

    # 合成強度
    total_strength = strength_step1 + strength_step2

    return total_strength


def calculate_cost(t1_hours, T1_celsius, t2_hours, T2_celsius):
    """
    プロセスコストの計算

    Returns
    -------
    cost : float
        正規化コスト(時間+エネルギー)
    """
    # 時間コスト(生産性)
    time_cost = t1_hours + t2_hours

    # エネルギーコスト(温度×時間)
    energy_cost = (T1_celsius * t1_hours + T2_celsius * t2_hours) / 1000

    # 合計コスト(重み付け)
    total_cost = time_cost + 0.5 * energy_cost

    return total_cost


def objective_function(params):
    """
    多目的最適化目的関数

    強度を最大化、コストを最小化

    Returns
    -------
    -performance : float
        負の性能指標(最小化問題)
    """
    t1, T1, t2, T2 = params

    strength = two_step_aging_strength(t1, T1, t2, T2)
    cost = calculate_cost(t1, T1, t2, T2)

    # 性能指標:強度 / コスト(大きいほど良い)
    performance = strength / cost

    return -performance  # 最小化問題に変換


# 最適化実行
bounds = [
    (1, 24),    # t1: 1-24時間
    (100, 150), # T1: 100-150℃
    (1, 12),    # t2: 1-12時間
    (170, 220)  # T2: 170-220℃
]

result = differential_evolution(
    objective_function,
    bounds,
    maxiter=100,
    seed=42,
    disp=True
)

t1_opt, T1_opt, t2_opt, T2_opt = result.x
strength_opt = two_step_aging_strength(t1_opt, T1_opt, t2_opt, T2_opt)
cost_opt = calculate_cost(t1_opt, T1_opt, t2_opt, T2_opt)

print(f"Two-Step Aging Optimization Results:")
print(f"\nStep 1 (GP Zone Formation):")
print(f"  Temperature: {T1_opt:.1f} °C")
print(f"  Time: {t1_opt:.2f} hours")
print(f"\nStep 2 (Intermediate Phase Precipitation):")
print(f"  Temperature: {T2_opt:.1f} °C")
print(f"  Time: {t2_opt:.2f} hours")
print(f"\nPerformance:")
print(f"  Tensile Strength: {strength_opt:.1f} MPa")
print(f"  Total Process Cost: {cost_opt:.2f} (normalized)")
print(f"  Performance Index: {strength_opt/cost_opt:.2f} MPa/cost")

# 比較:シングルステップ時効
T_single = 180
t_single = 10
strength_single = two_step_aging_strength(0, 100, t_single, T_single)
cost_single = calculate_cost(0, 100, t_single, T_single)

print(f"\nComparison with Single-Step Aging ({T_single}°C, {t_single}h):")
print(f"  Strength: {strength_single:.1f} MPa")
print(f"  Cost: {cost_single:.2f}")
print(f"  Performance Index: {strength_single/cost_single:.2f} MPa/cost")
print(f"\nImprovement:")
print(f"  Strength: +{strength_opt - strength_single:.1f} MPa ({(strength_opt/strength_single-1)*100:.1f}%)")
print(f"  Performance Index: +{(strength_opt/cost_opt) - (strength_single/cost_single):.2f} ({((strength_opt/cost_opt)/(strength_single/cost_single)-1)*100:.1f}%)")

演習2-8: 熱処理プロセスの統計的品質管理(Hard)

工場での焼戻し処理において、温度±5℃、時間±10%の変動がある。目標硬度HRC 50±2を達成する確率を計算し、プロセス能力指数(Cp, Cpk)を評価せよ。許容範囲外の不良率を1%以下に抑えるための改善策を提案せよ。

解答例
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm

# プロセス条件(公称値)
T_nominal = 450  # ℃
t_nominal = 2.0  # 時間
HRC_target = 50

# プロセス変動
T_std = 5 / 3  # ℃(±5℃を3σとする)
t_std = t_nominal * 0.1 / 3  # 時間(±10%を3σとする)

# モンテカルロシミュレーション
n_samples = 10000
np.random.seed(42)

T_samples = np.random.normal(T_nominal, T_std, n_samples)
t_samples = np.random.normal(t_nominal, t_std, n_samples)

# 硬度計算(各サンプル)
hardness_samples = np.array([
    tempered_hardness(hollomon_jaffe_parameter(T, t))
    for T, t in zip(T_samples, t_samples)
])

# 統計解析
HRC_mean = np.mean(hardness_samples)
HRC_std = np.std(hardness_samples)

print(f"Process Capability Analysis:")
print(f"  Target Hardness: {HRC_target} ± 2 HRC")
print(f"  Actual Mean: {HRC_mean:.2f} HRC")
print(f"  Actual Std Dev: {HRC_std:.2f} HRC")

# プロセス能力指数
USL = HRC_target + 2  # Upper Specification Limit
LSL = HRC_target - 2  # Lower Specification Limit

Cp = (USL - LSL) / (6 * HRC_std)
Cpk = min((USL - HRC_mean) / (3 * HRC_std),
          (HRC_mean - LSL) / (3 * HRC_std))

print(f"\nProcess Capability Indices:")
print(f"  Cp = {Cp:.3f}")
print(f"  Cpk = {Cpk:.3f}")

if Cp >= 1.33:
    print(f"  → Cp assessment: CAPABLE (≥1.33)")
else:
    print(f"  → Cp assessment: MARGINAL (<1.33)")

if Cpk >= 1.33:
    print(f"  → Cpk assessment: CAPABLE and CENTERED (≥1.33)")
else:
    print(f"  → Cpk assessment: NEEDS IMPROVEMENT (<1.33)")

# 不良率計算
out_of_spec = np.sum((hardness_samples < LSL) | (hardness_samples > USL))
defect_rate = out_of_spec / n_samples * 100

print(f"\nDefect Rate:")
print(f"  Out of Specification: {out_of_spec} / {n_samples}")
print(f"  Defect Rate: {defect_rate:.2f}%")

if defect_rate < 1.0:
    print(f"  → Target (<1%) ACHIEVED ✓")
else:
    print(f"  → Target (<1%) NOT MET ✗")

# ヒストグラムとプロセス分布
plt.figure(figsize=(12, 6))
plt.hist(hardness_samples, bins=50, density=True, alpha=0.7,
         color='blue', edgecolor='black', label='Actual Distribution')

# 正規分布フィット
x_fit = np.linspace(HRC_mean - 4*HRC_std, HRC_mean + 4*HRC_std, 200)
y_fit = norm.pdf(x_fit, HRC_mean, HRC_std)
plt.plot(x_fit, y_fit, 'r-', linewidth=2, label='Normal Fit')

# 規格限界
plt.axvline(x=LSL, color='green', linestyle='--', linewidth=2, label='LSL/USL')
plt.axvline(x=USL, color='green', linestyle='--', linewidth=2)
plt.axvline(x=HRC_target, color='black', linestyle='-', linewidth=2, label='Target')

# 規格外領域を塗りつぶし
x_below = x_fit[x_fit < LSL]
y_below = norm.pdf(x_below, HRC_mean, HRC_std)
plt.fill_between(x_below, 0, y_below, color='red', alpha=0.3, label='Out of Spec')

x_above = x_fit[x_fit > USL]
y_above = norm.pdf(x_above, HRC_mean, HRC_std)
plt.fill_between(x_above, 0, y_above, color='red', alpha=0.3)

plt.xlabel('Hardness (HRC)')
plt.ylabel('Probability Density')
plt.title(f'Tempering Process Capability (Cp={Cp:.2f}, Cpk={Cpk:.2f})')
plt.legend()
plt.grid(True, alpha=0.3)
plt.savefig('process_capability.png', dpi=150, bbox_inches='tight')
plt.show()

# 改善策の提案
print(f"\nImprovement Recommendations:")

if Cpk < 1.33:
    print(f"  Priority 1: Reduce process variation")
    print(f"    - Improve temperature control (±3°C target)")
    print(f"    - Calibrate furnace thermocouples")
    print(f"    - Implement SPC charts for real-time monitoring")

if abs(HRC_mean - HRC_target) > 0.5:
    print(f"  Priority 2: Center the process")
    print(f"    - Adjust nominal temperature to {T_nominal + (HRC_target - HRC_mean)*2:.1f}°C")

print(f"  Priority 3: Implement closed-loop control")
print(f"    - Measure hardness in-line (non-destructive testing)")
print(f"    - Adaptive control based on feedback")

# シミュレーション:改善後の予測
T_std_improved = 3 / 3  # ±3℃
t_std_improved = t_nominal * 0.05 / 3  # ±5%

T_samples_improved = np.random.normal(T_nominal, T_std_improved, n_samples)
t_samples_improved = np.random.normal(t_nominal, t_std_improved, n_samples)

hardness_improved = np.array([
    tempered_hardness(hollomon_jaffe_parameter(T, t))
    for T, t in zip(T_samples_improved, t_samples_improved)
])

HRC_std_improved = np.std(hardness_improved)
Cp_improved = (USL - LSL) / (6 * HRC_std_improved)
defect_rate_improved = np.sum((hardness_improved < LSL) | (hardness_improved > USL)) / n_samples * 100

print(f"\nProjected Improvement (±3°C, ±5% time):")
print(f"  New Cp: {Cp_improved:.3f} (from {Cp:.3f})")
print(f"  New Defect Rate: {defect_rate_improved:.2f}% (from {defect_rate:.2f}%)")
print(f"  → Improvement: {defect_rate - defect_rate_improved:.2f}% reduction")

演習2-9: 熱処理シミュレーションの総合課題(Hard)

自動車用ギア(SCM440)の製造プロセス全体(浸炭焼入れ → 焼戻し → 表面硬度HRC 58-62、芯部硬度HRC 35-40)を設計せよ。プロセス時間、エネルギーコスト、材料特性のバランスを考慮し、Pythonで最適プロセスを決定せよ。

解答例
# 総合プロセス設計の枠組み
print("Comprehensive Heat Treatment Process Design for Automotive Gear (SCM440)")
print("="*70)

# ステップ1: 浸炭(Carburizing)
print("\nStep 1: Carburizing Process")
T_carburizing = 930  # ℃
t_carburizing = 8    # 時間(厚さ3mm浸炭層)
case_depth = 3       # mm

print(f"  Temperature: {T_carburizing}°C")
print(f"  Time: {t_carburizing} hours")
print(f"  Target Case Depth: {case_depth} mm")
print(f"  Carbon Potential: 1.0-1.2%")

# ステップ2: 拡散(Diffusion Hold)
print("\nStep 2: Diffusion Hold")
T_diffusion = 850  # ℃
t_diffusion = 2    # 時間
print(f"  Temperature: {T_diffusion}°C")
print(f"  Time: {t_diffusion} hours")
print(f"  Purpose: Uniform carbon distribution")

# ステップ3: 焼入れ(Quenching)
print("\nStep 3: Quenching")
T_quench_start = 850
T_quench_medium = 60  # 油温
cooling_rate = 50      # ℃/s

print(f"  Quench Medium: Oil at {T_quench_medium}°C")
print(f"  Cooling Rate: ~{cooling_rate}°C/s")
print(f"  Expected Surface Microstructure: Martensite (HRC 60-64)")
print(f"  Expected Core Microstructure: Martensite + Bainite (HRC 45-50)")

# ステップ4: 焼戻し(Tempering)
print("\nStep 4: Tempering")
T_tempering = 180  # ℃(低温焼戻し)
t_tempering = 2    # 時間

# 硬度予測(簡易)
P_surface = hollomon_jaffe_parameter(T_tempering, t_tempering)
HRC_surface_tempered = tempered_hardness(P_surface, HRC_initial=62)

print(f"  Temperature: {T_tempering}°C")
print(f"  Time: {t_tempering} hours")
print(f"  Expected Surface Hardness: HRC {HRC_surface_tempered:.0f}")
print(f"  Expected Core Hardness: HRC 35-40 (minimal change)")

# プロセス評価
print("\n" + "="*70)
print("Process Performance Evaluation:")

# 総プロセス時間
total_time = t_carburizing + t_diffusion + 0.5 + t_tempering  # 焼入れ0.5h
print(f"  Total Process Time: {total_time:.1f} hours")

# エネルギーコスト(簡易計算)
# 炉容積1m³、ヒーター効率70%、電力単価0.15 USD/kWh
furnace_volume = 1.0  # m³
heat_capacity = 1200  # kJ/m³/℃
efficiency = 0.7

energy_carb = furnace_volume * heat_capacity * T_carburizing * t_carburizing / efficiency
energy_diff = furnace_volume * heat_capacity * T_diffusion * t_diffusion / efficiency
energy_temp = furnace_volume * heat_capacity * T_tempering * t_tempering / efficiency

total_energy = (energy_carb + energy_diff + energy_temp) / 3600  # kWh
energy_cost = total_energy * 0.15  # USD/バッチ

print(f"  Total Energy Consumption: {total_energy:.1f} kWh/batch")
print(f"  Energy Cost: ${energy_cost:.2f}/batch (100 gears)")
print(f"  Per-Gear Cost: ${energy_cost/100:.4f}")

# 材料特性評価
print(f"\nTarget Material Properties:")
print(f"  Surface Hardness: HRC 58-62 (Target: {HRC_surface_tempered:.0f} ✓)")
print(f"  Core Hardness: HRC 35-40 ✓")
print(f"  Case Depth: {case_depth} mm ✓")
print(f"  Core Toughness: Maintained by lower hardness")

# 最適化の余地
print(f"\nOptimization Opportunities:")
print(f"  1. Use vacuum carburizing → Reduce time by 30%")
print(f"  2. Implement press quenching → Reduce distortion")
print(f"  3. Online hardness monitoring → Quality assurance")
print(f"  4. Energy recovery system → Reduce energy cost by 20%")

# 結論
print(f"\n" + "="*70)
print("Conclusion:")
print(f"  This process meets all specifications for automotive gears.")
print(f"  Total cycle time: {total_time:.1f} hours (competitive)")
print(f"  Energy efficiency: Moderate (improvement possible)")
print(f"  Quality assurance: Jominy testing + statistical process control recommended")

学習達成度チェックリスト

基本理解レベル

実践スキルレベル

応用力レベル

参考文献

  1. Porter, D.A., Easterling, K.E., Sherif, M.Y. (2009). Phase Transformations in Metals and Alloys (3rd ed.). CRC Press, pp. 234-278, 345-389.
  2. Krauss, G. (2015). Steels: Processing, Structure, and Performance (2nd ed.). ASM International, pp. 145-189, 267-312.
  3. Honeycombe, R.W.K., Bhadeshia, H.K.D.H. (2017). Steels: Microstructure and Properties (4th ed.). Butterworth-Heinemann, pp. 89-124, 201-245.
  4. ASM International. (1991). ASM Handbook Volume 4: Heat Treating. ASM International, pp. 456-489, 567-602.
  5. Callister, W.D., Rethwisch, D.G. (2020). Materials Science and Engineering: An Introduction (10th ed.). Wiley, pp. 345-378, 412-456.
  6. Totten, G.E. (Ed.). (2006). Steel Heat Treatment: Metallurgy and Technologies (2nd ed.). CRC Press, pp. 123-167, 289-334.
  7. Polmear, I.J., StJohn, D., Nie, J.F., Qian, M. (2017). Light Alloys: Metallurgy of the Light Metals (5th ed.). Butterworth-Heinemann, pp. 178-223, 267-301.
  8. Brooks, C.R. (1996). Principles of the Heat Treatment of Plain Carbon and Low Alloy Steels. ASM International, pp. 56-89, 134-178.

免責事項