曲げ応力と断面二次モーメント

梁に曲げモーメントが作用すると、断面内には引張と圧縮の応力が分布します。この曲げ応力(bending stress) の大きさは、曲げモーメントだけでなく断面の形状に依存します。断面形状の「曲げに対する強さ」を表す量が断面二次モーメント(second moment of area) です。

本記事では、曲げ応力の公式 $\sigma = My/I$ を導出し、各種断面の断面二次モーメントの計算方法を解説します。

本記事の内容

  • 曲げ応力の公式 $\sigma = My/I$ の導出
  • 断面二次モーメント $I$ の定義と計算
  • 矩形・円形・I形断面の $I$
  • 平行軸の定理
  • Pythonでの可視化

前提知識

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

曲げ応力の導出

仮定

オイラー・ベルヌーイの梁理論(Euler-Bernoulli beam theory)では、以下の仮定を置きます:

  1. 平面保持の仮定: 変形前に平面であった断面は、変形後も平面を保つ
  2. 微小変形: ひずみは微小
  3. フックの法則が成立: 弾性範囲内

導出

曲率半径 $\rho$ で曲がった梁を考えます。中立面(変形しない面)から距離 $y$ の位置のひずみは:

$$ \varepsilon = \frac{y}{\rho} $$

フックの法則から:

$$ \sigma = E\varepsilon = \frac{Ey}{\rho} $$

断面に作用する曲げモーメントは、この応力分布による中立軸まわりのモーメントです:

$$ M = \int_A \sigma \cdot y \, dA = \int_A \frac{Ey^2}{\rho} \, dA = \frac{E}{\rho} \int_A y^2 \, dA $$

ここで、$\int_A y^2 \, dA$ が断面二次モーメント $I$ です:

$$ \boxed{I = \int_A y^2 \, dA} $$

したがって:

$$ M = \frac{EI}{\rho} \implies \frac{1}{\rho} = \frac{M}{EI} $$

$\sigma = Ey/\rho$ に代入すると:

$$ \boxed{\sigma = \frac{My}{I}} $$

これが曲げ応力の公式です。$y$ は中立軸からの距離、$M$ は曲げモーメント、$I$ は断面二次モーメントです。

最大曲げ応力

最大曲げ応力は中立軸から最も遠い位置 $y = c$(断面の上端または下端)で生じます:

$$ \sigma_{\max} = \frac{Mc}{I} = \frac{M}{Z} $$

ここで $Z = I/c$ は断面係数(section modulus) です。

各種断面の断面二次モーメント

矩形断面

幅 $b$、高さ $h$ の矩形断面:

$$ I = \int_{-h/2}^{h/2} y^2 \cdot b \, dy = b \left[\frac{y^3}{3}\right]_{-h/2}^{h/2} = b \cdot \frac{2}{3}\left(\frac{h}{2}\right)^3 $$

$$ \boxed{I = \frac{bh^3}{12}} $$

断面係数: $Z = I / (h/2) = bh^2/6$

円形断面

直径 $d$(半径 $r = d/2$)の円形断面:

$$ I = \int_A y^2 \, dA $$

極座標で $y = r\sin\theta$, $dA = r \, dr \, d\theta$ として:

$$ I = \int_0^{2\pi}\int_0^{d/2} (r\sin\theta)^2 \cdot r \, dr \, d\theta = \int_0^{2\pi}\sin^2\theta \, d\theta \int_0^{d/2} r^3 \, dr $$

$$ = \pi \cdot \frac{(d/2)^4}{4} $$

$$ \boxed{I = \frac{\pi d^4}{64}} $$

中空円形断面

外径 $D$、内径 $d$ の中空円形断面:

$$ \boxed{I = \frac{\pi(D^4 – d^4)}{64}} $$

I形断面

I形断面(フランジ: 幅 $b_f$, 厚さ $t_f$、ウェブ: 高さ $h_w$, 厚さ $t_w$)の断面二次モーメントは、全体の矩形から中空部分を引いて計算します:

$$ I = \frac{b_f H^3}{12} – \frac{(b_f – t_w)h_w^3}{12} $$

ここで $H = h_w + 2t_f$ は全体の高さです。

平行軸の定理

断面の重心を通る軸(中心軸)に関する断面二次モーメントを $I_c$ とすると、中心軸から距離 $d$ だけ離れた平行軸に関する断面二次モーメント $I$ は:

$$ \boxed{I = I_c + Ad^2} $$

ここで $A$ は断面積です。この定理は、複合断面の断面二次モーメントを計算する際に不可欠です。

導出

$$ I = \int_A (y + d)^2 \, dA = \int_A y^2 \, dA + 2d\int_A y \, dA + d^2\int_A dA $$

重心に関しては $\int_A y \, dA = 0$ なので:

