材料力学「はりのたわみ曲線導出」をAI先生に聞きました。

・私の**こんなアバウトな質問**にも、丁寧に回答をいただきました。ありがとうございます。
```
# 質問リスト
1. はり上に中間荷重がないときのはりの微分方程式から、節点変位であらわしたたわみ曲線を導出して下さい。
2. 上記をsympy のソースコードで教えて下さい。
3. 上記をsympyのマトリックスを使ったソースコードで教えて下さい。
4. 上記のマトリックスを使って、連続はりのsympy のソースコードを教えて下さい。
```
# ChatGPT先生へ

>ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
>回答抜粋

**・以下、私は実行していません。**
```python
import sympy as sp

# 変数定義
x, L = sp.symbols('x L')  # 位置 x, はりの長さ L
w1, w2 = sp.symbols('w1 w2')  # 節点変位
θ1, θ2 = sp.symbols('theta1 theta2')  # 節点回転角

# たわみ関数を3次式として仮定
a0, a1, a2, a3 = sp.symbols('a0 a1 a2 a3')
w = a0 + a1*x + a2*x**2 + a3*x**3

# 境界条件設定
eq1 = sp.Eq(w.subs(x, 0), w1)  # w(0) = w1
eq2 = sp.Eq(w.subs(x, L), w2)  # w(L) = w2
eq3 = sp.Eq(sp.diff(w, x).subs(x, 0), θ1)  # w'(0) = θ1
eq4 = sp.Eq(sp.diff(w, x).subs(x, L), θ2)  # w'(L) = θ2

# 連立方程式を解く
sol = sp.solve([eq1, eq2, eq3, eq4], (a0, a1, a2, a3))

# たわみ曲線
w_expr = w.subs(sol)

# 結果表示
sp.pretty_print(w_expr)
```

```python
import sympy as sp

# 変数定義
x, L = sp.symbols('x L')  # 位置 x, はりの長さ L
w1, w2 = sp.symbols('w1 w2')  # 節点変位
θ1, θ2 = sp.symbols('theta1 theta2')  # 節点回転角

# 係数 a0, a1, a2, a3
a = sp.Matrix(sp.symbols('a0 a1 a2 a3'))

# たわみ関数を3次式として仮定
w = sp.Matrix([1, x, x**2, x**3]).T * a  # 行ベクトル×列ベクトルの積

# 境界条件の行列方程式を設定
eqs = sp.Matrix([
    [1,  0,   0,    0],  # x=0 における w = w1
    [0,  1,   0,    0],  # x=0 における w' = θ1
    [1,  L,  L**2, L**3],  # x=L における w = w2
    [0,  1, 2*L,  3*L**2]  # x=L における w' = θ2
])

rhs = sp.Matrix([w1, θ1, w2, θ2])  # 右辺の値

# 連立方程式を解く
sol = eqs.LUsolve(rhs)  # 行列を使って解を求める

# たわみ曲線の最終式
w_expr = sp.simplify(sp.Matrix([1, x, x**2, x**3]).T * sol)

# 結果表示
sp.pretty_print(w_expr)
```
#### 連続はり（多スパンはり）の SymPy コード（マトリックス利用）
```python
import sympy as sp

# 変数定義
x, L1, L2 = sp.symbols('x L1 L2')  # 位置 x、スパン長 L1, L2
w1, w2, w3 = sp.symbols('w1 w2 w3')  # 各節点の変位
θ1, θ2, θ3 = sp.symbols('theta1 theta2 theta3')  # 各節点の回転角

# 係数ベクトル (各スパンの3次係数)
a1 = sp.Matrix(sp.symbols('a10 a11 a12 a13'))  # スパン1の係数
a2 = sp.Matrix(sp.symbols('a20 a21 a22 a23'))  # スパン2の係数

# スパンごとのたわみ関数
w1_expr = sp.Matrix([1, x, x**2, x**3]).T * a1  # スパン1 (0 ≤ x ≤ L1)
w2_expr = sp.Matrix([1, x - L1, (x - L1)**2, (x - L1)**3]).T * a2  # スパン2 (L1 ≤ x ≤ L1+L2)

# 境界条件の行列設定（節点変位・回転条件）
eqs = sp.Matrix([
    [1, 0, 0, 0,  0, 0, 0, 0],  # w1_expr(0) = w1
    [0, 1, 0, 0,  0, 0, 0, 0],  # w1_expr'(0) = θ1
    [1, L1, L1**2, L1**3, -1, 0, 0, 0],  # w1_expr(L1) = w2 = w2_expr(L1)
    [0, 1, 2*L1, 3*L1**2,  0, -1, 0, 0],  # w1_expr'(L1) = w2_expr'(L1)
    [0, 0, 2, 6*L1,  0, 0, -2, 0],  # w1_expr''(L1) = w2_expr''(L1)
    [0, 0, 0, 6,  0, 0, 0, -6],  # w1_expr'''(L1) = w2_expr'''(L1)
    [0, 0, 0, 0,  1, L1+L2, (L1+L2)**2, (L1+L2)**3],  # w2_expr(L1+L2) = w3
    [0, 0, 0, 0,  0, 1, 2*(L1+L2), 3*(L1+L2)**2]  # w2_expr'(L1+L2) = θ3
])

rhs = sp.Matrix([w1, θ1, w2, θ2, 0, 0, w3, θ3])  # 右辺の値

# 連立方程式を解く
sol = eqs.LUsolve(rhs)

# 各スパンのたわみ曲線を求める
w1_final = sp.simplify(sp.Matrix([1, x, x**2, x**3]).T * sol[:4])  # スパン1
w2_final = sp.simplify(sp.Matrix([1, x - L1, (x - L1)**2, (x - L1)**3]).T * sol[4:])  # スパン2

# 結果表示
sp.pretty_print(w1_final)
sp.pretty_print(w2_final)
```

# Gemini先生へ

# copilot先生へ

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

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


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

#### wikipedia 
#### Qiita
#### Google検索
#### 文献