座標法と数式処理ソフト maxima で断面性能の計算式を求めるやり方を紹介します。
座標法でも 形状寸法を変数とすれば 計算式を 求めることができます。多角形に限られますが 積分をする必要はありません。
数式処理ソフトを利用すれば 多角形の頂点の座標を定義するだけで 断面積から主軸の角度まで算定することができます。いまのところ、円弧や放物線は 折れ線に置き換える必要があるのですが、今後の研究によって 合理的な手法が提案されてくると思われます。
多角形の断面性能の計算式は
となります。座標に数値を代入すれば 断面性能が算定できます。
ただし
座標 = [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章 断面の主軸
さて、今回は 一筆書きについて考えます。
座標法で扱える多角形は一筆書きできるものに限られますが、線の交差を避ければ大抵の図形に対応できそうです。簡単な図形で、一筆書きを検討してみました。
次のような △ を考えます。
左から2番目の2こぶラクダは 4 点が 線 1-2 に接触します。
左から3番目は 線 2-3 と 3-4 が重なっています。
1番右は 線 3-4 と 4-5 が重なり、1点 と同じ位置に 7 点 を与えています。
つぎのプログラムを 100-12-1.bat で保存して実行すると
/* triangle
@echo off & cls
path C:\maxima-5.47.0\bin;%path%
type %0 | maxima --very-quiet
pause
goto:eof
*/
/* △ */
Pt : matrix([0, 0], [b, 0], [b/2, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
/* △△ */
Pt : matrix([0, 0], [2*b, 0], [b+b/2, h], [b, 0], [b/2, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
/* _||_\/ */
Pt : matrix([0, 0], [b/2, 0], [b/2, h], [b/2, 0], [b, 0], [b/2, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
/* /_||_\ */
Pt : matrix([b/2, h], [0, 0], [b/2, 0], [b/2, h], [b/2, 0], [b, 0], [b/2, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
quit()$
計算結果は
となります。
同じことを □ で考えます。
左から2番目は 対角線が重なっています。
左から3番目は 線 3-4 と 4-5 が重なり 4 点が 線 7-1 に接触します。
1番右は 線 2-3 と 3-4、線 6-7 と 7-8、線 10-11 と 11-12、線 14-15 と 15-16 が重っています。
つぎのプログラムを 100-12-2.bat で保存して実行すると
/* rectangle
@echo off & cls
path C:\maxima-5.47.0\bin;%path%
type %0 | maxima --very-quiet
pause
goto:eof
*/
/* □ */
Pt : matrix([0, 0], [b, 0], [b, h], [0, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
/* 〼 */
Pt : matrix([0, 0], [b, 0], [b, h], [0, 0], [b, h], [0, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
/* 日 */
Pt : matrix([0, 0], [b, 0], [b, h/2], [0, h/2], [b, h/2], [b, h], [0, h])$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
/* 田 */
Pt : matrix([0, 0], [b/2, 0], [b/2, h/2],
[b/2, 0], [b, 0], [b, h/2], [b/2, h/2], [b, h/2], [b, h], [b/2, h],
[b/2, h/2], [b/2, h], [0, h], [0, h/2], [b/2, h/2], [0, h/2]
)$
n : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
print("area")$
print(" Ax =", float(Ax))$
quit()$
計算結果は
となります。
多角形を内包する場合を考えます。
外が左回り、中央が右回り、内が左回りとすると 青塗り部分の断面性能が計算できます。
つぎのプログラムを 100-12-3.bat で保存して実行すると
/* triple rectangle
@echo off & cls
path C:\maxima-5.47.0\bin;%path%
type %0 | maxima --very-quiet
pause
goto:eof
*/
/* □□□ */
Pt : matrix([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 : length(Pt)-1$
x : col(Pt, 1)$
y : col(Pt, 2)$
Ax : sum( (s[i] : x[i] * y[i+1] - x[i+1] * y[i]) / 2, i, 1, n)[1]$
gx : sum(s[i] * (x[i] + x[i+1]) / (6 * Ax), i, 1, n)[1]$
gy : sum(s[i] * (y[i] + y[i+1]) / (6 * Ax), i, 1, n)[1]$
Ix : sum(s[i] * ( (y[i] + y[i+1]) ^ 2 + y[i] ^ 2 + y[i+1] ^ 2) / 24, i, 1, n)[1]$
Iy : sum(s[i] * ( (x[i] + x[i+1]) ^ 2 + x[i] ^ 2 + x[i+1] ^ 2) / 24, i, 1, n)[1]$
Ixy : sum(s[i] * ( (x[i] + x[i+1]) * (y[i] + y[i+1]) + x[i] * y[i] + x[i+1] * y[i+1]) / 24, i, 1, n)[1]$
Ixc : Ix - Ax * gy ^ 2$
Iyc : Iy - Ax * gx ^ 2$
Ixyc : Ixy - Ax * gx * gy$
alpha : if Ixyc = 0 then 0 else atan2(2 * Ixyc, Iyc - Ixc) / 2$
print("area")$
print(" Ax =", factor(Ax))$
print("elastic center")$
print(" gx =", factor(gx))$ print(" gy =", factor(gy))$
print("moment of inertia of area")$
print(" Ix =", factor(Ix))$ print(" Iy =", factor(Iy))$
print("centrifugal moment of area")$
print(" Ixy =", factor(Ixy))$
print("moment of inertia of area by elastic center")$
print(" Ixc =", factor(Ixc))$ print(" Iyc =", factor(Iyc))$
print("centrifugal moment of area by elastic center")$
print(" Ixyc =", factor(Ixyc))$
print("principal axis of area")$
print(" alpha =", factor(alpha))$
quit()$
終点の与え方に注意してください。
計算結果は
となります。
座標法で断面性能を計算するとき、対象となる多角形の一筆書きの線は接触や重なりは許されるようです。さらに、座標法は円弧をきちんと補正すれば、JISの規格鋼材の断面性能でも近似値でなく正確な値を返すようにプログラムすることは可能です。
断面性能の計算式は、これで終わりです。
次回は 楕円弧の長さ を考えてみます。