はりの計算式(番外) - マトリクス変位法 台形荷重 -

番外のはりの計算式を紹介しています。

 

マトリクス変位法 台形荷重 です。
マトリクス演算の扱えるプログラム言語があれば便利です。

 

マトリクス変位法

 

境界条件による計算式



チェック用プログラム

 

ruby/tk の cmd.exe のシェルスクリプトです。

000matrix-6.bat で 保存して実行してください。

 

計算結果は

となります。

 

:マトリクス変位法 台形荷重
@echo off
ruby -x %0
pause
goto:eof
#!ruby -rtk -rmatrix

def cq5(wf, l, a, c, d, __g__ = 0)
=begin
  w = wf * d * (2 * b - d)
  w = wf * d * (l - a - c - d)
      |d|
  A      _____wf    B   ___
  _____/_____\_____   _|_d
  ^                 ^
  |-a-|---2*b---|-c-|
  0                 L ---> x
  |--------L--------|
=end
  b = (l - a - c) / 2.0
  w = wf * d * (2 * b - d)
  ca =-w / (6 * l ** 2) * ( (b ** 2 + (d - b) ** 2 + 6 * (c + b) ** 2) * (a - b - 2 * c) + 12 * (c + b) ** 3)
  cb = w / (6 * l ** 2) * ( (b ** 2 + (d - b) ** 2 + 6 * (a + b) ** 2) * (c - b - 2 * a) + 12 * (a + b) ** 3)
  qa = w / l * (c + b)
  qb = w / l * (a + b)
  if __g__ != 0
    cs = w / (6 * l ** 2) * (6 * (a + b) * (c + b) - b ** 2 - (d - b) ** 2) * 6 * __g__ * l
    ca = (ca - cs) / (12 * __g__ + 1)
    cb = (cb + cs) / (12 * __g__ + 1)
  end
  return ca, cb, qa, qb
end

def mq5(x, tp, l, a, c, d, wf, ra, ma, ta, va, ei = nil, __g__ = 0)
=begin

      |d|
  A      _____wf    B   ___
  _____/_____\_____   _|_d
  ^                 ^
  |-a-|---2*b---|-c-|
  0                 L ---> x
  |--------L--------|
         _____
  ____ /_____\ ____

 1____ /|______ ____
         ________
 2____ __|     |____

 3____ _________ ____
            \|

=end
  b = (l - a - c) / 2.0
  pl = wf * d
  w1 = pl * ( (x - a) / d) * (x < a ? 0 : (x < a + d ? 1 : 0))
  w2 = pl * (x < a + d ? 0 : (x < a + 2.0 * b ? 1 : 0))
  w3 =-pl * ( (x - a - 2.0 * b + d) / d) * (x < a + 2.0 * b - d ? 0 : (x < a + 2.0 * b ? 1 : 0))
  p1 = pl * d / 2.0 * (x < a + d ? 0 : 1)
  p2 = pl * (2.0 * b - d) * (x < a + 2.0 * b ? 0 : 1)
  p3 =-pl * d / 2.0 * (x < a + 2.0 * b ? 0 : 1)

  q = ra +
     -w1 / 2.0 * (x - a) - w2 * (x - a - d) - w3 / 2.0 * (x - a - 2.0 * b + d) +
     -p1 - p2 - p3
  m = ma + ra * x +
     -w1 / 6.0 * (x - a) ** 2 - w2 / 2.0 * (x - a - d) ** 2 - w3 / 6.0 * (x - a - 2.0 * b + d) ** 2 +
     -p1 * (x - a - 2.0 / 3.0 * d) - p2 * (x - a - d - 1.0 / 2.0 * (2.0 * b - d)) - p3 * (x - a - 2.0 * b + d - 2.0 / 3.0 * d)
  t = ta - ma * x - ra / 2.0 * x ** 2 +
      w1 / 24.0 * (x - a) ** 3 + w2 / 6.0 * (x - a - d) ** 3 + w3 / 24.0 * (x - a - 2.0 * b + d) ** 3 +
      p1 * d ** 2 / 12.0 + p2 * (2.0 * b - d) ** 2 / 6.0 + p3 * d ** 2 / 12.0 +
      p1 * d / 3.0 * (x - a - d) + p2 * (2.0 * b - d) / 2.0 * (x - a - 2.0 * b) + p3 * d / 3.0 * (x - a - 2.0 * b) +
      p1 / 2.0 * (x - a - d) ** 2 + p2 / 2.0 * (x - a - 2.0 * b) ** 2 + p3 / 2.0 * (x - a - 2.0 * b) ** 2
  v = va + ta * x - ma / 2.0 * x ** 2 - ra / 6.0 * x ** 3 +
      w1 / 120.0 * (x - a) ** 4 + w2 / 24.0 * (x - a - d) ** 4 + w3 / 120.0 * (x - a - 2.0 * b + d) ** 4 +
      p1 * d ** 2 / 12.0 * (x - a - d * 4.0 / 5.0) +
        p2 * (2.0 * b - d) ** 2 / 6.0 * (x - a - d - (2.0 * b - d) * 3.0 / 4.0) +
        p3 * d ** 2 / 12.0 * (x - a - 2.0 * b + d - d * 4.0 / 5.0) +
      p1 * d / 3.0 * (x - a - d) ** 2 / 2.0 + 
        p2 * (2.0 * b - d) / 2.0 * (x - a - 2.0 * b) ** 2 / 2.0 + 
        p3 * d / 3.0 * (x - a - 2.0 * b) ** 2 / 2.0 +
      p1 / 6.0 * (x - a - d) ** 3 + p2 / 6.0 * (x - a - 2.0 * b) ** 3 + p3 / 6.0 * (x - a - 2.0 * b) ** 3   + __g__ * (m - ma) * l ** 2

  if ei == nil
    return q, m, t, v
  else
    return q, m, t / ei, v / ei
  end
