4.1 疲労の基礎
疲労とは、繰り返し荷重によって構造が徐々に損傷していく現象であり、機械的破壊の80〜90%を引き起こします。
📐 応力振幅と平均応力:
$$\sigma_a = \frac{\sigma_{max} - \sigma_{min}}{2}, \quad \sigma_m = \frac{\sigma_{max} + \sigma_{min}}{2}$$
応力比: $R = \frac{\sigma_{min}}{\sigma_{max}}$
💻 コード例1: S-N曲線の生成
# 必要環境:
# - Python 3.9+
# - matplotlib>=3.7.0
# - numpy>=1.24.0, <2.0.0
import numpy as np
import matplotlib.pyplot as plt
def generate_sn_curve(material='steel'):
"""S-N(Wöhler)曲線を生成する"""
materials = {
'steel': {'S_f': 200, 'b': -0.12, 'N_e': 1e6},
'aluminum': {'S_f': 100, 'b': -0.10, 'N_e': 5e8}
}
props = materials[material]
# Basquin式: S = S_f * N^b
N = np.logspace(3, 9, 100)
S = props['S_f'] * (N / 2e3)**props['b']
# 鋼の疲労限度
if material == 'steel':
S[N > props['N_e']] = S[N > props['N_e']][0]
return N, S
fig, ax = plt.subplots(figsize=(10, 6))
for material in ['steel', 'aluminum']:
N, S = generate_sn_curve(material)
ax.loglog(N, S, linewidth=2, label=material.capitalize())
ax.set_xlabel('Cycles to Failure (N)', fontsize=12)
ax.set_ylabel('Stress Amplitude (MPa)', fontsize=12)
ax.set_title('S-N Curves for Different Materials', fontsize=14, fontweight='bold')
ax.legend()
ax.grid(True, which='both', alpha=0.3)
plt.show()4.2 平均応力の影響
平均応力は疲労寿命に影響します。GoodmanおよびGerber線図は、平均応力と交番応力が組み合わさった条件での破壊を予測します。
📐 平均応力の補正:
Goodman: $\frac{\sigma_a}{S_f} + \frac{\sigma_m}{S_u} = 1$
Gerber: $\frac{\sigma_a}{S_f} + \left(\frac{\sigma_m}{S_u}\right)^2 = 1$
Soderberg: $\frac{\sigma_a}{S_f} + \frac{\sigma_m}{S_y} = 1$
Goodman: $\frac{\sigma_a}{S_f} + \frac{\sigma_m}{S_u} = 1$
Gerber: $\frac{\sigma_a}{S_f} + \left(\frac{\sigma_m}{S_u}\right)^2 = 1$
Soderberg: $\frac{\sigma_a}{S_f} + \frac{\sigma_m}{S_y} = 1$
💻 コード例2: Goodman線図
def goodman_diagram(S_u=500, S_f=200, S_y=300):
"""Goodman線図を生成する"""
sigma_m = np.linspace(0, S_u, 100)
# Goodman直線
sigma_a_goodman = S_f * (1 - sigma_m / S_u)
# Gerber放物線
sigma_a_gerber = S_f * (1 - (sigma_m / S_u)**2)
# Soderberg直線
sigma_a_soderberg = S_f * (1 - sigma_m / S_y)
plt.figure(figsize=(10, 7))
plt.plot(sigma_m, sigma_a_goodman, 'b-', linewidth=2, label='Goodman')
plt.plot(sigma_m, sigma_a_gerber, 'r-', linewidth=2, label='Gerber')
plt.plot(sigma_m, sigma_a_soderberg, 'g-', linewidth=2, label='Soderberg')
plt.fill_between(sigma_m, 0, sigma_a_goodman, alpha=0.2)
plt.xlabel('Mean Stress σ_m (MPa)', fontsize=12)
plt.ylabel('Alternating Stress σ_a (MPa)', fontsize=12)
plt.title('Goodman Diagram', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()
goodman_diagram()4.3 破壊力学の基礎
破壊力学は、応力拡大係数を用いてき裂の進展と破壊を解析します。
📐 応力拡大係数:
$$K_I = Y\sigma\sqrt{\pi a}$$
ここで $Y$ は形状係数、$\sigma$ は負荷応力、$a$ はき裂長さです。
破壊靱性の判定基準: $K_I = K_{Ic}$(臨界値)
破壊靱性の判定基準: $K_I = K_{Ic}$(臨界値)
💻 コード例3: 応力拡大係数の計算
def stress_intensity_factor(sigma, crack_length, geometry='center_crack'):
"""応力拡大係数 K_I を計算する"""
a = crack_length
# 形状係数
if geometry == 'center_crack':
Y = 1.0 # 無限平板の場合
elif geometry == 'edge_crack':
Y = 1.12
elif geometry == 'semi_elliptical':
Y = 0.73
K_I = Y * sigma * np.sqrt(np.pi * a)
return K_I
# 例: き裂進展の解析
crack_lengths = np.linspace(1, 20, 100) # mm
sigma = 100 # MPa
K_I = [stress_intensity_factor(sigma, a/1000, 'edge_crack') for a in crack_lengths]
plt.figure(figsize=(10, 6))
plt.plot(crack_lengths, K_I, 'b-', linewidth=2)
plt.axhline(30, color='r', linestyle='--', label='K_Ic = 30 MPa√m')
plt.xlabel('Crack Length (mm)', fontsize=12)
plt.ylabel('Stress Intensity Factor K_I (MPa√m)', fontsize=12)
plt.title('Stress Intensity vs Crack Length', fontsize=14, fontweight='bold')
plt.legend()
plt.grid(True, alpha=0.3)
plt.show()4.4 疲労き裂進展のParis則
Paris則は、繰り返し荷重下でのき裂進展速度を記述します。
📐 Paris則:
$$\frac{da}{dN} = C(\Delta K)^m$$
ここで $\Delta K = K_{max} - K_{min}$ であり、$C$ と $m$ は材料定数です。
💻 コード例4: 疲労き裂進展の予測
def paris_law_integration(a_0, sigma, Y, K_Ic, C=1e-11, m=3):
"""Paris則を積分してき裂進展を予測する"""
a = a_0
N = 0
a_history = [a]
N_history = [N]
while True:
# Kを計算
K_max = Y * sigma * np.sqrt(np.pi * a)
K_min = 0 # R = 0
Delta_K = K_max - K_min
# 破壊の判定
if K_max >= K_Ic:
break
# Paris則: da/dN
da_dN = C * (Delta_K * 1e6)**m # Pa√m に変換
# き裂長さを更新
dN = 100 # サイクル増分
a = a + da_dN * dN
N = N + dN
a_history.append(a)
N_history.append(N)
if N > 1e7: # 最大サイクル数
break
return np.array(N_history), np.array(a_history)
# シミュレーション
N, a = paris_law_integration(a_0=0.001, sigma=100, Y=1.12, K_Ic=30e6)
plt.figure(figsize=(10, 6))
plt.plot(N, a*1000, 'b-', linewidth=2)
plt.xlabel('Cycles (N)', fontsize=12)
plt.ylabel('Crack Length (mm)', fontsize=12)
plt.title('Fatigue Crack Growth Prediction', fontsize=14, fontweight='bold')
plt.grid(True, alpha=0.3)
plt.show()
print(f"Cycles to failure: {N[-1]:.0f}")4.5 低サイクル疲労と高サイクル疲労
低サイクル疲労(LCF)は塑性ひずみを伴い、高サイクル疲労(HCF)は主に弾性的です。
💻 コード例5: Coffin-Manson関係式
def coffin_manson(N_f, epsilon_f=0.5, c=-0.6):
"""LCFのためのCoffin-Manson式"""
# Δε_p/2 = ε_f' * (2*N_f)^c
delta_epsilon_p = epsilon_f * (2 * N_f)**c
return delta_epsilon_p
N_values = np.logspace(1, 5, 100)
epsilon_p = coffin_manson(N_values)
plt.figure(figsize=(10, 6))
plt.loglog(N_values, epsilon_p, 'b-', linewidth=2)
plt.xlabel('Cycles to Failure (N_f)', fontsize=12)
plt.ylabel('Plastic Strain Amplitude', fontsize=12)
plt.title('Coffin-Manson Relationship (LCF)', fontsize=14, fontweight='bold')
plt.grid(True, which='both', alpha=0.3)
plt.show()4.6 疲労寿命の予測
Minerの法則のような累積損傷モデルは、変動振幅荷重下での寿命を予測します。
📐 Minerの法則(線形損傷累積):
$$\sum_{i=1}^{k} \frac{n_i}{N_i} = 1$$
ここで $n_i$ は応力レベル $i$ で負荷されたサイクル数、$N_i$ は破壊までのサイクル数です。
💻 コード例6: Minerの法則の適用
def miners_rule(stress_levels, cycles_applied):
"""累積疲労損傷を計算する"""
# S-N曲線のパラメータ
S_f, b = 200, -0.12
damage = 0
for S, n in zip(stress_levels, cycles_applied):
# S-N曲線から N_f を計算
N_f = (S / S_f)**(1/b) * 2e3
# 損傷分率を加算
damage += n / N_f
return damage
# 例: 変動振幅荷重
stress_levels = [150, 200, 250] # MPa
cycles_applied = [50000, 20000, 5000]
damage = miners_rule(stress_levels, cycles_applied)
remaining_life_fraction = 1 - damage
print(f"Cumulative Damage: {damage:.3f}")
print(f"Remaining Life: {remaining_life_fraction*100:.1f}%")
if damage >= 1:
print("Failure predicted!")4.7 破壊靱性試験
ASTM E399は、平面ひずみ破壊靱性(K_Ic)試験の手順を規定しています。
💻 コード例7: 試験データからのK_Ic算出
def calculate_KIc(P_Q, B, W, a):
"""コンパクトテンション試験からK_Icを計算する"""
# P_Q: 5%セカント荷重
# B: 板厚, W: 幅, a: き裂長さ
alpha = a / W
# CT試験片の形状関数
f_alpha = (2 + alpha) / (1 - alpha)**1.5 * \
(0.886 + 4.64*alpha - 13.32*alpha**2 + 14.72*alpha**3 - 5.6*alpha**4)
K_Q = (P_Q / (B * np.sqrt(W))) * f_alpha
# 妥当性チェック(ASTM E399)
valid = True
if a < 0.45*W or a > 0.55*W:
valid = False
return K_Q, valid
# 例
P_Q = 15000 # N
B, W, a = 25e-3, 50e-3, 25e-3 # m
K_Ic, valid = calculate_KIc(P_Q, B, W, a)
print(f"K_Ic = {K_Ic/1e6:.1f} MPa√m")
print(f"Test valid: {valid}")📝 章末演習
✏️ 演習問題
- S_f=250 MPa、b=-0.12の鋼についてS-N曲線を生成してください。150 MPaでの寿命を推定してください。
- Goodman線図を用いて、σ_a=120 MPa、σ_m=80 MPa(S_u=500、S_f=200)が安全かどうかを判定してください。
- 150 MPa下の平板にある5 mmの縁き裂についてK_Iを計算してください。K_Ic=40 MPa√mの場合、破壊するでしょうか。
- Paris則(C=1e-11、m=3)を用いて、き裂が2mmから10mmまで進展するサイクル数を予測してください。
- Minerの法則を適用してください: 120 MPaで10万サイクル、160 MPaで5万サイクル、200 MPaで1万サイクル。残存寿命を予測してください。
まとめ
- 疲労は繰り返し荷重により機械的破壊の80〜90%を引き起こす
- S-N曲線は疲労寿命と応力振幅の関係を特徴づける
- 平均応力の影響はGoodman、Gerber、Soderbergの基準で予測される
- 破壊力学は応力拡大係数を用いる: K_I = Yσ√(πa)
- Paris則は疲労き裂進展を記述する: da/dN = C(ΔK)^m
- LCFは塑性ひずみを伴い(Coffin-Manson)、HCFは弾性的である
- Minerの法則は変動荷重下での累積損傷を予測する