(再)以下おすすめです。
https://qiita.com/mrrclb48z/items/369b66044a32fdc3c8ee#sympy%E3%81%A7bettis-theorem%E3%81%A7
AI先生の回答が、突き出しはりになっているのか、私はわかりませんでした。
いい質問内容があれば、アドバイスをいただけると幸いです。
・Gemini先生への、私の質問の仕方が悪いかも。設定を変更されました。
・ChatGPT先生は、1回? で回答をもらえました。
オリジナル
(再。最終行を追加。)
材料力学の問題なのですが・・・
問題:一端固定、他端移動支持の突き出しはりの自由端Bに集中荷重Pが作用している。
このとき、反力RA、RCおよび反モーメントMAを求めよ。また、自由端におけるたわみを求めよ。ただし、
はりの縦弾性係数をE、断面二次モーメントをIとする。
マクスウェルの相反定理を使ったsympyのコードを教えて下さい。
(再。画像)
Gemini先生へ。
(回答抜粋)
この問題は、マクスウェルの相反定理を用いるよりも、通常の解法(力の釣り合い、モーメントの釣り合い、たわみ角の連続条件などを用いる方法)の方がsympyでの実装が容易です。...
- 通常の解法に基づくsympyコード...
- マクスウェルの相反定理の概念...
- まとめ
この問題に対しては、上記のsympyコードのような通常の解法を用いるのが適切です。相反定理は、概念を理解しておくことは重要ですが、この問題の直接的な解決にはつながりません。
そこのところ、マクスウェルの相反定理を使ったsympyのコードを教えて下さい。
前回の回答で述べたように、...
そのため、前回の回答で示したように、曲げモーメントの式から直接微分方程式を解き、境界条件を適用する通常の方法の方が、sympyでの実装が容易で、計算も効率的です。
このコードでは、両端支持梁の集中荷重によるたわみ公式を用いています。
??? (再)私の質問の仕方が悪いかも。設定を変更されました。
import sympy
# 記号の定義
E, I, L, P, x, a = sympy.symbols('E I L P x a')
# たわみ曲線の一般式(両端支持梁、集中荷重)
def deflection(P, a, x, L, E, I):
if x <= a:
v = P*x*(L**2 - a**2 - x**2) / (6*E*I*L)
else:
v = P*a*(L**2 - x**2 - a**2) / (6*E*I*L)
return v
# 荷重位置a=L/2の場合の中央(x=L/2)のたわみ
v1 = deflection(P, L/2, L/2, L, E, I)
# 荷重位置a=L/4の場合のx=L/2でのたわみ
v2 = deflection(P, L/4, L/2, L, E, I)
# 荷重位置a=L/2の場合のx=L/4でのたわみ
v3 = deflection(P, L/2, L/4, L, E, I)
# 相反定理の確認
print("v2 =", v2)
print("v3 =", v3)
print("v2-v3=",sympy.simplify(v2-v3))
print("v2 == v3:", sympy.simplify(v2) == sympy.simplify(v3)) # Trueとなるはず
#荷重位置a=L/4の場合のx=L/4でのたわみ
v4=deflection(P,L/4,L/4,L,E,I)
#荷重位置a=L/2の場合のx=L/2でのたわみ
v5=deflection(P,L/2,L/2,L,E,I)
print("v4 =", v4)
print("v5 =", v5)
print("v4-v5=",sympy.simplify(v4-v5))
print("v4 == v5:", sympy.simplify(v4) == sympy.simplify(v5)) # Falseとなるはず
ChatGPT先生へ。
(回答抜粋)
...以下に、SymPyを用いて解を求めるコードを記載します。
from sympy import symbols, Function, diff, integrate, solve, Eq
# 定数と変数の定義
x = symbols('x') # ビーム上の位置
L, P, E, I = symbols('L P E I', positive=True) # 長さ、荷重、縦弾性係数、断面二次モーメント
RA, RC, MA = symbols('RA RC MA') # 反力と反モーメント
v = Function('v')(x) # たわみ
# 支持条件
# 一端固定 (x = 0): v = 0, θ = 0
# 他端移動支持 (x = L): v = 0
# 荷重のモーメント方程式
moment_eq = Eq(MA + RA*x - RC*(x - L) - P*L, 0)
# 力の釣り合い
force_eq = Eq(RA + RC - P, 0)
# 反力および反モーメントの計算
solutions = solve([moment_eq, force_eq], [RA, RC, MA])
RA_val, RC_val, MA_val = solutions[RA], solutions[RC], solutions[MA]
# たわみ微分方程式: E * I * v''(x) = M(x)
M_x = MA_val + RA_val*x - RC_val*(x - L) - P*L
v_eq = Eq(E * I * diff(v, x, 2), M_x)
# 一回積分 (曲げ角度 θ)
theta = integrate(M_x / (E * I), x) + symbols('C1')
# 二回積分 (たわみ v)
v_displacement = integrate(theta, x) + symbols('C2')
# 境界条件を適用
# 一端固定 (x = 0): v(0) = 0, θ(0) = 0
C1, C2 = symbols('C1 C2')
boundary_conditions = [
Eq(v_displacement.subs(x, 0), 0),
Eq(theta.subs(x, 0), 0)
]
C_values = solve(boundary_conditions, [C1, C2])
# たわみ式に定数を代入
v_displacement = v_displacement.subs(C_values)
# 自由端におけるたわみ (x = L)
deflection_at_B = v_displacement.subs(x, L)
# 結果出力
print("反力 RA:", RA_val)
print("反力 RC:", RC_val)
print("反モーメント MA:", MA_val)
print("自由端におけるたわみ v(L):", deflection_at_B)
SymPyコードが突き出しはりになっていますか
from sympy import symbols, Function, diff, integrate, solve, Eq
# 定数と変数の定義
x = symbols('x') # ビーム上の位置
L, P, E, I = symbols('L P E I', positive=True) # 長さ、荷重、縦弾性係数、断面二次モーメント
RA, RC, MA = symbols('RA RC MA') # 反力と反モーメント
v = Function('v')(x) # たわみ
# 支持条件
# 固定端 (x = 0): v(0) = 0, θ(0) = 0
# 自由端 (x = L): v(L) = 0
# モーメント方程式
moment_eq = Eq(MA + RA*x - P*(x - L), 0)
# 力の釣り合い
force_eq = Eq(RA - P, 0)
# 反力および反モーメントの計算
solutions = solve([moment_eq, force_eq], [RA, MA])
RA_val, MA_val = solutions[RA], solutions[MA]
# たわみ微分方程式: E * I * v''(x) = M(x)
M_x = MA_val + RA_val*x - P*(x - L)
v_eq = Eq(E * I * diff(v, x, 2), M_x)
# 一回積分 (曲げ角度 θ)
theta = integrate(M_x / (E * I), x) + symbols('C1')
# 二回積分 (たわみ v)
v_displacement = integrate(theta, x) + symbols('C2')
# 境界条件を適用
# 固定端 (x = 0): v(0) = 0, θ(0) = 0
C1, C2 = symbols('C1 C2')
boundary_conditions = [
Eq(v_displacement.subs(x, 0), 0),
Eq(theta.subs(x, 0), 0)
]
C_values = solve(boundary_conditions, [C1, C2])
# たわみ式に定数を代入
v_displacement = v_displacement.subs(C_values)
# 自由端におけるたわみ (x = L)
deflection_at_B = v_displacement.subs(x, L)
# 結果出力
print("反力 RA:", RA_val)
print("反モーメント MA:", MA_val)
print("自由端におけるたわみ v(L):", deflection_at_B)
あきらめました。
いつもの? sympyの実行環境と 参考のおすすめです。
(テンプレート) 開発環境
いつもと違うおすすめです。