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

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

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

## 今回取り上げる 例題は、

### [構造力学[第2版]上-静定編](https://www.amazon.co.jp/%E6%A7%8B%E9%80%A0%E5%8A%9B%E5%AD%A6-%E7%AC%AC2%E7%89%88-%E4%B8%8A-%E9%9D%99%E5%AE%9A%E7%B7%A8-%E5%B4%8E%E5%85%83-%E9%81%94%E9%83%8E/dp/4627425120)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/505fe73e-48aa-7163-69ca-65daaa39d22e.png)

から
**４章 演習問題4.3** より

図 4.20 に示す張り出しばりのＱ図, Ｍ図を描け

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/0c8b4050-da4d-db1b-3a41-e97802149b7c.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 に 入力データを記録していきます。

```python
body = dict()
```

### 格点 を定義する

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

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/96bfdcb3-8873-69af-63f4-d87cdb73f99d.png)

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/0a9a65fd-32f0-78bf-a629-d53131987bbe.png)

```python
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軸周りの断面二次モーメント

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/f2e74eea-dfc8-e2bc-e9b8-c92d61ce0c91.png)

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/d5e80160-a1cc-772b-8ed7-cd8c01b1eb32.png)

```python
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](https://structuralengine.com)という API を使います。
上記のデータを ここに POST すると断面力を計算してくれます

```python
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)   
```

```json:解析結果
{'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 で得られた解析結果から Ｑ図と Ｍ図を作図します。

### 断面力の情報を取り出す

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

- "1": ケース番号
    - "1","2": 部材番号
        - fsec: 断面力
            - P1：着目点
                - fzi：z軸方向 左側のせん断力
                - fzj：z軸方向 右側のせん断力
                - myi：y軸周り 左側の曲げモーメント
                - myj：y軸周り 右側の曲げモーメント

```python
# ケース１の情報を取り出す
case1 = result['1']
# 断面力情報を取り出す
fsec = case1['fsec']
# 部材番号１の情報を取り出す
member1 = fsec['1']['P1']
# 部材番号２の情報を取り出す
member2 = fsec['2']['P1']
```

### Ｑ図、Ｍ図を作図する

```python
# 部材の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']]
```

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

```python
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/142847/c4a56901-c70c-6780-5d61-611114c2d382.png)

答えが一致しました

# まとめ

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

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