材料力学「はり全体の剛性マトリックスを算出する時、2つのはり要素の剛性マトリックスを重ね合わせるそうです。どのような意味ですか。」をAI先生ヘ。


# (本日の)ChatGPT先生へ
```
# 質問リスト
1. はり全体の剛性マトリックスを算出する時、2つのはり要素の剛性マトリックスを重ね合わせるそうです。どのような意味ですか。  
2. お願いします。  
3. 2次元はりで。  
4. sympy のソースコードで教えて下さい。  
5. 境界条件で  
6. トラスについても教えて下さい。  
7. 結果をE,A,P の式として出力して下さい。  
8. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。テキストのMarkdown形式で。
```
#### (以下回答抜粋)
>🧮 SymPyによるアセンブル実装コード
```python
import sympy as sp

# 記号の定義
E, I, L = sp.symbols('E I L', real=True, positive=True)

# 要素剛性マトリックス（v, θのみ。4自由度: v1, θ1, v2, θ2）
k_e = (E * I / L**3) * sp.Matrix([
    [12,   6*L,  -12,   6*L],
    [6*L, 4*L**2, -6*L, 2*L**2],
    [-12,  -6*L,   12,  -6*L],
    [6*L, 2*L**2, -6*L, 4*L**2]
])

# 全体剛性マトリックス（9自由度：u1,v1,θ1,u2,v2,θ2,u3,v3,θ3）
# ここでは u自由度は無視して、vとθだけを扱うので 6x6行列（v1,θ1,v2,θ2,v3,θ3）
K = sp.zeros(6, 6)

# 要素1: ノード1-2 → 自由度 [0,1,2,3] （v1,θ1,v2,θ2）
dof1 = [0, 1, 2, 3]
for i in range(4):
    for j in range(4):
        K[dof1[i], dof1[j]] += k_e[i, j]

# 要素2: ノード2-3 → 自由度 [2,3,4,5] （v2,θ2,v3,θ3）
dof2 = [2, 3, 4, 5]
for i in range(4):
    for j in range(4):
        K[dof2[i], dof2[j]] += k_e[i, j]

# 結果表示
sp.pprint(K, use_unicode=True)
```
>✅ コード全体（境界条件適用と解の計算）
```python
import sympy as sp

# --- 記号定義 ---
E, I, L, P = sp.symbols('E I L P', real=True, positive=True)

# 要素剛性マトリックス（v, θのみ）
k_e = (E * I / L**3) * sp.Matrix([
    [12,   6*L,  -12,   6*L],
    [6*L, 4*L**2, -6*L, 2*L**2],
    [-12,  -6*L,   12,  -6*L],
    [6*L, 2*L**2, -6*L, 4*L**2]
])

# --- 全体剛性マトリックス（自由度: v1, θ1, v2, θ2, v3, θ3） ---
K = sp.zeros(6, 6)
dof1 = [0, 1, 2, 3]
dof2 = [2, 3, 4, 5]

for i in range(4):
    for j in range(4):
        K[dof1[i], dof1[j]] += k_e[i, j]
        K[dof2[i], dof2[j]] += k_e[i, j]

# --- 荷重ベクトル（ノード3のv方向に荷重P） ---
f = sp.Matrix([0, 0, 0, 0, P, 0])

# --- 境界条件の適用（v1=0, θ1=0） → 自由度0,1を固定 ---
fixed_dofs = [0, 1]  # v1, θ1

# 可動自由度のリスト
all_dofs = list(range(6))
free_dofs = [i for i in all_dofs if i not in fixed_dofs]

# --- K, fを縮小（拘束自由度を削除） ---
K_reduced = K.extract(free_dofs, free_dofs)
f_reduced = f.extract(free_dofs, [0])

# --- 解く：K_reduced * d_reduced = f_reduced ---
d_reduced = sp.simplify(K_reduced.LUsolve(f_reduced))

# --- 全体の変位ベクトル（拘束は0）に戻す ---
d_full = sp.zeros(6, 1)
for i, idx in enumerate(free_dofs):
    d_full[idx] = d_reduced[i]

# --- 結果表示 ---
sp.pprint(d_full, use_unicode=True)
```
#### 🎯 トラスとは？
>🧮 実装：SymPy によるトラス解析
```python
import sympy as sp

# 記号の定義
A, E, P = sp.symbols('A E P', real=True, positive=True)
L1 = sp.Rational(1)  # 水平方向の長さ
L2 = sp.Rational(1)  # 垂直方向の長さ

# 単位方向ベクトル
def direction_cosines(dx, dy):
    L = sp.sqrt(dx**2 + dy**2)
    c = dx / L
    s = dy / L
    return c, s, L

# 要素剛性マトリックス（グローバル）
def truss_element_stiffness(E, A, L, c, s):
    k = (A * E / L) * sp.Matrix([
        [ c**2,  c*s, -c**2, -c*s],
        [ c*s,  s**2, -c*s, -s**2],
        [-c**2, -c*s,  c**2,  c*s],
        [-c*s, -s**2,  c*s,  s**2]
    ])
    return k

# --- 要素1: ノード1 (0,0) → ノード2 (1,0) ---
c1, s1, L1 = direction_cosines(1, 0)
k1 = truss_element_stiffness(E, A, L1, c1, s1)

# --- 要素2: ノード2 (1,0) → ノード3 (1,1) ---
c2, s2, L2 = direction_cosines(0, 1)
k2 = truss_element_stiffness(E, A, L2, c2, s2)

# --- 全体剛性マトリックス（6自由度） ---
K = sp.zeros(6, 6)

# 要素1対応自由度: ノード1-2 → [0,1,2,3]
dof1 = [0,1,2,3]
for i in range(4):
    for j in range(4):
        K[dof1[i], dof1[j]] += k1[i,j]

# 要素2対応自由度: ノード2-3 → [2,3,4,5]
dof2 = [2,3,4,5]
for i in range(4):
    for j in range(4):
        K[dof2[i], dof2[j]] += k2[i,j]

# --- 荷重ベクトル（ノード3にy方向の荷重P） ---
f = sp.Matrix([0, 0, 0, 0, 0, P])

# --- 境界条件（ノード1を完全固定） ---
fixed_dofs = [0, 1]  # u1, v1
free_dofs = [i for i in range(6) if i not in fixed_dofs]

# --- Kとfの縮小 ---
K_reduced = K.extract(free_dofs, free_dofs)
f_reduced = f.extract(free_dofs, [0])

# --- 解く ---
d_reduced = sp.simplify(K_reduced.LUsolve(f_reduced))

# --- 全体変位ベクトルに戻す ---
d_full = sp.zeros(6, 1)
for i, idx in enumerate(free_dofs):
    d_full[idx] = d_reduced[i]

# 結果表示（記号解）
sp.pprint(d_full, use_unicode=True)
```
>・以下省略

# Gemini先生へ

# copilot先生へ

# いつもの? sympyの実行環境と 参考のおすすめです。
[(テンプレート)](https://qiita.com/mrrclb48z/items/00dd08b0317069be9342)

https://qiita.com/mrrclb48z/items/b6351b48e47bcf6265c0

# いつもと違うおすすめです。
#### Qiita内