わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

組体操・人間ピラミッドの荷重計算をRubyで2

組体操で,人が乗ることによってかかる荷重を計算するRubyスクリプト(gfload.rb)をもとに,より実態に合わせた負荷の試算を試みるため,新たなRubyスクリプト(gfload+.rb)を作成しました.ソースはgistよりご覧ください.
gfload.rbとgfload+.rbを同じディレクトリに置いて,実行します.三角錐タイプ(立体型)の5段の人間ピラミッドに関する状況は次のとおりとなりました.なお出力は,Rubyの実行環境により異なる可能性があります.

$ ruby gfload+.rb | grep max_load
22 persons, total_weight=893.402, max_load=56.1638
$ ruby gfload+.rb | grep 56.1638
22 persons, total_weight=893.402, max_load=56.1638
name=1.2.2, weight=47.4268, load=56.1638, load_rate=1.18422, supporting: [2.2.1_8.9603, 2.2.2_11.8881, 3.1.1_15.6513, 3.1.2_19.6641; 4.1.1, 4.1.2, 5.1.1], supported by: []

はじめのコマンドでは,三角錐タイプで5段の人間ピラミッドに要するのは22人,総重量は893.402kg,最大荷重は56.1638kgと出力しています.
この最大荷重となるのが誰なのかを知るには,grepで最大荷重を指定すればよく,出力によるとそれは「name=1.2.2」の者です.最下段の前から2列目,左(右からでもいいのですが)の2番目に位置します.
自重は47.4268kg,荷重は56.1638kgで,荷重を自重で割って得られる1.18422により,自分の体重の約1.2倍の重さがかかることになります.*1
これは,全員が同じ体重で,三角形タイプ(俵型,平面型)で3段のピラミッドを作ったときの割合の最大値(1.5)よりも小さな値となっています.
もちろん,人間ピラミッドの難易度そしてリスクは,高さと参加人数*2,そして各演者の「頑張り」に依存するところが大きいのですが,「誰に自分の体重の何倍の力がかかるか」をリスク尺度とするなら,上記のような算出や比較が可能になるというわけです.


以下はRubyスクリプトの中身に関心のある方のみご覧ください.
gfload+.rbには,普段よりも多めにコメントを入れましたが,処理の主要なところを説明します.多くの試算では,人間ピラミッド実施者の体重を一律にしているのに対し,このスクリプトでは「ばらけた」値になるよう,乱数で体重を生成しました.
児童・生徒の体重に関しては,「体力・運動能力調査」の平成26年度分を参照しました.政府統計の総合窓口のキーワード検索で「運動能力」を入れると,見つかります.「4 学校段階別体格測定の結果 - 身長、体重、座高 - 2014年度」のExcelファイルを取得しました.
開いて見ると,小学校6年に対応する「11」の行で,男子の体重の平均値は37.82(kg),標準偏差は7.40(kg)とあります.これらの値をもとに,正規分布を仮定して体重の値をランダムに生成しました.Rubyのrandメソッドで生成する一様乱数を,正規分布に従う値にするために,wikipedia:ボックス=ミュラー法*3を採用しました.細かいこととして,小学校6年と中学校1年の平均にしているほか,そのままでは体重16kgの子が出てきて不憫なので,z値の絶対値が2より大きい値は使わないなどしています.
5段の三角錐人間ピラミッドに関するインスタンス生成は,gfload.rbで記述したものを使います.また体重がみな同じとき,誰に最も力がかかるのかは,Personインスタンスのリストを,load_weightの値でソートすれば求められます.
なのですが,荷重(割合)の順で割り当てると,トップに立つ人は荷重ゼロですが,その次に小さいのは,最下段・最前列の両端となってしまいます.ruby gfload.rb -p 5 -vを実行したところ,その者のload_rateは0.177563で,0の次に小さな値でした.
そこで「1段目」と「2段目以上」に分けてから,まず1段目に,負荷に応じて重い者から順に配置し,そのあと,2段目以上で同様に割り当てました.「配置」「割り当て」と言っても,インスタンスの置き換えはせず,体重を1から,生成した乱数値に変えただけです.

*1:なお,「supporting:」の直後のリストは,この人に「負荷をかける」人の情報です.手や足を乗せ,負荷をかけている者については,その名前と負荷(例えばkg)を,間接的に負荷をかけている者は名前のみを列挙しています.「suppoted by:」の直後は空欄ですが,こちらは,この人の「負荷がかかる」人の情報です.この人が,手や足を乗せ,負荷をかけている者については,その名前と負荷割合を,間接的に負荷をかけている者は名前のみを列挙します.

*2:http://www.geocities.jp/ma85003/math/human_pyramid.pdfに書かれている「ひとりでも力を抜けば崩れる(確率の積の法則)」を,無視するわけにいきません.

*3:Rubyのコード例が,http://www.mk-mode.com/octopress/2012/09/02/02002000/に載っていました.