内力図(SFD・BMD)の描き方

構造物の設計では、梁(はり)の各断面に作用するせん断力曲げモーメントを知ることが不可欠です。これらを図示したものがせん断力図(SFD: Shear Force Diagram)曲げモーメント図(BMD: Bending Moment Diagram) であり、材料力学の最も重要なスキルの一つです。

本記事では、荷重・せん断力・曲げモーメントの微分関係を導出し、代表的な梁の例で SFD・BMD を描く手順を解説します。

本記事の内容

  • せん断力と曲げモーメントの定義
  • 荷重・せん断力・曲げモーメントの微分関係
  • 片持ち梁の SFD・BMD
  • 単純支持梁の SFD・BMD
  • Pythonでの自動描画

前提知識

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

せん断力と曲げモーメントの定義

梁の任意の断面 $x$ で仮想的に切断すると、切断面には内力が作用しています。

  • せん断力 $V(x)$: 断面に平行な方向の内力
  • 曲げモーメント $M(x)$: 断面の回転に対する内力モーメント

符号の規約(一般的な慣習):

  • $V > 0$: 左側部分を上向きに、右側部分を下向きに作用させるせん断力
  • $M > 0$: 梁を下に凸(sagging)に曲げるモーメント

荷重・せん断力・曲げモーメントの微分関係

導出

微小要素 $dx$ に対して力のつり合いとモーメントのつり合いを考えます。分布荷重を $w(x)$(下向き正)とします。

鉛直方向のつり合い:

$$ V(x) – w(x)dx – V(x + dx) = 0 $$

$$ V(x) – V(x+dx) = w(x)dx $$

$$ \boxed{\frac{dV}{dx} = -w(x)} $$

モーメントのつり合い(左端まわり):

$$ M(x+dx) – M(x) – V(x)dx + w(x)dx \cdot \frac{dx}{2} = 0 $$

$dx$ の2次の微小量を無視すると:

$$ \boxed{\frac{dM}{dx} = V(x)} $$

関係のまとめ

この2つの式を組み合わせると:

$$ w(x) \xrightarrow{\text{積分}} V(x) \xrightarrow{\text{積分}} M(x) $$

$$ V(x) = -\int w(x) \, dx + C_1 $$

$$ M(x) = \int V(x) \, dx + C_2 $$

さらに:

$$ \frac{d^2 M}{dx^2} = -w(x) $$

重要な関係

荷重 $w(x)$ $V(x)$ $M(x)$
なし ($w=0$) 定数 1次関数(直線)
等分布 ($w=$ const) 1次関数(直線) 2次関数(放物線)
三角分布 ($w=ax$) 2次関数 3次関数

例1: 片持ち梁 — 先端集中荷重

長さ $L$ の片持ち梁の自由端に下向き荷重 $P$ が作用する場合。

反力(固定端 $x=0$):

$$ R_A = P, \quad M_A = -PL $$

せん断力($0 \leq x \leq L$):

自由端から切断して考えると:

$$ V(x) = P \quad (\text{一定}) $$

曲げモーメント:

$$ M(x) = P(x – L) = Px – PL $$

固定端: $M(0) = -PL$、自由端: $M(L) = 0$。

例2: 単純支持梁 — 等分布荷重

長さ $L$ の単純支持梁に等分布荷重 $w$ [N/m] が作用する場合。

反力(対称性から):

$$ R_A = R_B = \frac{wL}{2} $$

せん断力:

$$ V(x) = R_A – wx = \frac{wL}{2} – wx $$

$V(x) = 0$ となる位置は $x = L/2$ です。

曲げモーメント:

$$ M(x) = R_A x – \frac{wx^2}{2} = \frac{wLx}{2} – \frac{wx^2}{2} = \frac{w}{2}x(L – x) $$

最大曲げモーメントは $x = L/2$ で:

$$ \boxed{M_{\max} = \frac{wL^2}{8}} $$

例3: 単純支持梁 — 中央集中荷重

中央に集中荷重 $P$ が作用する単純支持梁:

反力: $R_A = R_B = P/2$

せん断力:

$$ V(x) = \begin{cases} P/2 & (0 \leq x < L/2) \\ -P/2 & (L/2 < x \leq L) \end{cases} $$