end

def boundary_condition(tp, l, ca, cb, qa, qb, ei = nil, __g__ = 0, ka = 0, kb = 0, k1 = 1e20, k2 = 1e20, pm1 = 0, pm2 = 0, p1 = 0, p2 = 0)
# A) 剛性マトリクス [k]
  b1 = 6.0 / l ** 2
  d1 = 2.0 / l
  f1 = 4.0 / l
  if 0 < __g__ && ei
  # せん断変形
    p3 = 12.0 * __g__
    b1 *= 1 / (1 + p3)
    d1 *= 1 / (1 + p3) * (1 - p3 / 2)
    f1 *= 1 / (1 + p3) * (1 + p3 / 4)
  end
  a1 = 2.0 * b1 / l
  c1 = b1
  h1 = f1
  k = Matrix[
    [ a1, b1,-a1, c1],
    [ b1, f1,-b1, d1],
    [-a1,-b1, a1,-c1],
    [ c1, d1,-c1, h1] ]
# 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],
    [ pm1],
    [ p2],
    [ pm2] ].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] ]
# 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

l = 5.0   #m
a = 1.0   #m
c = 1.0
n = 1
w = 0 #kN/m
wf = -10.0
d = 1.0
pw = 0    #kN
pm = 0    #kNm
e = 6.5   #kN/m2
b = 0.15  #m
h = 0.30  #m
g = e/15  #kN/m2
fs = 1.2

ei = e * b * h ** 3 / 12 * 10**6
ga = g * b * h * 10**6
__g__ = fs * ei / ga / l ** 2

ka = kb = 500 #kNm/rad
k1 = k2 = 10  #kN/mm
p1 = p2 = 0
pm1, pm2 = -0, -0

tp = 6

  ca, cb, qa, qb = cq5(wf, l, a, c, d, __g__)
  ra, rb, ma, mb, ta, tb, va, vb = if tp == 6
    boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__, ka, kb, k1 * 1000, k2 * 1000, pm1, pm2, p1, p2)
  else
    boundary_condition(tp, l, ca, cb, qa, qb, ei, __g__)
  end

x = 2.5   #m
  q, m, t, v = mq5(x, tp, l, a, c, d, wf, ra, ma, ta, va, ei, __g__)
  p [x, q, m, t, v]


# Ruby/tk 

root = TkRoot.new(title: "Lite & Seen Lite #$0")
canvas = TkCanvas.new(root, width: 1000, height: 800, background: 'white').pack

