「Betti's theorem#Example(wikipedia)」をAI先生に聞きました。sympyのソースコードで。 (その2/2)


:::note info
[参考にsympyで。(その1/2)](https://qiita.com/mrrclb48z/items/c044ef9e3d917a23c0a8)
:::

・最初から、AI先生に聞けば、ヨカッタかも。



# (再)オリジナル
Example ＜

https://en.wikipedia.org/wiki/Betti%27s_theorem#Example

・最初の質問です。(wikipediaのソースです。)
**・次は改行していません。**
```
For a simple example let m=1 and n=1.  Consider a horizontal [[Beam (structure)|beam]] on which two points have been defined: point 1 and point 2.  First we apply a vertical force P at point 1 and measure the vertical displacement of point 2, denoted <math>\Delta_{P2}</math>.  Next we remove force P and apply a vertical force Q at point 2, which produces the vertical displacement at point 1 of <math>\Delta_{Q1}</math>.  Betti's reciprocity theorem states that:

:<math>P \,\Delta_{Q1}=Q \,\Delta_{P2}.</math>
```


# (本日の)ChatGPT先生へ
#### 質問リスト
・1. は　上記最初の質問です。(wikipediaのソースです。)
```
# 質問リスト
1. For a simple example let m=1 and n=1...（英語でのベッティの定理の説明）
2. 日本語で教えて下さい。
3. 見たいです。（図による説明の要望）
4. ベッティの定理の証明をsympy のソースコードで教えて下さい。
5. 見て見たいです。（より複雑な構造の例を見たい）
6. 続けて下さい。（2D構造への拡張を依頼）
7. 私の質問をMarkdown形式でリスト化して出力して。Markdown形式でリストからアスタリスクは削除して。1行目に、# 質問リスト の文字を出力して。最後の質問も追加して下さい。追番を追加して下さい。
```
>(回答抜粋)
>ここで登場するのが、ベッティの相反定理（Betti's reciprocity theorem） です。
この定理は次のように述べられます：
「ある力系が生じさせる変位に対して別の力系が行う仕事は、逆の配置での仕事と等しい」

![b14fbae9-541f-4b5f-92cf-ec7ae391e345.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/109698/dcf75917-f5f2-4eb3-a334-d967f1102e3b.png)

#### 証明コード（SymPy）
```python
from sympy import symbols, Matrix, simplify

# 剛性係数
k11, k12, k22 = symbols('k11 k12 k22')

# 剛性行列（対称であると仮定）
K = Matrix([[k11, k12],
            [k12, k22]])

# 2つの荷重ベクトル
P1, P2 = symbols('P1 P2')  # ケース1: 力P1を点1に
Q1, Q2 = symbols('Q1 Q2')  # ケース2: 力Q2を点2に

F1 = Matrix([P1, 0])
F2 = Matrix([0, Q2])

# K * u = F → u = K.inv() * F
u1 = K.inv() * F1
u2 = K.inv() * F2

# 左辺：P1による力 × Q2による変位
left = F1.dot(u2)

# 右辺：Q2による力 × P1による変位
right = F2.dot(u1)

# 差を確認（0になれば等しい）
diff = simplify(left - right)

print("Left  = ", left)
print("Right = ", right)
print("Difference (should be 0):", diff)
```
#### Python（SymPy）コード例：
```python
from sympy import symbols, Matrix, simplify

# 剛性定数
k = symbols('k')

# 剛性行列（1Dバネ系：点1–点2–点3）
# 各バネが隣接点をつなぎ、点1–2, 点2–3にバネがあると仮定
K = Matrix([
    [ k, -k,   0],
    [-k, 2*k, -k],
    [ 0, -k,  k]
])

# ケース1: 点1に力 P を加える
P = symbols('P')
F1 = Matrix([P, 0, 0])

# ケース2: 点3に力 Q を加える
Q = symbols('Q')
F2 = Matrix([0, 0, Q])

# それぞれの変位
u1 = K.inv() * F1
u2 = K.inv() * F2

# ベッティの定理: F1 · u2 = F2 · u1
left = simplify(F1.dot(u2))
right = simplify(F2.dot(u1))
diff = simplify(left - right)

print("Left  = ", left)
print("Right = ", right)
print("Difference (should be 0):", diff)
```
#### SymPy + 数値で確認（最小トラスモデル）
```python
from sympy import symbols, Matrix, cos, sin, simplify, sqrt

# 変数定義
E, A, L = symbols('E A L')  # 材料と幾何
theta = symbols('theta')   # 部材角度（rad）

# 単一トラス要素の剛性行列（2節点、4自由度: u1x, u1y, u2x, u2y）
c = cos(theta)
s = sin(theta)
k = (E * A / L) * 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]
])

# 荷重ベクトル1：節点1に単位水平力（右向き）
F1 = Matrix([1, 0, 0, 0])

# 荷重ベクトル2：節点2に単位鉛直力（上向き）
F2 = Matrix([0, 0, 0, 1])

# 各荷重による変位
u1 = k.inv() * F1
u2 = k.inv() * F2

# ベッティの定理の確認
left = simplify(F1.dot(u2))
right = simplify(F2.dot(u1))
diff = simplify(left - right)

print("Left  = ", left)
print("Right = ", right)
print("Difference (should be 0):", diff)
```
・難しくなってきたので、中断します。

# Gemini先生へ

# copilot先生へ

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

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

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