・私のこんなアバウトな質問にも、丁寧に回答をいただきました。ありがとうございます。
# 質問リスト
1. はり上に中間荷重がないときのはりの微分方程式から、節点変位であらわしたたわみ曲線を導出して下さい。
2. 上記をsympy のソースコードで教えて下さい。
3. 上記をsympyのマトリックスを使ったソースコードで教えて下さい。
4. 上記のマトリックスを使って、連続はりのsympy のソースコードを教えて下さい。
ChatGPT先生へ
ChatGPT の回答は必ずしも正しいとは限りません。重要な情報は確認するようにしてください。
回答抜粋
・以下、私は実行していません。
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)
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 コード(マトリックス利用)
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の実行環境と 参考のおすすめです。