5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

張り出しばりの断面力を python と API を用いてサクッと算出

Posted at

構造力学 の教科書に記載されている問題を python で解いてみました

構造力学は人によっては難解だと感じる学問、python の勉強は楽しいけど 構造力学は苦手という人向けに
python を用いて構造力学の問題を解いてみたいと思います。

今回取り上げる 例題は、

構造力学[第2版]上-静定編

image.png

から
4章 演習問題4.3 より

図 4.20 に示す張り出しばりのQ図, M図を描け

image.png

を python と api でサクッと解いてみたいと思います。

全ソースコードはこちら
https://colab.research.google.com/drive/11cMEEUSFgu3hVw0vLOo1PZhvwSiM-5Ys?usp=sharing

解説

今回用いた環境 Google colaboratory

Google colaboratory という Google が無償で提供する python をインストールしなくても使える環境で
問題を解きます。

計算の流れ

  1. 入力データを生成
  2. API に断面力の計算をさせる
  3. 計算結果を表示する

1.入力データを生成する

この変数body に 入力データを記録していきます。

body = dict()

格点 を定義する

トラスなどの骨組構造における部材と部材の交点の座標と番号を定義する

image.png

n1 = {"x":0, "y":0, "z":0}
n2 = {"x":2, "y":0, "z":0}
n3 = {"x":6, "y":0, "z":0}

body["node"] = {
    "1": n1,
    "2": n2,
    "3": n3 
    }

部材 を定義する

骨組構造における部材の番号と下記の情報を定義する

  • ni: 部材の左端の点
  • nj: 部材の右端の点
  • e: 後述する材料番号

image.png

body["member"] = {
    "1": {"ni":"1", "nj":"2", "e":"1"},
    "2": {"ni":"2", "nj":"3", "e":"1"}
        }

材料の番号と下記の情報を定義する

今回の問題では、材料は一様で、特に指定がないので、適当な数値を入力している

  • E: 弾性係数
  • G: せん断弾性係数
  • Xp: 膨張係数
  • A: 断面積
  • J: ねじり定数
  • Iy: y軸周りの断面二次モーメント
  • Iz: z軸周りの断面二次モーメント
body["element"] = {
    "1":{
       "1":{ "E":20000000, "G":770000, "Xp":0.00001, "A":1.0, "J":1.0, "Iy":1.0, "Iz":1.0 }
      }
    }

支点の情報を定義する

  • n: 固定する格点番号
  • tx: x方向の変位を固定する場合は1, 固定しない場合は0
  • ty: y方向の変位を固定する場合は1, 固定しない場合は0
  • tz: z方向の変位を固定する場合は1, 固定しない場合は0
  • rx: x軸周りの回転を固定する場合は1, 固定しない場合は0
  • ry: y軸周りの回転を固定する場合は1, 固定しない場合は0
  • rz: z軸周りの回転を固定する場合は1, 固定しない場合は0

image.png

body["fix_node"] = { 
    "1":[
       {"n":"2","tx":1,"ty":1,"tz":1,"rx":0,"ry":0,"rz":0},
       {"n":"3","tx":0,"ty":1,"tz":1,"rx":0,"ry":0,"rz":0}
      ]
    }

荷重の情報を定義する

  • fix_node: 支点の情報の番号
  • element: 材料情報の番号
  • load_node
    • n: 荷重を載荷する格点番号
    • tx: x方向に作用する荷重
    • ty: y方向に作用する荷重
    • tz: z方向に作用する荷重
    • rx: x軸周りに作用するモーメント
    • ry: y軸周りに作用するモーメント
    • rz: z軸周りに作用するモーメント

image.png

body["load"] = {
      "1":{
         "fix_node": "1",
         "element": "1",
         "load_node":[
                      { "n":"1","tx":0,"ty":0,"tz":2,"rx":0,"ry":0,"rz":0 }
                      ]
        }
    }

2. API に断面力の計算をさせる

断面力の計算は、StructuralEngineという API を使います。
上記のデータを ここに POST すると断面力を計算してくれます

response = requests.post(
    'https://asia-northeast1-the-structural-engine.cloudfunctions.net/frameWeb-2',
     json.dumps(body),
     headers={'Content-Type': 'application/json'})
