🌐 JP | 🇬🇧 EN Last sync: 2025-11-16

第4章: 疲労と破壊力学

繰り返し荷重とき裂進展の解析

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$

💻 コード例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}$(臨界値)

💻 コード例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}")

📝 章末演習

✏️ 演習問題
  1. S_f=250 MPa、b=-0.12の鋼についてS-N曲線を生成してください。150 MPaでの寿命を推定してください。
  2. Goodman線図を用いて、σ_a=120 MPa、σ_m=80 MPa(S_u=500、S_f=200)が安全かどうかを判定してください。
  3. 150 MPa下の平板にある5 mmの縁き裂についてK_Iを計算してください。K_Ic=40 MPa√mの場合、破壊するでしょうか。
  4. Paris則(C=1e-11、m=3)を用いて、き裂が2mmから10mmまで進展するサイクル数を予測してください。
  5. Minerの法則を適用してください: 120 MPaで10万サイクル、160 MPaで5万サイクル、200 MPaで1万サイクル。残存寿命を予測してください。

まとめ

免責事項