はりの計算式を解く(17)-マトリクス変位法(部分載荷)-

マトリクス変位法ではりの計算式を解くやり方を紹介しています。はりの中間の応力と変位を弾性曲線式によって解いています。


本稿の弾性曲線式は
    V''''(x) = p(x),  x | 0 => L (technical theory of beam, Euler–Bernoulli beam theory)
    V''''(x) = p(x) - κ * EI / GA * p''(x),  x | 0 => L (Timoshenko beam theory)
と改めます。上は普通の梁で、下はせん断変形を考慮した梁の式です。


はりの計算式は
  V''''(x) = p(x) = -w         (1)
  V''' (x) = Q(x) = C1 + ∫ p(x) dx   (2)
  V''  (x) = M(x) = C2 + ∫ Q(x) dx    (3)
  r(x) = -M(x)           (4)
     G(x) = κ * EI / GA * Q(x)     (4-1)
  V'   (x) = T(x) = C3 + ∫ r(x) dx    (5)
  V    (x) = V(x) = C4 + ∫ T(x) + G(x) dx (6)
  ただし
  κ   せん断変形の形状係数
  EI   曲げ剛性(一定)
  GA   せん断剛性(一定)
  x   位置
  L   スパン長
  p(x)  分布荷重
  w   等分布荷重
  Q(x)  せん断力
  M(x)  曲げモーメント
  r(x)    曲率(δ''=φ=r(x)/EI)
  G(x)  せん断角(γ=G(x)/EI、鉛直方向のせん断歪は全断面で一定とし、材軸方向は0とする)
  T(x)  たわみ角(θ=T(x)/EI)
  V(x)  たわみ(δ=V(x)/EI)
  C1    積分定数(Q(x=0))
  C2    積分定数(M(x=0))
  C3    積分定数(T(x=0))
  C4    積分定数(V(x=0))
とします。G(x) = 0 とすれば普通の梁です。


部分載荷で、はりの計算式をあらかじめ積分すると
    px = w * ( (x - a) / b)^n * (x < a ? 0 : (x < a + b ? 1 : 0))  (4-1)
    w = w * b / n1 * (x < a + b ? 0 : 1)
    Q(x) = C1 - px / n1 * (x - a) - w (4-2)
    M(x) = C2 + C1 * x - px / (n1 * n2) * (x - a)^2 - w * b / n2 - w * (x - a - b) (4-3)
    G(x) =(C1 - px / n1 * (x - a) - w) * __g__ * L^2 (4-4)
    T(x) = C3 - C2 * x - C1 / 2 * x^2 + px / (n1 * n2 * n3) * (x - a)^3 + 
    w * b^2 / (n2 * n3) + w * b / n2 * (x - a - b) + w / 2 * (x - a - b)^2 (4-5)
    V(x) = C4 + C3 * x - C2 / 2 * x^2 - C1 / 6 * x^3 + px / (n1 * n2 * n3 * n4) * (x - a)^4 + 
    w * b^3 / (n2 * n3 * n4) + w * b^2 / (n2 * n3) * (x - a - b) + 
    w * b / (2 * n2) * (x - a - b)^2 + w / 6 * (x - a - b)^3 + (M(x) - C2) * __g__ * L^2 (4-6)
  ただし
   __g__ = κ * EI / GA / L^2  ティモシェンコ
    b = l - a - c
    n1 = n.abs + 1
    n2 = n.abs + 2
    n3 = n.abs + 3
    n4 = n.abs + 4
となります。__g__ = 0 とすれば普通の梁です。


はり端の Q(x=0)、M(x=0)、T(x=0)、V(x=0) が積分定数となるので、マトリクス変位法で算定して、積分定数を代入すれば計算式は解けます。


Mery で以下のスクリプトruby で書いて ファイル名 "000-15.bat" で保存して実行してください。
1端ピン他端固定、部分載荷としています。

n が 負値なら右肩下がりで処理します。


: マトリクス変位法(部分載荷)
@echo off
ruby -x %~f0 4 5 1 1 1 -10 0.15 0.3 6.5 6.5/15 1.2
pause
goto:eof

#!ruby -rmatrix