def __plot_data__(canvas, pt, x, y, sx, sy = 1.0, i)
  y1 = 60
  plot_data = pt.map { |s| [s[0] * sx + x, s[1] * sy + y] }

  yyy =
  pt.each { |z| yyy << z[1]  }
  max_value = yyy.max

  $wq.each { |z| z.delete if z } if $wq != && i == 1
  $wm.each { |z| z.delete if z } if $wm != && i == 2
  $wt.each { |z| z.delete if z } if $wt !=
&& i == 3
  $wv.each { |z| z.delete if z } if $wv != && i == 4
  m = i
  j = 0

  ttt =
  xxx = plot_data.flatten
  0.step(xxx.size - 3, 2).each { |z| ttt << xxx[z..(z + 1)] + xxx[(z + 2)..(z + 3)] }
  plot_data = ttt

  plot_data.each_with_index { |pt, i| 
    if m == 1 #SFD
    $wq[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
    $wq[i + 1 + j * 5] = TkcLine.new(canvas, pt)
    $wq[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 #|| max_value == (pt[3] - y)

      $wq[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) { 
        text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0 && pt[0] != pt[2]
      if i > 0 && pt[0] == pt[2]
        if (pt[1] - pt[3]).abs > 0.005
          $wq[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1 - 10) { 
            text ( (pt[3] - y) / sy).round(3); anchor 'w'; angle 90 }
        end
      else
        $wq[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) { 
          text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
      end
    elsif m == 2 #BMD
    $wm[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
    $wm[i + 1 + j * 5] = TkcLine.new(canvas, pt)
    $wm[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 || max_value == (pt[3] - y)

      $wm[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) { 
        text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0 && pt[0] != pt[2]
      if i > 0 && pt[0] == pt[2]
        if (pt[1] - pt[3]).abs > 0.005
          $wm[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1 - 10) { 
            text ( (pt[3] - y) / sy).round(3); anchor 'w'; angle 90 }
        end
      else
        $wm[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) { 
          text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
      end
    elsif m == 3 #SLOPE-DEFLECTION
    $wt[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
    $wt[i + 1 + j * 5] = TkcLine.new(canvas, pt)
    $wt[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 || max_value == (pt[3] - y)

    $wt[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) { 
      text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0
    $wt[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) { 
      text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
    elsif m == 4 #DEFLECTION
    $wv[j * 5] = TkcLine.new(canvas, [pt[0], y], pt[0..1]) if i == 0
    $wv[i + 1 + j * 5] = TkcLine.new(canvas, pt)
    $wv[i + 2 + j * 5] = TkcLine.new(canvas, pt[2..3], [pt[2], y]) if i == plot_data.size - 1 || max_value == (pt[3] - y)

    $wv[i + 3 + j * 5] = TkcText.new(canvas, pt[0], y + y1) { 
      text ( (pt[1] - y) / sy).round(3); anchor 'e'; angle 90 } if i == 0
    $wv[i + 4 + j * 5] = TkcText.new(canvas, pt[2], y + y1) { 
      text ( (pt[3] - y) / sy).round(3); anchor 'e'; angle 90 }
    end
    j += 1
  }
end

$wq =
$wm =

$wt =
$wv =

$width = (l <= 5.0 ? 500 : (7.5 < l ? 750 : l * 100))

  pt_q =
  pt_m =

  pt_t =
  pt_v =

  dn = 10
  dx = l / dn
  for i in 0..dn
    x = dx * i
    q, m, t, v = mq5(x, tp, l, a, c, d, wf, ra, ma, ta, va, ei, __g__)
    pt_q << [x, q]
    pt_m << [x, m]
    pt_t << [x, t * 1000]
    pt_v << [x, v * 1000]
  end
  pt1 = pt_t[0][1] / 1000
  pt2 = pt_t[-1][1] / 1000
  pv1 = pt_v[0][1] / 1000
  pv2 = pt_v[-1][1] / 1000

x = 80+10
sx = $width / l
ay = -100+30

  TkcLine.new(canvas, x, -ay, x + $width, -ay)

ax = a * sx
bx = (l - a - c) * sx
cx = $width - ax - bx
z = 0

  if wf != 0
  cx = c * sx
  dx = d * sx
  # wf
  TkcText.new(canvas, x + ax + bx / 2, -ay-10) { 
      text 'wf = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + ax + bx / 2, -ay-10) { 
      text (-wf).round(1).to_s + ' kN/m2'; anchor 'w'; angle 0 }
  # |--|
  TkcLine.new(canvas, x + ax + dx, -ay-dx/4, x + $width - cx - dx, -ay-dx/4)
  TkcLine.new(canvas, x+ax, -ay, x + ax + dx, -ay-dx/4)
  TkcLine.new(canvas, x + $width-cx, -ay, x + $width - cx - dx, -ay-dx/4)
  # ↓
  TkcLine.new(canvas, x + $width / 2, -ay, x + $width / 2, -ay-dx/4)
  TkcLine.new(canvas, x + $width / 2-5, -ay-5, x + $width / 2, -ay)
  TkcLine.new(canvas, x + $width / 2+5, -ay-5, x + $width / 2, -ay)
  end

  if w != 0
  # w
  TkcText.new(canvas, x + ax + bx / 2, -ay-25) { 
      text 'w = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + ax + bx / 2, -ay-25) { 
      text (-w).round(1).to_s + ' kN/m'; anchor 'w'; angle 0 }
  if n == 0
  # |--|
    TkcLine.new(canvas, x + ax, -ay-10, x + ax + bx, -ay-10)
    TkcLine.new(canvas, x + ax, -ay, x + ax, -ay-10)
    TkcLine.new(canvas, x + ax + bx, -ay, x + ax + bx, -ay-10)
  # ↓
    TkcLine.new(canvas, x + ax + bx / 2, -ay, x + ax + bx / 2, -ay-10)
    TkcLine.new(canvas, x + ax + bx / 2-5, -ay-5, x + ax + bx / 2, -ay)
    TkcLine.new(canvas, x + ax + bx / 2+5, -ay-5, x + ax + bx / 2, -ay)
  else
    if z == 0
  # |/|
    x1, y1 = ax, (n < 0 ? -10*(n.abs+1) : 0)
    for i in 1..3 * n.abs
      if n < 0
      x2, y2 = ax + (s = i / (3 * n.to_f.abs)) * bx, -10*(n.abs+1) -(-10*(n.abs+1)) * s ** n.abs
      else
      x2, y2 = ax + (s = i / (3 * n.to_f.abs)) * bx, (-10*(n.abs+1)) * s ** n.abs
      end
      TkcLine.new(canvas, x + x1, -ay + y1, x + x2, -ay + y2)
      x1, y1 = x2, y2
    end
    else
  # |\|
    x1, y1 = $width-cx, (n < 0 ? -10*(n.abs+1) : 0)
    for i in 1..3 * n.abs
      if n < 0
      x2, y2 = cx + (s = i / (3 * n.to_f.abs)) * bx, -10*(n.abs+1) -(-10*(n.abs+1)) * s ** n.abs
      else
      x2, y2 = cx + (s = i / (3 * n.to_f.abs)) * bx, (-10*(n.abs+1)) * s ** n.abs
      end
      x2 = $width - x2
      TkcLine.new(canvas, x + x1, -ay + y1, x + x2, -ay + y2)
      x1, y1 = x2, y2
    end
    end
  # ↓
    if n < 0
    if z == 0
    TkcLine.new(canvas, x + ax, -ay, x + ax, -ay-10*(n.abs+1))
    TkcLine.new(canvas, x + ax-5, -ay-5, x + ax, -ay)
    TkcLine.new(canvas, x + ax+5, -ay-5, x + ax, -ay)
    else
    TkcLine.new(canvas, x + ax + bx, -ay, x + ax + bx, -ay-10*(n.abs+1))
    TkcLine.new(canvas, x + ax + bx-5, -ay-5, x + ax + bx, -ay)
    TkcLine.new(canvas, x + ax + bx+5, -ay-5, x + ax + bx, -ay)
    end
    else
    if z == 0
    TkcLine.new(canvas, x + ax + bx, -ay, x + ax + bx, -ay-10*(n+1))
    TkcLine.new(canvas, x + ax + bx-5, -ay-5, x + ax + bx, -ay)
    TkcLine.new(canvas, x + ax + bx+5, -ay-5, x + ax + bx, -ay)
    else
    TkcLine.new(canvas, x + ax, -ay, x + ax, -ay-10*(n+1))
    TkcLine.new(canvas, x + ax-5, -ay-5, x + ax, -ay)
    TkcLine.new(canvas, x + ax+5, -ay-5, x + ax, -ay)
    end
    end
  end
  end

  if pw != 0
ax = a / l
  # ↓
  TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax, -ay-30)
  TkcLine.new(canvas, x + $width * ax-5, -ay-5, x + $width * ax, -ay)
  TkcLine.new(canvas, x + $width * ax+5, -ay-5, x + $width * ax, -ay)
  # P
  TkcText.new(canvas, x + $width *ax, -ay-40) { 
      text 'P = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax, -ay-40) { 
      text (-pw).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
  end

  if pm != 0
ax = a / l
  TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax+20, -ay-20)
  TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20-7, -ay-20)
  TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20, -ay-13)
  TkcLine.new(canvas, x + $width * ax+20+3, -ay-23, x + $width * ax+20-4, -ay-23)
  TkcLine.new(canvas, x + $width * ax+20+3, -ay-23, x + $width * ax+20+3, -ay-16)
  # PM
  TkcText.new(canvas, x + $width * ax+20+25, -ay-29) { 
      text 'PM ='; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width * ax+20+25, -ay-29) { 
      text (pm).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
  end

  # ^ ^
  if tp == 0
  TkcLine.new(canvas, x-5, -ay+5, x, -ay)
  TkcLine.new(canvas, x+5, -ay+5, x, -ay)
  TkcLine.new(canvas, x + $width-5, -ay+5, x + $width, -ay)
  TkcLine.new(canvas, x + $width+5, -ay+5, x + $width, -ay)
  elsif tp == 1
  TkcLine.new(canvas, x + $width-1, -ay+5, x + $width-1, -ay-5)
  TkcLine.new(canvas, x + $width+1, -ay+5, x + $width+1, -ay-5)
  elsif tp == 2
  TkcLine.new(canvas, x-1, -ay+5, x-1, -ay-5)
  TkcLine.new(canvas, x+1, -ay+5, x+1, -ay-5)
  elsif tp == 3
  TkcLine.new(canvas, x-1, -ay+5, x-1, -ay-5)
  TkcLine.new(canvas, x+1, -ay+5, x+1, -ay-5)
  TkcLine.new(canvas, x + $width-1, -ay+5, x + $width-1, -ay-5)
  TkcLine.new(canvas, x + $width+1, -ay+5, x + $width+1, -ay-5)
  elsif tp == 4
  TkcLine.new(canvas, x-5, -ay+5, x, -ay)
  TkcLine.new(canvas, x+5, -ay+5, x, -ay)
  TkcLine.new(canvas, x + $width-1, -ay+5, x + $width-1, -ay-5)
  TkcLine.new(canvas, x + $width+1, -ay+5, x + $width+1, -ay-5)
  elsif tp == 5
  TkcLine.new(canvas, x-1, -ay+5, x-1, -ay-5)
  TkcLine.new(canvas, x+1, -ay+5, x+1, -ay-5)
  TkcLine.new(canvas, x + $width-5, -ay+5, x + $width, -ay)
  TkcLine.new(canvas, x + $width+5, -ay+5, x + $width, -ay)
  elsif tp == 6

  if k1 != 0 || ka != 0
ax = 0
  # ^ ^
  TkcLine.new(canvas, x + $width*ax, -ay, x + $width*ax, -ay+5, x + $width*ax-5, -ay+10, x + $width*ax+5, -ay+15, x + $width*ax, -ay+20, x + $width*ax, -ay+25)
  TkcLine.new(canvas, x + $width*ax-5, -ay+25, x + $width*ax+5, -ay+25)
  if ka != 0
#  TkcLine.new(canvas, do_ci([x + $width*ax, -ay+20, x + $width*ax, -ay+23]).hp(32))
  end
  end
  if k2 != 0 || kb != 0
ax = 1
  # ^ ^
  TkcLine.new(canvas, x + $width*ax, -ay, x + $width*ax, -ay+5, x + $width*ax-5, -ay+10, x + $width*ax+5, -ay+15, x + $width*ax, -ay+20, x + $width*ax, -ay+25)
  TkcLine.new(canvas, x + $width*ax-5, -ay+25, x + $width*ax+5, -ay+25)
  if kb != 0
#  TkcLine.new(canvas, do_ci([x + $width*ax, -ay+20, x + $width*ax, -ay+23]).hp(32))
  end
  end

  if k1 != 0
ax = 0
  r1 = pv1.to_f * k1 * 1000
k1 = 99999999 if 99999999 < k1
  # K1
  TkcText.new(canvas, x + $width *ax+50, -ay+15) { 
      text 'K1 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+15) { 
      text (k1).round(0).to_s + ' kN/mm'; anchor 'w'; angle 0 }
  # R1
  TkcText.new(canvas, x + $width *ax+50, -ay+45) { 
      text 'R1 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+45) { 
      text (p1-r1).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
  end
  if k2 != 0
ax = 1
  r2 = pv2.to_f * k2 * 1000
k2 = 99999999 if 99999999 < k2
  # K2
  TkcText.new(canvas, x + $width *ax+50, -ay+15) { 
      text 'K2 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+15) { 
      text (k2).round(0).to_s + ' kN/mm'; anchor 'w'; angle 0 }
  # R2
  TkcText.new(canvas, x + $width *ax+50, -ay+45) { 
      text 'R2 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+45) { 
      text (p2-r2).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
  end

  if ka != 0
ax = 0
  # KM1
  TkcText.new(canvas, x + $width *ax+50, -ay+30) { 
      text 'KM1 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+30) { 
      text (ka).round(0).to_s + ' kNm/rad'; anchor 'w'; angle 0 }
  # RM1
  rm1 = pt1.to_f * ka #/ 1000.0
  TkcText.new(canvas, x + $width *ax+50, -ay+60) { 
      text 'RM1 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+60) { 
      text (pm1-rm1).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
  end
  if kb != 0
ax = 1
  # KM2
  TkcText.new(canvas, x + $width *ax+50, -ay+30) { 
      text 'KM2 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+30) { 
      text (kb).round(0).to_s + ' kNm/rad'; anchor 'w'; angle 0 }
  # RM1
  rm2 = pt2.to_f * kb #/ 1000
  TkcText.new(canvas, x + $width *ax+50, -ay+60) { 
      text 'RM2 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax+50, -ay+60) { 
      text (pm2-rm2).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
  end
  end

  if p1 != 0
ax = 0
  TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax, -ay-30)
  TkcLine.new(canvas, x + $width * ax-5, -ay-5, x + $width * ax, -ay)
  TkcLine.new(canvas, x + $width * ax+5, -ay-5, x + $width * ax, -ay)
  # P1
  TkcText.new(canvas, x + $width *ax, -ay-55) { 
      text 'P1 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax, -ay-55) { 
      text (-p1).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
  end
  if p2 != 0
ax = 1
  TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax, -ay-30)
  TkcLine.new(canvas, x + $width * ax-5, -ay-5, x + $width * ax, -ay)
  TkcLine.new(canvas, x + $width * ax+5, -ay-5, x + $width * ax, -ay)
  # P2
  TkcText.new(canvas, x + $width *ax, -ay-55) { 
      text 'P2 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width *ax, -ay-55) { 
      text (-p2).round(1).to_s + ' kN'; anchor 'w'; angle 0 }
  end
  if pm1 != 0
ax = 0
  # ↓
  TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax+20, -ay-20)
  TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+13, -ay-20)
  TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20, -ay-13)
  TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+16, -ay-23)
  TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+23, -ay-16)
  # M1
  TkcText.new(canvas, x + $width*ax+40, -ay-40) { 
      text 'M1 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width*ax+40, -ay-40) { 
      text (-pm1).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
  end
  if pm2 != 0
ax = 1
  # ↓
  TkcLine.new(canvas, x + $width * ax, -ay, x + $width * ax+20, -ay-20)
  TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+13, -ay-20)
  TkcLine.new(canvas, x + $width * ax+20, -ay-20, x + $width * ax+20, -ay-13)
  TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+16, -ay-23)
  TkcLine.new(canvas, x + $width * ax+23, -ay-23, x + $width * ax+23, -ay-16)
  # M2
  TkcText.new(canvas, x + $width*ax+40, -ay-40) { 
      text 'M2 = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width*ax+40, -ay-40) { 
      text (-pm2).round(1).to_s + ' kNm'; anchor 'w'; angle 0 }
  end
  # x1
  TkcText.new(canvas, x, -ay+35) { 
      text (0.0).round(3); anchor 'e'; angle 90 }
  # x2
  TkcText.new(canvas, x+$width, -ay+35) { 
      text (l).round(3); anchor 'e'; angle 90 }

  # bxD
  TkcText.new(canvas, x + $width+50, -ay+90) { 
      text 'b = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width+50, -ay+90) { 
      text (b).round(3).to_s + ' m'; anchor 'w'; angle 0 }
  TkcText.new(canvas, x + $width+50, -ay+105) { 
      text 'D = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width+50, -ay+105) { 
      text (h).round(3).to_s + ' m'; anchor 'w'; angle 0 }
  # E
  TkcText.new(canvas, x + $width+50, -ay+120) { 
      text 'E = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width+50, -ay+120) { 
      text (e).round(4).to_s + ' kN/mm2'; anchor 'w'; angle 0 }
  if __g__ != 0
  # G
  TkcText.new(canvas, x + $width+50, -ay+135) { 
      text 'G = '; anchor 'e'; angle 0 }
  TkcText.new(canvas, x + $width+50, -ay+135) { 
      text (g).round(4).to_s + ' kN/mm2'; anchor 'w'; angle 0 }
  end


y1, y2, y3, y4 = 85+30, 240+30, 385+30, 550+30
TkcText.new(canvas, x, y1-ay, text: 'たわみ mm', anchor: 'sw')
TkcText.new(canvas, x, y2-ay, text: 'たわみ角 rad x 1000', anchor: 'sw')
TkcText.new(canvas, x, y3-ay, text: '曲げ  kNm', anchor: 'sw')
TkcText.new(canvas, x, y4-ay, text: 'せん断 kN', anchor: 'sw')
__plot_data__(canvas, pt_q, x, y4-ay, sx, -1.0, 1)
__plot_data__(canvas, pt_m, x, y3-ay, sx, -1.0, 2)
__plot_data__(canvas, pt_t, x, y2-ay, sx, -1.0, 3)
__plot_data__(canvas, pt_v, x, y1-ay, sx, -1.0, 4)


# 座標系
y = 135
TkcLine.new(canvas, x-60, 50+y, x-30, 50+y)
TkcLine.new(canvas, x-30, 50+y, x-35, 45+y)
TkcLine.new(canvas, x-30, 50+y, x-35, 55+y)
TkcText.new(canvas, x-25, 48+y, text: 'x', anchor: 'w')

TkcLine.new(canvas, x-60, 50+y, x-60, 20+y)
TkcLine.new(canvas, x-60, 20+y, x-65, 25+y)
TkcLine.new(canvas, x-60, 20+y, x-55, 25+y)
TkcText.new(canvas, x-60, 18+y, text: 'y', anchor: 's')

TkcLine.new(canvas, x-60, 50+y, x-77, 67+y)
TkcLine.new(canvas, x-77, 67+y, x-70, 67+y)
TkcLine.new(canvas, x-77, 67+y, x-77, 60+y)
TkcLine.new(canvas, x-80, 70+y, x-73, 70+y)
TkcLine.new(canvas, x-80, 70+y, x-80, 63+y)
TkcText.new(canvas, x-67, 67+y, text: 'z', anchor: 'w')


# はり軸線
[y1, y2, y3, y4].each { |y|
TkcLine.new(canvas, x, y-ay, x + $width, y-ay, fill: 'forestgreen')
TkcLine.new(canvas, x, y-ay + 10, x, y-ay - 10, fill: 'forestgreen')
TkcLine.new(canvas, x + $width / 2, y-ay + 10, x + $width / 2, y-ay - 10, fill: 'forestgreen')
TkcLine.new(canvas, x + $width, y-ay + 10, x + $width, y-ay - 10, fill: 'forestgreen')
}


$bai = 1.0
# マウスホイール
canvas.bind('MouseWheel', 
  proc { |pm| $bai += 0.1 * (pm == 0 ? 0 : (pm < 0 ? -1 : 1))
__plot_data__(canvas, pt_m, x, y3-ay, sx, -$bai, 2)
__plot_data__(canvas, pt_q, x, y4-ay, sx, -$bai, 1)
__plot_data__(canvas, pt_v, x, y1-ay, sx, -$bai, 4)
__plot_data__(canvas, pt_t, x, y2-ay, sx, -$bai, 3)
}, "%D")


Tk.mainloop


__END__