ChatGPT先生へ
質問の一覧
1. 平面トラスの要素方程式を教えて下さい。
2. 上記をsympy を使って導出して下さい。
3. 複数部材を組み合わせた全体剛性マトリクス組立コードも提供可能です。ご希望ですか?
4. 1. を教えて下さい。
5. 自由自由度(unknown displacement)のみに関する剛性マトリクス。の呼び名を教えて下さい。日本語と英語で教えて下さい。
6. 対応する数式・マトリクス分割法の表記や、SymPy実装での明示的な分割例もお見せできます。必要ですか?
7. 本チャット、この会話で出てきた全ての質問を、コピーできるいつもの Markdown形式 のテキストで一覧にしてください。追番も。空白行不要です。
(途中省略)
🔸 1. 要素のモデル
🔸 2. 局所座標系での要素剛性マトリクス
🔸 3. 全体座標系での要素剛性マトリクス
🔸 4. 要素方程式(剛性方程式)
🔸 5. まとめ
🔧 SymPy による平面トラス要素剛性マトリクスの導出
import sympy as sp
# --- 記号定義 ---
E, A, L = sp.symbols('E A L', positive=True) # ヤング率、断面積、部材長さ
xi, yi, xj, yj = sp.symbols('x_i y_i x_j y_j') # 節点座標
# --- 方向余弦の導出 ---
dx = xj - xi
dy = yj - yi
L_expr = sp.sqrt(dx**2 + dy**2) # 幾何学的な長さ
c = dx / L_expr
s = dy / L_expr
# --- 剛性係数スカラー部 ---
k = E * A / L_expr
# --- 全体座標系での剛性マトリクス(4x4) ---
k_global = k * sp.Matrix([
[ c*c, c*s, -c*c, -c*s],
[ c*s, s*s, -c*s, -s*s],
[-c*c, -c*s, c*c, c*s],
[-c*s, -s*s, c*s, s*s]
])
# --- 出力 ---
sp.pprint(k_global, use_unicode=True)
複数部材を組み合わせた平面トラスの全体剛性マトリクスの組立コードを、SymPy を使って導出・実装します。
✅ 前提:節点・要素の定義
節点番号と位置:
(0) (0, 0)
(1) (1, 0)
(2) (0, 1)
部材(要素):
e0:0-1
e1:1-2
e2:2-0
✅ スクリプト全体:全体剛性マトリクスの組立
import sympy as sp
# --- 記号定義 ---
E, A = sp.symbols('E A', positive=True) # ヤング率、断面積(共通とする)
# --- 節点座標 ---
nodes = {
0: (0, 0),
1: (1, 0),
2: (0, 1)
}
# --- 要素定義(節点番号のペア) ---
elements = [
(0, 1), # e0
(1, 2), # e1
(2, 0) # e2
]
# --- 自由度:各節点に x, y 方向の2自由度 → 全体自由度数 = 2 * 節点数 ---
ndof = 2 * len(nodes)
K_global = sp.zeros(ndof, ndof) # 全体剛性マトリクスの初期化
# --- 要素剛性マトリクスの関数 ---
def truss_element_stiffness(xi, yi, xj, yj):
dx = xj - xi
dy = yj - yi
L = sp.sqrt(dx**2 + dy**2)
c = dx / L
s = dy / L
k = E * A / L
k_e = k * sp.Matrix([
[ c*c, c*s, -c*c, -c*s],
[ c*s, s*s, -c*s, -s*s],
[-c*c, -c*s, c*c, c*s],
[-c*s, -s*s, c*s, s*s]
])
return k_e
# --- 各要素ごとの剛性マトリクスを全体に組み込む ---
for e in elements:
i, j = e
xi, yi = nodes[i]
xj, yj = nodes[j]
k_e = truss_element_stiffness(xi, yi, xj, yj)
# 全体剛性マトリクスの中でのインデックス
dof_map = [2*i, 2*i+1, 2*j, 2*j+1]
# 組み込み(アセンブル)
for m in range(4):
for n in range(4):
K_global[dof_map[m], dof_map[n]] += k_e[m, n]
# --- 結果出力 ---
sp.pprint(K_global, use_unicode=True)
🔎 出力されるもの
・このスクリプトを実行すると、シンボリックな全体剛性マトリクス(6×6)が出力されます。
・節点自由度順序は [u0, v0, u1, v1, u2, v2]
・各部材の寄与が適切にアセンブル(組立)されています。
節点荷重と境界条件を適用して変位を求める(線形方程式の解)
節点配置:
(2) (0,1)
| \
| \
| \
(0)---(1)
(0,0) (1,0)
部材:0-1, 1-2, 2-0
荷重:
節点2に下向き荷重 Py
拘束:
節点0: u0 = v0 = 0(完全固定)
節点1: v1 = 0(ローラー支持:水平移動のみ許容)
🧮 SymPyコード:構造解析(変位を求める)
import sympy as sp
# --- 記号定義 ---
E, A, Py = sp.symbols('E A P_y', positive=True)
u0, v0, u1, v1, u2, v2 = sp.symbols('u0 v0 u1 v1 u2 v2') # 全ての変位
# --- 節点と要素定義 ---
nodes = {
0: (0, 0),
1: (1, 0),
2: (0, 1)
}
elements = [
(0, 1),
(1, 2),
(2, 0)
]
# --- 剛性マトリクス関数 ---
def truss_element_stiffness(xi, yi, xj, yj):
dx = xj - xi
dy = yj - yi
L = sp.sqrt(dx**2 + dy**2)
c = dx / L
s = dy / L
k = E * A / L
k_e = k * sp.Matrix([
[ c*c, c*s, -c*c, -c*s],
[ c*s, s*s, -c*s, -s*s],
[-c*c, -c*s, c*c, c*s],
[-c*s, -s*s, c*s, s*s]
])
return k_e
# --- 全体剛性マトリクス ---
ndof = 2 * len(nodes)
K = sp.zeros(ndof, ndof)
for e in elements:
i, j = e
xi, yi = nodes[i]
xj, yj = nodes[j]
k_e = truss_element_stiffness(xi, yi, xj, yj)
dof_map = [2*i, 2*i+1, 2*j, 2*j+1]
for m in range(4):
for n in range(4):
K[dof_map[m], dof_map[n]] += k_e[m, n]
# --- 荷重ベクトル(節点2に Py) ---
F = sp.Matrix([0, 0, 0, 0, 0, -Py]) # [u0,v0,u1,v1,u2,v2] に対応
# --- 変位ベクトル ---
U = sp.Matrix([u0, v0, u1, v1, u2, v2])
# --- 境界条件の適用 ---
# 拘束されている自由度: u0=0, v0=0, v1=0 → インデックス 0,1,3
fixed_dofs = [0, 1, 3]
free_dofs = [i for i in range(ndof) if i not in fixed_dofs]
# --- 剛性行列・荷重ベクトルの縮小(自由な自由度のみ) ---
K_ff = K.extract(free_dofs, free_dofs)
F_f = F.extract(free_dofs, [0])
# --- 未知変位の解(自由自由度) ---
U_f = sp.Matrix(sp.symbols('u1 v2 u2')) # 対応順に注意
eqs = K_ff * U_f - F_f
solution = sp.solve(eqs, U_f)
# --- 出力 ---
for var, val in zip(U_f, [solution[s] for s in U_f]):
sp.pprint(sp.Eq(var, val))
🧮 SymPyコード:構造解析(変位を求める)
import sympy as sp
# --- 記号定義 ---
E, A, Py = sp.symbols('E A P_y', positive=True)
u0, v0, u1, v1, u2, v2 = sp.symbols('u0 v0 u1 v1 u2 v2') # 全ての変位
# --- 節点と要素定義 ---
nodes = {
0: (0, 0),
1: (1, 0),
2: (0, 1)
}
elements = [
(0, 1),
(1, 2),
(2, 0)
]
# --- 剛性マトリクス関数 ---
def truss_element_stiffness(xi, yi, xj, yj):
dx = xj - xi
dy = yj - yi
L = sp.sqrt(dx**2 + dy**2)
c = dx / L
s = dy / L
k = E * A / L
k_e = k * sp.Matrix([
[ c*c, c*s, -c*c, -c*s],
[ c*s, s*s, -c*s, -s*s],
[-c*c, -c*s, c*c, c*s],
[-c*s, -s*s, c*s, s*s]
])
return k_e
# --- 全体剛性マトリクス ---
ndof = 2 * len(nodes)
K = sp.zeros(ndof, ndof)
for e in elements:
i, j = e
xi, yi = nodes[i]
xj, yj = nodes[j]
k_e = truss_element_stiffness(xi, yi, xj, yj)
dof_map = [2*i, 2*i+1, 2*j, 2*j+1]
for m in range(4):
for n in range(4):
K[dof_map[m], dof_map[n]] += k_e[m, n]
# --- 荷重ベクトル(節点2に Py) ---
F = sp.Matrix([0, 0, 0, 0, 0, -Py]) # [u0,v0,u1,v1,u2,v2] に対応
# --- 変位ベクトル ---
U = sp.Matrix([u0, v0, u1, v1, u2, v2])
# --- 境界条件の適用 ---
# 拘束されている自由度: u0=0, v0=0, v1=0 → インデックス 0,1,3
fixed_dofs = [0, 1, 3]
free_dofs = [i for i in range(ndof) if i not in fixed_dofs]
# --- 剛性行列・荷重ベクトルの縮小(自由な自由度のみ) ---
K_ff = K.extract(free_dofs, free_dofs)
F_f = F.extract(free_dofs, [0])
# --- 未知変位の解(自由自由度) ---
U_f = sp.Matrix(sp.symbols('u1 v2 u2')) # 対応順に注意
eqs = K_ff * U_f - F_f
solution = sp.solve(eqs, U_f)
# --- 出力 ---
for var, val in zip(U_f, [solution[s] for s in U_f]):
sp.pprint(sp.Eq(var, val))
✅ 出力されるもの
u1 = ...
v2 = ...
u2 = ...
が、ヤング率 E、断面積 A、荷重 Py で表されて出力されます。
🔸 呼び名(日本語 & 英語)
用語の意味 | 日本語の呼び名 | 英語の呼び名 |
---|---|---|
自由自由度に対応する剛性マトリクス | 縮小剛性マトリクス | reduced stiffness matrix |
自由度剛性マトリクス | free DOF stiffness matrix | |
部分剛性マトリクス(自由部分) | partitioned stiffness matrix | |
自由節点剛性マトリクス | stiffness matrix for free DOFs |
🔸 一般的な使い分け
・academic / 教科書 → 「縮小剛性マトリクス」「reduced stiffness matrix」
・数値実装 / 実務 → 「自由DOF剛性行列」「free DOF stiffness matrix」
全体剛性マトリクス $\mathbf{K}$ を「自由度(free DOF)」と「拘束度(constrained DOF)」で分割して表現する方法と、それを SymPy で明示的に実装する方法 を以下に解説・提示します。
✅ 1. 理論:剛性マトリクスの分割(マトリクス分解)
...「縮小剛性マトリクス」(英語:reduced stiffness matrix)です。
✅ 2. SymPy での実装例(明示的なマトリクス分割)
✅ 出力イメージ(簡易)
K_ff = Matrix([
[K22, K24, K25],
[K42, K44, K45],
[K52, K54, K55]
])
🧠 ポイントまとめ
分割名 | 範囲 | 意味 |
---|---|---|
K_ff |
自由×自由 | 解析に使う「縮小剛性マトリクス」 |
K_fc |
自由×拘束 | 拘束変位が既知のとき使う項 |
K_cf |
拘束×自由 | 反力計算時に使う項 |
K_cc |
拘束×拘束 | 拘束節点での反力のみ計算時に使用 |