1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

材料力学「一端固定、他端移動支持の突き出しはりの自由端Bに集中荷重P」(3/3) マクスウェルの相反定理をAI先生に聞きました。

Last updated at Posted at 2024-12-19

(再)以下おすすめです。
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での実装が容易です。...

  1. 通常の解法に基づくsympyコード...
  2. マクスウェルの相反定理の概念...
  3. まとめ
    この問題に対しては、上記の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の実行環境と 参考のおすすめです。

(テンプレート)  開発環境

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

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?