# 境界条件
def boundary_condition(tp, l, ca, cb, qa, qb, ei = nil, __g__ = 0, m1 = 0, m2 = 0, ka = 0, kb = 0, k1 = 1e20, k2 = 1e20)
=begin
  tp  支持条件
      0  単純支持
      1  A端自由・B端固定
      2  A端固定・B端自由
      3  両端固定
      4  A端ピン・B端固定
      5  A端固定・B端ピン
      6  両端回転・鉛直バネ支持
  l  スパン m
  ca A端の固定端モーメント kNm
  cb B端の固定端モーメント kNm
  qa A端の単純支持のせん断力 kN
  qb B端の単純支持のせん断力 kN
  ei 曲げ剛性 kN*m2
  __g__ ティモシェンコ
  m1 A端の回転外力 kNm
  m2 B端の回転外力 kNm
  ka A端支持の回転バネ kNm/rad
  kb B端支持の回転バネ kNm/rad
  k1 A端支持の鉛直バネ kN/m
  k2 B端支持の鉛直バネ kN/m

  ( [k] + [d] ) * {y} + {c} = {f}
  [k] : 部材剛性マトリクス
  [d] : 支点バネマトリクス
  {y} : 節点の変位ベクトル → [ va, ta, vb, tb ] = ( [k] + [d] )^^-1 * ( {f} - {c} )
  {c} : 固定材端力ベクトル
  {f} : 節点の荷重ベクトル( 節点外力 )

  {r} = [k] * {y} + {c}
  {r} : 材端の内力ベクトル → [-ra, ma,-rb, mb ] = [k] * {y} + {c}

  ra A端のせん断力 kN
  ma A端の曲げモーメント kNm
  ta A端のたわみ角 rad / ei
  va A端のたわみ m / ei
  rb B端のせん断力 kN
  mb B端の曲げモーメント kNm
  tb B端のたわみ角 rad / ei
  vb B端のたわみ m / ei
=end
# A) 剛性マトリクス [k]
  a1 = 12.0 / l ** 3
  b1 = 6.0 / l ** 2
  c1 = b1
  d1 = 2.0 / l
  f1 = 4.0 / l
  h1 = f1
  if 0 < __g__ && ei
  # せん断変形
    p3 = 12.0 * __g__
    a1 *= 1 / (1 + p3)
    b1 *= 1 / (1 + p3)
    c1 *= 1 / (1 + p3)
    d1 *= 1 / (1 + p3) * (1 - p3 / 2)
    f1 *= 1 / (1 + p3) * (1 + p3 / 4)
    h1 *= 1 / (1 + p3) * (1 + p3 / 4)
  end
  k = Matrix[
    [ a1, b1,-a1, c1],
    [ b1, f1,-b1, d1],
    [-a1,-b1, a1,-c1],
    [ c1, d1,-c1, h1] ].map { |u| u.to_f }
# B) 固定材端力ベクトル {c}
  c = Matrix[
    [-da = qa - (ca + cb) / l],
    [ ca],
    [-db = qb + (ca + cb) / l],
    [ cb] ].map { |u| u.to_f }
# C) 節点外力 {f} = {f} - {c}
  f = Matrix[
    [ p1 = 0],
    [ m1 = m1],
    [ p2 = 0],
    [ m2 = m2] ].map { |u| u.to_f } - c
# D) 支点バネ [d]
  case tp
  when 0; k1 = k2 = 1e20; ka = kb = 0 # 3-1) 単純支持
  when 1; k1 = ka = 0; k2 = kb = 1e20 # 3-2) A端自由・B端固定
  when 2; k2 = kb = 0; k1 = ka = 1e20 # 3-3) A端固定・B端自由
  when 3; k1 = k2 = ka = kb = 1e20    # 3-4) 両端固定
  when 4; k1 = k2 = kb = 1e20; ka = 0 # 3-5) A端ピン・B端固定
  when 5; k1 = k2 = ka = 1e20; kb = 0 # 3-6) A端固定・B端ピン
  when 6 # 3-7) 両端回転・鉛直バネ支持
  else
    k1 = k2 = 1e20; ka = kb = 0
  end
  d = Matrix[
    [ k1,  0,  0,  0],
    [  0, ka,  0,  0],
    [  0,  0, k2,  0],
    [  0,  0,  0, kb] ].map { |u| u.to_f }