$$ I = I_c + Ad^2 $$

Pythonでの実装

import numpy as np
import matplotlib.pyplot as plt

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

# (1) 曲げ応力分布の可視化
h = 0.2     # 断面高さ [m]
b = 0.1     # 断面幅 [m]
I_rect = b * h**3 / 12
M = 50e3    # 曲げモーメント [N*m]

y = np.linspace(-h/2, h/2, 200)
sigma = M * y / I_rect / 1e6  # [MPa]

axes[0].plot(sigma, y * 1000, 'b-', linewidth=2.5)
axes[0].fill_betweenx(y * 1000, 0, sigma, alpha=0.3, color='blue')
axes[0].axvline(0, color='k', linewidth=0.5)
axes[0].axhline(0, color='r', linewidth=1, linestyle='--', label='Neutral Axis')
axes[0].set_xlabel('Bending Stress $\\sigma$ [MPa]')
axes[0].set_ylabel('y [mm]')
axes[0].set_title(f'Bending Stress Distribution\n(M={M/1e3:.0f} kN$\\cdot$m)')
axes[0].legend()
axes[0].grid(True, alpha=0.3)

# (2) 各断面の I の比較(同じ断面積で)
A_target = 5000e-6  # 目標断面積 [m^2](50 cm^2)

# 正方形
s_sq = np.sqrt(A_target)
I_sq = s_sq**4 / 12

# 円形
d_circ = np.sqrt(4 * A_target / np.pi)
I_circ = np.pi * d_circ**4 / 64

# 矩形(幅:高さ = 1:3)
h_r = np.sqrt(3 * A_target)
b_r = A_target / h_r
I_r = b_r * h_r**3 / 12

# 矩形(幅:高さ = 1:5)
h_r2 = np.sqrt(5 * A_target)
b_r2 = A_target / h_r2
I_r2 = b_r2 * h_r2**3 / 12

# 中空円(外径/内径 = 2)
D_hol = (64 * A_target / (np.pi * (1 - (0.5)**4)))**(1/2)  # 近似計算
# A = pi/4 * (D^2 - d^2), d=D/2
D_hol = np.sqrt(4 * A_target / (np.pi * 0.75))
d_hol = D_hol / 2
I_hol = np.pi * (D_hol**4 - d_hol**4) / 64

sections = ['Square', 'Circle', '1:3 Rect', '1:5 Rect', 'Hollow Circle']
I_values = [I_sq, I_circ, I_r, I_r2, I_hol]
I_normalized = [i / I_sq for i in I_values]

bars = axes[1].bar(sections, I_normalized, color=['steelblue', 'coral',
                   'mediumseagreen', 'goldenrod', 'mediumpurple'])
axes[1].set_ylabel('$I / I_{square}$')
axes[1].set_title(f'$I$ Comparison (Same Area = {A_target*1e4:.0f} cm$^2$)')
axes[1].grid(True, alpha=0.3, axis='y')
for bar, val in zip(bars, I_normalized):
    axes[1].text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.05,
                f'{val:.2f}', ha='center', fontsize=10)

# (3) 矩形断面の I: 高さ依存性
b_fixed = 0.05  # 幅固定 [m]
h_range = np.linspace(0.01, 0.5, 200)
I_range = b_fixed * h_range**3 / 12
Z_range = b_fixed * h_range**2 / 6

ax3_twin = axes[2].twinx()
line1, = axes[2].plot(h_range * 100, I_range * 1e8, 'b-', linewidth=2.5,
                     label='$I = bh^3/12$')
line2, = ax3_twin.plot(h_range * 100, Z_range * 1e6, 'r--', linewidth=2.5,
                      label='$Z = bh^2/6$')

axes[2].set_xlabel('Height h [cm]')
axes[2].set_ylabel('$I$ [cm$^4$]', color='b')
ax3_twin.set_ylabel('$Z$ [cm$^3$]', color='r')
axes[2].set_title(f'Rectangular Section (b={b_fixed*100:.0f} cm)')
axes[2].grid(True, alpha=0.3)
lines = [line1, line2]
axes[2].legend(lines, [l.get_label() for l in lines])

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

まとめ

本記事では、曲げ応力と断面二次モーメントについて解説しました。

  • 曲げ応力の公式: $\sigma = My/I$(中立軸からの距離 $y$ に比例)
  • 断面二次モーメント $I = \int y^2 \, dA$ は断面の曲げ剛性を表す
  • 矩形断面: $I = bh^3/12$、円形断面: $I = \pi d^4/64$
  • 平行軸の定理: $I = I_c + Ad^2$
  • 同じ断面積でも、材料を中立軸から遠くに配置する(I形鋼など)ことで $I$ を大幅に増加できる

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