梁のたわみ(弾性曲線方程式)

構造物の設計では、強度(応力が許容値以下であるか)だけでなく、たわみ(deflection) が許容値以下であるかも重要な設計条件です。梁のたわみは弾性曲線方程式 $EIy” = M(x)$ を解くことで求められます。

本記事では、弾性曲線方程式の導出から代表的な梁のたわみ解、そして重ね合わせの原理までを解説します。

本記事の内容

  • 弾性曲線方程式 $EIy” = M(x)$ の導出
  • 境界条件の設定
  • 片持ち梁の解
  • 単純支持梁の解
  • 重ね合わせの原理
  • Pythonでの解析と可視化

前提知識

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

弾性曲線方程式の導出

曲率と曲げモーメントの関係

曲げ応力の導出で得られた関係:

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

ここで $\rho$ は曲率半径、$M$ は曲げモーメント、$E$ はヤング率、$I$ は断面二次モーメントです。

曲率の近似

たわみ $y(x)$ の曲率は:

$$ \frac{1}{\rho} = \frac{y”}{(1 + y’^2)^{3/2}} $$

微小変形($y’ \ll 1$)を仮定すると:

$$ \frac{1}{\rho} \approx y” $$

弾性曲線方程式

したがって:

$$ \boxed{EI y” = M(x)} $$

これが弾性曲線方程式(elastic curve equation) です。$M(x)$ が既知であれば、2回積分してたわみ $y(x)$ を求めることができます。

積分の各段階:

$$ EI y” = M(x) $$

$$ EI y’ = \int M(x) \, dx + C_1 \quad (\text{たわみ角 } \theta \approx y’) $$

$$ EI y = \iint M(x) \, dx \, dx + C_1 x + C_2 \quad (\text{たわみ}) $$

$C_1$, $C_2$ は境界条件から決定します。

境界条件

支持条件 $y$ $y’$ $M$ $V$
固定端 $y = 0$ $y’ = 0$
ピン支持・ローラー $y = 0$ $M = 0$
自由端 $M = 0$ $V = 0$

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

固定端を $x = 0$、自由端を $x = L$ とし、自由端に下向き荷重 $P$ が作用。

曲げモーメント:

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

弾性曲線方程式:

$$ EIy” = P(x – L) = Px – PL $$

1回積分:

$$ EIy’ = \frac{Px^2}{2} – PLx + C_1 $$

境界条件 $y'(0) = 0$ より $C_1 = 0$。

2回積分:

$$ EIy = \frac{Px^3}{6} – \frac{PLx^2}{2} + C_2 $$

境界条件 $y(0) = 0$ より $C_2 = 0$。

$$ \boxed{y(x) = \frac{P}{6EI}(x^3 – 3Lx^2)} $$

自由端のたわみ($x = L$):

$$ \boxed{\delta_{\max} = y(L) = -\frac{PL^3}{3EI}} $$

負の符号は下向きのたわみを意味します。自由端のたわみ角:

$$ \theta_{\max} = y'(L) = -\frac{PL^2}{2EI} $$

例2: 片持ち梁 — 等分布荷重

等分布荷重 $w$ [N/m] が全体に作用する場合:

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

$x = 0$ を固定端として:

$$ EIy” = \frac{w}{2}(x^2 – 2Lx + L^2) $$

1回積分:

$$ EIy’ = \frac{w}{2}\left(\frac{x^3}{3} – Lx^2 + L^2 x\right) + C_1 $$

$y'(0) = 0$ より $C_1 = 0$。

2回積分:

$$ EIy = \frac{w}{2}\left(\frac{x^4}{12} – \frac{Lx^3}{3} + \frac{L^2 x^2}{2}\right) + C_2 $$

$y(0) = 0$ より $C_2 = 0$。

$$ \boxed{y(x) = \frac{w}{24EI}(x^4 – 4Lx^3 + 6L^2 x^2)} $$

自由端のたわみ:

$$ \boxed{\delta_{\max} = -\frac{wL^4}{8EI}} $$

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

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

曲げモーメント:

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

弾性曲線方程式:

$$ EIy” = \frac{wLx}{2} – \frac{wx^2}{2} $$

1回積分:

$$ EIy’ = \frac{wLx^2}{4} – \frac{wx^3}{6} + C_1 $$

2回積分:

$$ EIy = \frac{wLx^3}{12} – \frac{wx^4}{24} + C_1 x + C_2 $$

境界条件 $y(0) = 0$ より $C_2 = 0$。

境界条件 $y(L) = 0$:

$$ 0 = \frac{wL^4}{12} – \frac{wL^4}{24} + C_1 L = \frac{wL^4}{24} + C_1 L $$

$$ C_1 = -\frac{wL^3}{24} $$

$$ \boxed{y(x) = \frac{w}{24EI}(x^4 – 2Lx^3 + L^3 x) = \frac{wx}{24EI}(x^3 – 2Lx^2 + L^3)} $$

中央のたわみ($x = L/2$):

$$ \boxed{\delta_{\max} = -\frac{5wL^4}{384EI}} $$

重ね合わせの原理

線形弾性の範囲では、複数の荷重による変形は各荷重による変形の重ね合わせ(superposition) で求められます。

荷重1によるたわみが $y_1(x)$、荷重2によるたわみが $y_2(x)$ のとき:

