座標法と 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 で問題ありませんでした。