材料力学「sympyのtrussモジュールで作図した後に、ひずみエネルギーを計算する方法を教えて下さい。」をAI先生ヘ。  

・難しくなりました。

# (本日の)ChatGPT先生へ(1回目)
```
# 質問リスト
1. sympyのtrussモジュールで作図した後に、ひずみエネルギーを計算する方法を教えて下さい。  
2. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。Markdown形式で。  
3. markdownのテキスト形式で。本質問も含めて下さい。
```
#### (以下回答抜粋)
>🧪 実装例
>以下は、簡単な2次元トラスでひずみエネルギーを計算する例です。

**以下のエラーがでます。**
**AttributeError: 'Truss' object has no attribute 'add_joint'**

```python
from sympy import symbols, Rational
from sympy.physics.continuum_mechanics.truss import Truss
from sympy.geometry import Point

# 定数定義
E, A = symbols('E A')  # ヤング率と断面積

# Truss作成
truss = Truss()
truss.add_joint('A', Point(0, 0))
truss.add_joint('B', Point(1, 0))
truss.add_joint('C', Point(0.5, 1))

# 部材追加（ヤング率と断面積を含む）
truss.add_bar('AB', 'A', 'B', A, E)
truss.add_bar('AC', 'A', 'C', A, E)
truss.add_bar('BC', 'B', 'C', A, E)

# 支持条件と荷重
truss.add_support('A', 'pin')
truss.add_support('B', 'roller')
truss.add_load('C', 'y', -1)

# 解を求める
truss.solve()

# 各部材のひずみエネルギーを計算
strain_energy = 0
for bar in truss.bars.values():
    F = bar.force()
    L = bar.length()
    strain_energy += (F**2 * L) / (2 * A * E)

# 結果出力
print("ひずみエネルギー（U）:", strain_energy)
```

# (本日の)ChatGPT先生へ(2回目)続き
>✅ 対応方法（自作でトラス構造を記述）

**以下のエラーがでます。**
**TypeError: unsupported operand type(s) for /: 'Mul' and 'MutableDenseMatrix'**

```python
from sympy import symbols, Matrix, solve, simplify, sqrt

# 記号定義
Ax, Ay, By, F = symbols('Ax Ay By F')
E, A = symbols('E A', positive=True)

# 節点の座標
A = Matrix([0, 0])
B = Matrix([2, 0])
C = Matrix([1, 1])

# 各部材の方向ベクトルと長さ
def unit_vector(p1, p2):
    v = p2 - p1
    return v / v.norm()

u_AB = unit_vector(A, B)
u_AC = unit_vector(A, C)
u_BC = unit_vector(B, C)

L_AB = (B - A).norm()
L_AC = (C - A).norm()
L_BC = (C - B).norm()

# 軸力を未知数として定義
N_AB, N_AC, N_BC = symbols('N_AB N_AC N_BC')

# 節点ごとの釣り合い式
eq_A = N_AB * u_AB + N_AC * u_AC + Matrix([Ax, Ay])
eq_B = -N_AB * u_AB + N_BC * u_BC + Matrix([0, By])
eq_C = -N_AC * u_AC - N_BC * u_BC + Matrix([0, -F])

# 式を解く
solution = solve((eq_A[0], eq_A[1], eq_B[1], eq_C[0], eq_C[1]), 
                 (N_AB, N_AC, N_BC, Ay, By))

# ひずみエネルギー U = Σ (F² L) / (2AE)
U = 0
for N, L in [(solution[N_AB], L_AB), (solution[N_AC], L_AC), (solution[N_BC], L_BC)]:
    U += (N**2 * L) / (2 * A * E)

U = simplify(U)
print("ひずみエネルギー:", U)
```
>✅ 完全スクリプト
```python
from sympy import symbols, Matrix, solve, simplify

# 記号定義
Ax, Ay, By, F = symbols('Ax Ay By F')  # 支点反力と荷重
E, A = symbols('E A', positive=True)   # ヤング率と断面積

# 節点の座標（2Dベクトル）
A_pos = Matrix([0, 0])
B_pos = Matrix([2, 0])
C_pos = Matrix([1, 1])

# 単位ベクトルを返す関数（安全なスカラー除算）
def unit_vector(p1, p2):
    v = p2 - p1
    return v * (1 / v.norm())

# 各部材の方向ベクトル（単位ベクトル）と長さ
u_AB = unit_vector(A_pos, B_pos)
u_AC = unit_vector(A_pos, C_pos)
u_BC = unit_vector(B_pos, C_pos)

L_AB = (B_pos - A_pos).norm()
L_AC = (C_pos - A_pos).norm()
L_BC = (C_pos - B_pos).norm()

# 軸力（未知数）定義
N_AB, N_AC, N_BC = symbols('N_AB N_AC N_BC')

# 各節点の釣り合い式（x成分・y成分）
# 節点A: AB, AC, 支点Ax, Ay
eq_A = N_AB * u_AB + N_AC * u_AC + Matrix([Ax, Ay])

# 節点B: -AB, BC, 支点By
eq_B = -N_AB * u_AB + N_BC * u_BC + Matrix([0, By])

# 節点C: -AC, -BC, 荷重F（下向き）
eq_C = -N_AC * u_AC - N_BC * u_BC + Matrix([0, -F])

# 5つの未知数、5つの方程式で解く
solution = solve((
    eq_A[0], eq_A[1],
    eq_B[1],
    eq_C[0], eq_C[1]
), (N_AB, N_AC, N_BC, Ay, By))

# 結果表示（軸力）
print("部材軸力:")
for name in ['N_AB', 'N_AC', 'N_BC']:
    print(f"  {name} =", simplify(solution[symbols(name)]))

# ひずみエネルギー計算（U = Σ (N² * L) / (2AE)）
U = 0
for N, L in [(solution[N_AB], L_AB), (solution[N_AC], L_AC), (solution[N_BC], L_BC)]:
    U += (N**2 * L) / (2 * A * E)

print("\nひずみエネルギー U =")
print(simplify(U))
```
・出力結果
```
部材軸力:
  N_AB = -Ax + F/2
  N_AC = -sqrt(2)*F/2
  N_BC = -sqrt(2)*F/2

ひずみエネルギー U =
(2*sqrt(2)*F**2 + (2*Ax - F)**2)/(4*A*E)
```



# Gemini先生へ

# copilot先生へ

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

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

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