曲げモーメント:

$$ M(x) = \begin{cases} \frac{Px}{2} & (0 \leq x \leq L/2) \\ \frac{P(L-x)}{2} & (L/2 \leq x \leq L) \end{cases} $$

最大曲げモーメントは $x = L/2$ で:

$$ \boxed{M_{\max} = \frac{PL}{4}} $$

Pythonでの実装

import numpy as np
import matplotlib.pyplot as plt

def plot_beam_diagrams(x, V, M, title, ax_v, ax_m):
    """SFDとBMDを描画する共通関数"""
    ax_v.fill_between(x, V, alpha=0.3, color='blue')
    ax_v.plot(x, V, 'b-', linewidth=2)
    ax_v.axhline(0, color='k', linewidth=0.5)
    ax_v.set_ylabel('V [kN]')
    ax_v.set_title(f'{title} - SFD')
    ax_v.grid(True, alpha=0.3)

    ax_m.fill_between(x, M, alpha=0.3, color='red')
    ax_m.plot(x, M, 'r-', linewidth=2)
    ax_m.axhline(0, color='k', linewidth=0.5)
    ax_m.set_xlabel('x [m]')
    ax_m.set_ylabel('M [kN$\\cdot$m]')
    ax_m.set_title(f'{title} - BMD')
    ax_m.grid(True, alpha=0.3)

fig, axes = plt.subplots(3, 2, figsize=(14, 12))
L = 4.0  # 梁の長さ [m]
n = 500
x = np.linspace(0, L, n)

# (1) 片持ち梁 — 先端集中荷重
P1 = 10.0  # [kN]
V1 = np.full_like(x, P1)
M1 = P1 * (x - L)

plot_beam_diagrams(x, V1, M1,
                   f'Cantilever, Point Load P={P1:.0f} kN',
                   axes[0, 0], axes[0, 1])

# (2) 単純支持梁 — 等分布荷重
w2 = 5.0  # [kN/m]
R_A2 = w2 * L / 2
V2 = R_A2 - w2 * x
M2 = R_A2 * x - w2 * x**2 / 2

plot_beam_diagrams(x, V2, M2,
                   f'Simply Supported, UDL w={w2:.0f} kN/m',
                   axes[1, 0], axes[1, 1])

# 最大曲げモーメントの注釈
M2_max = w2 * L**2 / 8
axes[1, 1].annotate(f'$M_{{max}} = wL^2/8 = {M2_max:.1f}$ kN$\\cdot$m',
                    xy=(L/2, M2_max), xytext=(L/2 + 0.5, M2_max - 1),
                    fontsize=10, arrowprops=dict(arrowstyle='->', color='red'))

# (3) 単純支持梁 — 中央集中荷重
P3 = 20.0  # [kN]
R_A3 = P3 / 2
V3 = np.where(x < L/2, P3/2, -P3/2)
M3 = np.where(x <= L/2, P3*x/2, P3*(L-x)/2)

plot_beam_diagrams(x, V3, M3,
                   f'Simply Supported, Point Load P={P3:.0f} kN',
                   axes[2, 0], axes[2, 1])

M3_max = P3 * L / 4
axes[2, 1].annotate(f'$M_{{max}} = PL/4 = {M3_max:.1f}$ kN$\\cdot$m',
                    xy=(L/2, M3_max), xytext=(L/2 + 0.5, M3_max - 2),
                    fontsize=10, arrowprops=dict(arrowstyle='->', color='red'))

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

まとめ

本記事では、内力図(SFD・BMD)の描き方を解説しました。

  • せん断力 $V(x)$曲げモーメント $M(x)$ は梁の内力を表す
  • 微分関係: $dV/dx = -w(x)$, $dM/dx = V(x)$
  • 荷重を積分するとせん断力、せん断力を積分すると曲げモーメントが得られる
  • 片持ち梁の先端荷重: $M_{\max} = PL$(固定端)
  • 単純支持梁の等分布荷重: $M_{\max} = wL^2/8$(中央)
  • 単純支持梁の中央集中荷重: $M_{\max} = PL/4$(中央)

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