$$ y(x) = y_1(x) + y_2(x) $$

これにより、複雑な荷重条件のたわみを単純な荷重ケースの組み合わせで計算できます。

Pythonでの実装

import numpy as np
import matplotlib.pyplot as plt

fig, axes = plt.subplots(2, 2, figsize=(14, 10))

L = 4.0     # 梁の長さ [m]
E = 200e9   # ヤング率 [Pa]
b = 0.1     # 断面幅 [m]
h = 0.2     # 断面高さ [m]
I = b * h**3 / 12  # 断面二次モーメント [m^4]
EI = E * I

n = 500
x = np.linspace(0, L, n)

# (1) 片持ち梁 — 先端集中荷重
P = 10e3  # [N]
y_cant_P = P / (6 * EI) * (x**3 - 3*L*x**2)

axes[0, 0].plot(x, y_cant_P * 1e3, 'b-', linewidth=2.5)
axes[0, 0].set_xlabel('x [m]')
axes[0, 0].set_ylabel('Deflection y [mm]')
axes[0, 0].set_title(f'Cantilever, Point Load P={P/1e3:.0f} kN')
axes[0, 0].grid(True, alpha=0.3)
delta_max1 = P*L**3 / (3*EI)
axes[0, 0].annotate(f'$\\delta_{{max}} = PL^3/3EI$\n= {delta_max1*1e3:.2f} mm',
                    xy=(L, y_cant_P[-1]*1e3),
                    xytext=(L-1.5, y_cant_P[-1]*1e3*0.5),
                    fontsize=10, arrowprops=dict(arrowstyle='->', color='red'))

# (2) 片持ち梁 — 等分布荷重
w = 5e3  # [N/m]
y_cant_w = w / (24 * EI) * (x**4 - 4*L*x**3 + 6*L**2*x**2)

axes[0, 1].plot(x, y_cant_w * 1e3, 'r-', linewidth=2.5)
axes[0, 1].set_xlabel('x [m]')
axes[0, 1].set_ylabel('Deflection y [mm]')
axes[0, 1].set_title(f'Cantilever, UDL w={w/1e3:.0f} kN/m')
axes[0, 1].grid(True, alpha=0.3)
delta_max2 = w*L**4 / (8*EI)
axes[0, 1].annotate(f'$\\delta_{{max}} = wL^4/8EI$\n= {delta_max2*1e3:.2f} mm',
                    xy=(L, y_cant_w[-1]*1e3),
                    xytext=(L-1.5, y_cant_w[-1]*1e3*0.5),
                    fontsize=10, arrowprops=dict(arrowstyle='->', color='red'))

# (3) 単純支持梁 — 等分布荷重
y_ss_w = w / (24 * EI) * (x**4 - 2*L*x**3 + L**3*x)

axes[1, 0].plot(x, y_ss_w * 1e3, 'g-', linewidth=2.5)
axes[1, 0].set_xlabel('x [m]')
axes[1, 0].set_ylabel('Deflection y [mm]')
axes[1, 0].set_title(f'Simply Supported, UDL w={w/1e3:.0f} kN/m')
axes[1, 0].grid(True, alpha=0.3)
delta_max3 = 5*w*L**4 / (384*EI)
axes[1, 0].annotate(f'$\\delta_{{max}} = 5wL^4/384EI$\n= {delta_max3*1e3:.2f} mm',
                    xy=(L/2, y_ss_w[n//2]*1e3),
                    xytext=(L/2+0.5, y_ss_w[n//2]*1e3*0.5),
                    fontsize=10, arrowprops=dict(arrowstyle='->', color='red'))

# (4) 重ね合わせの原理
P_center = 15e3  # 中央集中荷重 [N]
# 単純支持梁の中央集中荷重のたわみ
y_ss_P = np.where(x <= L/2,
    P_center / (48*EI) * (3*L**2*x - 4*x**3),
    P_center / (48*EI) * (3*L**2*(L-x) - 4*(L-x)**3))

y_combined = y_ss_w + y_ss_P

axes[1, 1].plot(x, y_ss_w * 1e3, 'g--', linewidth=1.5, label=f'UDL w={w/1e3:.0f} kN/m')
axes[1, 1].plot(x, y_ss_P * 1e3, 'b--', linewidth=1.5, label=f'Point P={P_center/1e3:.0f} kN')
axes[1, 1].plot(x, y_combined * 1e3, 'r-', linewidth=2.5, label='Superposition')
axes[1, 1].set_xlabel('x [m]')
axes[1, 1].set_ylabel('Deflection y [mm]')
axes[1, 1].set_title('Superposition Principle')
axes[1, 1].legend()
axes[1, 1].grid(True, alpha=0.3)

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

まとめ

本記事では、梁のたわみと弾性曲線方程式について解説しました。

  • 弾性曲線方程式: $EIy” = M(x)$ を2回積分してたわみを求める
  • 境界条件で積分定数 $C_1, C_2$ を決定する
  • 片持ち梁・先端集中荷重: $\delta_{\max} = PL^3 / 3EI$
  • 片持ち梁・等分布荷重: $\delta_{\max} = wL^4 / 8EI$
  • 単純支持梁・等分布荷重: $\delta_{\max} = 5wL^4 / 384EI$
  • 重ね合わせの原理により、複雑な荷重を単純なケースの和で解ける

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