# E) 節点の変位ベクトル {y} = ( [k] + [d] )^^-1 * {f}
  y = (k + d / ei).inv * f
# F) 材端の内力ベクトル {r} = [k] * {y} + {c}
  r = k * y + c
  va, ta, vb, tb = y.to_a.flatten
  ra, ma, rb, mb = r.to_a.flatten
  return -ra,-rb, ma, mb, ta, tb, va, vb
end
def cq4(w, l, a, c, n, __g__ = 0)
=begin
  w = w * b / (n.abs + 1) # kN 総重量

  A         /|w    B
  _______/___|______
  ^                 ^
  |--a--|--b--|--c--|
  0                 L ---> x
  |--------L--------|

  l  スパン m
  w  荷重 kN
  a  荷重の開始位置 m
  c  荷重の終了位置 m
  n  荷重曲線の次数(負値で右肩下がり)
  __g__ ティモシェンコ

  ca A端の固定端モーメント kNm
  cb B端の固定端モーメント kNm
  qa A端の単純支持のせん断力 kN
  qb B端の単純支持のせん断力 kN
=end
  b = l - a - c
  n = n.abs
  n1 = n + 1.0
  n2 = n + 2.0
  n3 = n + 3.0
  n4 = n + 4.0
  w = w * b / n1 # kN 総重量
  ca =-w / (l ** 2 * n2 * n3) * (2 * b ** 2 * (a + n1 * (b / n4 + c)) + c * n3 * (2 * a * b + c * (n2 * a + n1 * b)))
  cb = w / (l ** 2 * n2 * n3) * (n1 * b ** 2 * (2 * a + n2 * (b / n4 + c)) + a * n3 * (a * b + c * (n2 * a + 2 * n1 * b)))
  qa = w / l * (c + b / n2)
  qb = w / l * (a + b * n1 / n2)
  if __g__ != 0
    cs = w / (l ** 2 * n2 * n3) * (n1 * b ** 2 + n3 * (c * n1 * (a + b) + a * (b + c))) * 6 * __g__ * l
    ca = (ca - cs) / (12 * __g__ + 1)
    cb = (cb + cs) / (12 * __g__ + 1)
  end
  return ca, cb, qa, qb
end
def mq4(x, l, a, c, n, w, ra, ma, ta, va, ei = nil, __g__ = 0, ka = 0, kb = 0, k1 = 1e20, k2 = 1e20)
=begin
  x  位置 m
  l  スパン m
  w  荷重 kN
  a  荷重の開始位置 m
  c  荷重の終了位置 m
  n  荷重曲線の次数(負値で右肩下がり)
  ra A端のせん断力 kN
  ma A端の曲げモーメント kNm
  ta A端のたわみ角 rad
  va A端のたわみ m
  ei 曲げ剛性 kN*m2
  __g__ ティモシェンコ

  q  せん断力 kN
  m  曲げモーメント kNm
  t / ei たわみ角 rad
  v / ei たわみ m
=end
  b = l - a - c
  n = n.abs
  n1 = n + 1.0
  n2 = n + 2.0
  n3 = n + 3.0
  n4 = n + 4.0
  px = w * ( (x - a) / b) ** n * (x < a ? 0 : (x < a + b ? 1 : 0))
  w = w * b / n1 * (x < a + b ? 0 : 1)
  q = ra - px / n1 * (x - a) - w
  m = ma + ra * x - px / (n1 * n2) * (x - a) ** 2 - w * b / n2 - w * (x - a - b)
  t = ta - ma * x - ra / 2 * x ** 2 + px / (n1 * n2 * n3) * (x - a) ** 3 + 
    w * b ** 2 / (n2 * n3) + w * b / n2 * (x - a - b) + w / 2 * (x - a - b) ** 2
  v = va + ta * x - ma / 2 * x ** 2 - ra / 6 * x ** 3 + px / (n1 * n2 * n3 * n4) * (x - a) ** 4 + 
    w * b ** 3 / (n2 * n3 * n4) + w * b ** 2 / (n2 * n3) * (x - a - b) + 
    w * b / (2 * n2) * (x - a - b) ** 2 + w / 6 * (x - a - b) ** 3   + __g__ * (m - ma) * l ** 2
  return q, m, t / ei, v / ei
