0
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?

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

Last updated at Posted at 2025-05-05

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

(再)オリジナル

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

証明コード(SymPy)

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)コード例:

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 + 数値で確認(最小トラスモデル)

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の実行環境と 参考のおすすめです。

(テンプレート)

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

wikipedia

0
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
0
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?