断面性能の計算式(番外編)-ruby-

座標法と ruby で断面性能を計算するやり方を紹介します。


座標法でも 形状寸法を変数とすれば 計算式を 求めることができます。多角形に限られますが 積分をする必要はありません。


多角形の断面性能の計算式は

となります。座標に数値を代入すれば 断面性能が算定できます。

ただし

座標 = [x1, y1], [x2, y2], [x3, y3], …, [xn, yn]

Ax = S,  Ix = Jx,  Iy = Jy, Ixy = Jxy

図心回りの2次モーメント
    Ixc = Ix - Ax * gy ** 2
    Iyc = Iy - Ax * gx ** 2
図心回りの相乗モーメント
    Ixyc = Ixy - Ax * gx * gy
Xc軸からの主軸の角度 α
    α = atan2(2 * Ixyc, Iyc - Ixc) / 2
Σ は i = 1, n-1
座標は閉鎖形の頂点でそれを結ぶ線が交差しないようにする

※参考文献
 ○材料力学本論 / 前澤・吉峯訳 / コロナ社 付録2 平面図形の諸元
 ○建造力学 / 谷口著 / 裳華房 第20章 断面の主軸

 

 

さて、今回は ruby だけで計算するプログラムを紹介します。

 

例.1  正方形

つぎのプログラムを  100-13-1.bat で保存して実行すると

: regular square
@echo off
ruby -x %~f0
pause
goto:eof

#!ruby -Ku
pt = [[1, 1], [3, 1], [3, 3], [1, 3], [1, 1]]

n = pt.size - 2
x =
y =

pt.each_with_index { |z, i| x[i], y[i] = z[0].to_f, z[1].to_f }
a = sx = sy = ix = iy = jxy = 0
for i in 0..n
  a += (s = x[i] * y[i+1] - x[i+1] * y[i]) / 2.0
  sx += s * (x[i] + x[i+1]) / 6.0
  sy += s * (y[i] + y[i+1]) / 6.0
  ix += s * ( (y[i] + y[i+1]) ** 2 + y[i] ** 2 + y[i+1] ** 2) / 24.0
  iy += s * ( (x[i] + x[i+1]) ** 2 + x[i] ** 2 + x[i+1] ** 2) / 24.0
  jxy += s * ( (x[i] + x[i+1]) * (y[i] + y[i+1]) + x[i] * y[i] + x[i+1] * y[i+1]) / 24.0
end
puts "area"
puts "  Ax = %s" % a
puts "elastic center"
puts "  gx = %s" % gx = sx / a; puts "  gy = %s" % gy = sy / a
ixc = ix - a * gy ** 2
iyc = iy - a * gx ** 2
ixy = jxy - a * gx * gy
alpha = (ixy.abs < 1e-10 ? 0 : Math::atan2(2 * ixy, iyc - ixc) / 2.0)

puts "moment of inertia of area"
puts "  Ix = %s" % ix ; puts "  Iy = %s" % iy
puts "centrifugal moment of area"
puts "  Ixy = %s" % jxy
puts "moment of inertia of area by elastic center"
puts "  Ixc = %s" % ixc; puts "  Iyc = %s" % iyc
puts "centrifugal moment of area by elastic center"
puts "  Ixyc = %s" % ixy
puts "principal axis of area"
puts "  alpha = %s" % alpha
__END__

 

 

計算結果は

となります。

 

 

 

例.2   下図で b = h = 5.0,  b1 = h1 = 3.0,  b2 = h2 = 1.0 

つぎのプログラムを  100-13-2.bat で保存して実行すると

: triple rectangle
@echo off
path C:\maxima-5.46.0\bin;%path%
set RUBYLIB=\jww\Lite\pro\ruby\lib
ruby -x %~f0
pause
goto:eof

#!ruby -Ku
b, h, b1, h1, b2, h2 = 5.0, 5.0, 3.0, 3.0, 1.0, 1.0
pt = [[0, 0], [b, 0], [b, h], [0, h], [0, 0],
[(b-b1)/2, (h-h1)/2], [(b-b1)/2, (h+h1)/2], [(b+b1)/2, (h+h1)/2], [(b+b1)/2, (h-h1)/2], [(b-b1)/2, (h-h1)/2], 
[(b-b2)/2, (h-h2)/2], [(b+b2)/2, (h-h2)/2], [(b+b2)/2, (h+h2)/2], [(b-b2)/2, (h+h2)/2], [(b-b2)/2, (h-h2)/2], 
[(b-b1)/2, (h-h1)/2], [0, 0]]

n = pt.size - 2
x =
y =

pt.each_with_index { |z, i| x[i], y[i] = z[0].to_f, z[1].to_f }
a = sx = sy = ix = iy = jxy = 0
for i in 0..n
  a += (s = x[i] * y[i+1] - x[i+1] * y[i]) / 2.0
  sx += s * (x[i] + x[i+1]) / 6.0
  sy += s * (y[i] + y[i+1]) / 6.0
  ix += s * ( (y[i] + y[i+1]) ** 2 + y[i] ** 2 + y[i+1] ** 2) / 24.0
  iy += s * ( (x[i] + x[i+1]) ** 2 + x[i] ** 2 + x[i+1] ** 2) / 24.0
  jxy += s * ( (x[i] + x[i+1]) * (y[i] + y[i+1]) + x[i] * y[i] + x[i+1] * y[i+1]) / 24.0
end
puts "area"
puts "  Ax = %s" % a
puts "elastic center"
puts "  gx = %s" % gx = sx / a; puts "  gy = %s" % gy = sy / a
ixc = ix - a * gy ** 2
iyc = iy - a * gx ** 2
ixy = jxy - a * gx * gy
alpha = (ixy.abs < 1e-10 ? 0 : Math::atan2(2 * ixy, iyc - ixc) / 2.0)

puts "moment of inertia of area"
puts "  Ix = %s" % ix ; puts "  Iy = %s" % iy
puts "centrifugal moment of area"
puts "  Ixy = %s" % jxy
puts "moment of inertia of area by elastic center"
puts "  Ixc = %s" % ixc; puts "  Iyc = %s" % iyc
puts "centrifugal moment of area by elastic center"
puts "  Ixyc = %s" % ixy
puts "principal axis of area"
puts "  alpha = %s" % alpha
__END__

 

計算結果は

となります。このような図形でも正確な値を返すことができます。

 


数値計算だけであれば ruby で問題ありませんでした。