end
def pt_mq4(tp, l, a, c, n, w, t, h, e, g, κ, m1=0, m2=0, ka=0, kb=0, k1=0, k2=0, dn=10)
=begin
  tp  支持条件
      0  単純支持
      1  A端自由・B端固定
      2  A端固定・B端自由
      3  両端固定
      4  A端ピン・B端固定
      5  A端固定・B端ピン
      6  両端回転・鉛直バネ支持
  l  スパン m
  w  荷重 kN
  a  荷重の開始位置 m
  c  荷重の終了位置 m
  n  荷重曲線の次数(負値で右肩下がり)
  e  ヤング率 kN/mm2
  g  縦弾性係数 kN/mm2
  κ せん断変形の形状係数
  m1 A端の回転外力 kNm
  m2 B端の回転外力 kNm
  ka A端支持の回転バネ kNm/rad
  kb B端支持の回転バネ kNm/rad
  k1 A端支持の鉛直バネ kN/mm
  k2 B端支持の鉛直バネ kN/mm
  dn 分割数

  A         /|w    B
  _______/___|______
  ^                 ^
  |--a--|--b--|--c--|
  0                 L ---> x
  |--------L--------|

  q  せん断力 kN
  m  曲げモーメント kNm
  t  たわみ角 rad
  v  たわみ m
=end
  ei = e * t * h ** 3 / 12.0 * 10 ** 6 # kN*m2
  __g__ = (e / g) * (κ / 12) * (h / l) ** 2

  if n < 0
    ca, cb, qa, qb = cq4(w, l, c, a, n, __g__)
  else
    ca, cb, qa, qb = cq4(w, l, a, c, n, __g__)
  end

  if n < 0
    tp = if tp == 1
      2
    elsif tp == 2
      1
    elsif tp == 4
      5
    elsif tp == 5
      4
    else
      tp
    end
  end
  ra, rb, ma, mb, ta, tb, va, vb = if tp == 6
    if n < 0
      boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__, m2 = 0, m1 = 0, kb, ka, k2 * 1000, k1 * 1000)
    else
      boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__, m1 = 0, m2 = 0, ka, kb, k1 * 1000, k2 * 1000)
    end
  else
    boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__)
  end

  pt = []
  dx = l / dn
  for i in 0..dn
    x = dx * i
    if x - dx < a && a < x && a != 0
      if n < 0
        q, m, t, v = mq4(l - a, l, c, a, n, w, ra, ma, ta, va, ei, __g__, kb, ka, k2, k1)
        pt << [a, -q, m, -t * 1000, v * 1000]
      else
        q, m, t, v = mq4(a, l, a, c, n, w, ra, ma, ta, va, ei, __g__, ka, kb, k1, k2)
        pt << [a, q, m, t * 1000, v * 1000]
      end
    elsif x - dx < l - c && l - c < x && c != 0
      if n < 0
        q, m, t, v = mq4(l - (l - c), l, c, a, n, w, ra, ma, ta, va, ei, __g__, kb, ka, k2, k1)
        pt << [l - c, -q, m, -t * 1000, v * 1000]
      else
        q, m, t, v = mq4(l - c, l, a, c, n, w, ra, ma, ta, va, ei, __g__, ka, kb, k1, k2)
        pt << [l - c, q, m, t * 1000, v * 1000]
      end
    end
    if n < 0
      q, m, t, v = mq4(l - x, l, c, a, n, w, ra, ma, ta, va, ei, __g__, kb, ka, k2, k1)
      pt << [x, -q, m, -t * 1000, v * 1000]
    else
      q, m, t, v = mq4(x, l, a, c, n, w, ra, ma, ta, va, ei, __g__, ka, kb, k1, k2)
      pt << [x, q, m, t * 1000, v * 1000]
    end
  end
  return pt
end

tp, l, a, c, n, w, t, h, e, g, κ = ARGV.map { |x| eval(x).to_f }
pt = pt_mq4(tp, l, a, c, n, w, t, h, e, g, κ)
pt.each { |x| p ["x Q M T V", x[0], x[1].round(3), x[2].round(3), x[3].round(3), x[4].round(3)] }
__END__

 

画面に

と表示されます。

 

参考として、ruby/tk  なら

のように処理できます。

 

 

次回は 台形分布荷重を取り上げます。