・最初から、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) です。
この定理は次のように述べられます:
「ある力系が生じさせる変位に対して別の力系が行う仕事は、逆の配置での仕事と等しい」
証明コード(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の実行環境と 参考のおすすめです。