熱処理プロセスは、材料の機械的性質(強度、硬度、靱性)を制御する中核技術です。加熱・保持・冷却の温度履歴により、相変態、拡散、析出を制御し、目標特性を実現します。この章では、焼鈍、焼入れ・焼戻し、時効硬化の原理をPythonシミュレーションで学び、TTT/CCT図を活用した実践的な熱処理設計を習得します。
学習目標
この章を読むことで、以下を習得できます:
- ✅ 焼鈍(Annealing)の種類(完全焼鈍、応力除去焼鈍、再結晶)と効果を理解する
- ✅ 焼入れ(Quenching)の冷却速度と組織(マルテンサイト、ベイナイト)の関係を説明できる
- ✅ Jominy試験による焼入性(Hardenability)評価を実施できる
- ✅ 焼戻し(Tempering)による硬度と靱性のバランス設計を理解する
- ✅ 時効硬化(Age Hardening)における析出強化メカニズムを理解する
- ✅ TTT図(Time-Temperature-Transformation)とCCT図を活用した熱処理設計ができる
- ✅ Pythonで拡散方程式、粒成長、析出強化をシミュレートできる
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} $$- $x$:拡散距離(m)
- $D$:拡散係数(m²/s)
- $t$:時間(s)
Arrheniusの式(温度依存性):
$$ D = D_0 \exp\left(-\frac{Q}{RT}\right) $$- $D_0$:頻度因子(m²/s)
- $Q$:活性化エネルギー(J/mol)
- $R$:気体定数(8.314 J/mol·K)
- $T$:絶対温度(K)
コード例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 $$- $d$:平均粒径(時刻 $t$)
- $d_0$:初期粒径
- $n$:成長指数(通常2-3)
- $K$:温度依存定数
コード例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}}) $$- $h$:冷却係数(1/s)
- $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)を評価する標準試験法です。一端を水冷し、冷却速度勾配により硬度分布を測定します。
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} $$- $P$:焼戻しパラメータ(無次元)
- $T$:焼戻し温度(K)
- $t$:焼戻し時間(時間)
- $C$:定数(通常20)
コード例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合金の例):
- 溶体化処理(Solution Treatment):高温(500-550℃)で合金元素を固溶
- 急冷(Quenching):室温まで急冷し、過飽和固溶体(SSSS)を保持
- 時効処理(Aging):中温(100-200℃)で析出物を生成
- GP zone(Guinier-Preston zone)形成
- 中間相(θ''、θ')析出
- 安定相(θ、Mg₂Si)粗大化
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} $$- $\Delta \sigma$:強度増加(MPa)
- $M$:Taylor因子(~3)
- $G$:剪断弾性率(GPa)
- $b$:Burgersベクトル(nm)
- $\lambda$:析出物間隔(nm)
コード例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")
学習達成度チェックリスト
基本理解レベル
- ☐ 焼鈍の4つの種類(完全焼鈍、応力除去、再結晶、球状化)を説明できる
- ☐ Fickの拡散方程式とArrheniusの式を理解している
- ☐ 焼入れ冷却速度と組織(マルテンサイト、ベイナイト、パーライト)の関係を説明できる
- ☐ 焼戻しによる硬度と靱性のトレードオフを理解している
- ☐ 時効硬化の3段階(溶体化→急冷→時効)を説明できる
実践スキルレベル
- ☐ 拡散距離と保持時間を計算し、焼鈍プロファイルを設計できる
- ☐ Jominy試験データから焼入性を評価できる
- ☐ Hollomon-Jaffeパラメータで焼戻し条件を決定できる
- ☐ TTT/CCT図を読み取り、冷却速度から組織を予測できる
- ☐ 時効硬化カーブから最適時効時間を決定できる
応用力レベル
- ☐ TTT図を用いた複雑な熱処理プロセス(オーステンパリングなど)を設計できる
- ☐ 2段時効処理の最適化(強度・コストのトレードオフ)ができる
- ☐ プロセス能力指数(Cp, Cpk)で熱処理品質を統計的に評価できる
- ☐ 浸炭焼入れなどの複合プロセス全体を設計・最適化できる
- ☐ モンテカルロシミュレーションでプロセス変動の影響を定量評価できる
- ☐ 熱処理のエネルギーコストと生産性を総合的に評価できる
参考文献
- 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.
- Krauss, G. (2015). Steels: Processing, Structure, and Performance (2nd ed.). ASM International, pp. 145-189, 267-312.
- Honeycombe, R.W.K., Bhadeshia, H.K.D.H. (2017). Steels: Microstructure and Properties (4th ed.). Butterworth-Heinemann, pp. 89-124, 201-245.
- ASM International. (1991). ASM Handbook Volume 4: Heat Treating. ASM International, pp. 456-489, 567-602.
- Callister, W.D., Rethwisch, D.G. (2020). Materials Science and Engineering: An Introduction (10th ed.). Wiley, pp. 345-378, 412-456.
- Totten, G.E. (Ed.). (2006). Steel Heat Treatment: Metallurgy and Technologies (2nd ed.). CRC Press, pp. 123-167, 289-334.
- 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.
- Brooks, C.R. (1996). Principles of the Heat Treatment of Plain Carbon and Low Alloy Steels. ASM International, pp. 56-89, 134-178.