result = response.json()   # レスポンスのHTMLを文字列で取得
print('解析結果', result)   
解析結果
{'1': {'disg': {'1': {'dx': 0.0, 'dy': 0.0, 'dz': 8e-07, 'rx': 0.0, 'ry': 4.666666666666666e-07, 'rz': 0.0}, '2': {'dx': 0.0, 'dy': 0.0, 'dz': 0.0, 'rx': 0.0, 'ry': 2.6666666666666667e-07, 'rz': 0.0}, '3': {'dx': 0.0, 'dy': 0.0, 'dz': 0.0, 'rx': 0.0, 'ry': -1.333333333333333e-07, 'rz': 0.0}}, 'reac': {'2': {'tx': 0.0, 'ty': 0.0, 'tz': -1.0000000000000016, 'mx': 0.0, 'my': 0.0, 'mz': 0.0}, '3': {'tx': 0.0, 'ty': 0.0, 'tz': 1.0000000000000002, 'mx': 0.0, 'my': 0.0, 'mz': 0.0}}, 'fsec': {'1': {'P1': {'fxi': -0.0, 'fyi': -0.0, 'fzi': -2.0000000000000018, 'mxi': 0.0, 'myi': -3.552713678800501e-15, 'mzi': 0.0, 'fxj': 0.0, 'fyj': 0.0, 'fzj': -2.0000000000000018, 'mxj': -0.0, 'myj': 4.000000000000002, 'mzj': -0.0, 'L': 2.0}}, '2': {'P1': {'fxi': -0.0, 'fyi': -0.0, 'fzi': 1.0000000000000002, 'mxi': 0.0, 'myi': 4.0, 'mzi': 0.0, 'fxj': 0.0, 'fyj': 0.0, 'fzj': 1.0000000000000002, 'mxj': -0.0, 'myj': -4.440892098500626e-16, 'mzj': -0.0, 'L': 4.0}}}}}

3. 計算結果を表示する

API で得られた解析結果から Q図と M図を作図します。

断面力の情報を取り出す

情報は、以下の階層で格納されているため 取り出して作図します。

  • "1": ケース番号
    • "1","2": 部材番号
      • fsec: 断面力
        • P1:着目点
          • fzi:z軸方向 左側のせん断力
          • fzj:z軸方向 右側のせん断力
          • myi:y軸周り 左側の曲げモーメント
          • myj:y軸周り 右側の曲げモーメント
# ケース1の情報を取り出す
case1 = result['1']
# 断面力情報を取り出す
fsec = case1['fsec']
# 部材番号1の情報を取り出す
member1 = fsec['1']['P1']
# 部材番号2の情報を取り出す
member2 = fsec['2']['P1']

Q図、M図を作図する

# 部材のx座標
x = [ n1['x'], n2['x'], n2['x'], n3['x'] ]
# 部材のy座標
y = [ n1['y'], n2['y'], n2['y'], n3['y'] ]
# せん断力
yQ = [ member1['fzi'], member1['fzj'], member2['fzi'], member2['fzj']]
# 曲げモーメント
yM = [ member1['myi'], member1['myj'], member2['myi'], member2['myj']]

以上の情報から図を描きます。

fig = plt.figure()

ax1 = fig.add_subplot(1, 2, 1)
ax1.set_ylim([2, -3])
ax1.set_xlim([-1, 7])
ax1.plot(x, y, marker ='o', color = "darkblue")
ax1.plot(x, yQ, color = "lightblue")
ax1.fill_between( x, yQ, color="lightblue", alpha=0.2)
ax1.set_title("Q")


ax2 = fig.add_subplot(1, 2, 2)
ax2.set_ylim([-1, 5])
ax2.set_xlim([-1, 7])
ax2.plot(x, y, marker ='o', color = "darkblue")
ax2.plot(x, yM, color = "lightblue")
ax2.fill_between( x, yM, color="lightblue", alpha=0.2)
ax2.set_title("M")

image.png

答えが一致しました

まとめ

構造力学 の教科書に記載されている問題を python で解いてみました

構造力学が苦手でも、python があれば理解せずに先に進めます
いろいろ遊んでるうちに 構造力学の理解が深まれば幸いです

5
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?