本ポストはこちらの続きです。

Rで有限要素法:メッシュ生成と全体行列への組み込み
const typesetMath = (el) => { if (window.MathJax) { // MathJax Typeset window.MathJax.typeset(); } else if (window.katex...
本ポストではこちらのポストのコード中の

Rで有限要素法:片持ち梁-自由端集中荷重:たわみ量
const typesetMath = (el) => { if (window.MathJax) { // MathJax Typeset window.MathJax.typeset(); } else if (window.katex...
# ------------------------------------------------------------
# 4. 荷重と境界条件
# ------------------------------------------------------------
# 固定端(節点1, s=0): w=0, θ=0
# 自由端(最後の節点, s=l): 集中荷重 P
F[n_dof - 1] <- F[n_dof - 1] + P # 最終節点のw自由度に荷重を載荷
fixed_dofs <- c(1, 2)
free_dofs <- setdiff(seq_len(n_dof), fixed_dofs)のコード各行の意味と 荷重F およびfixed_dofs について確認します。
コード各行の解説
F[n_dof - 1] <- F[n_dof - 1] + P
# 全体荷重ベクトルFのうち、「最終節点のw(たわみ)自由度」に集中荷重Pを加える。
# 自由度の並びは[w1,θ1,w2,θ2,...]なので、最終節点(n_node番目)のwは
# 全体でn_dof-1番目(θがn_dof番目)にあたる。「上書き」ではなく「加算」にしているのは、
# 他の荷重(等分布荷重など)がすでにFに入っている場合でも、それを消さずに追加できるようにするため
fixed_dofs <- c(1, 2)
# 固定端で拘束する自由度の番号を指定する。1番目は節点1のw、2番目は節点1のθで、
# 「固定端では、たわみも傾きもゼロ」という境界条件(w1=0, θ1=0)に対応する
free_dofs <- setdiff(seq_len(n_dof), fixed_dofs)
# 全自由度の番号(1からn_dofまで)から、fixed_dofsに含まれる番号を取り除き、
# 「拘束されていない(値が未知の)自由度」の番号リストを作る。
# setdiff(A, B)は「Aの中からBに含まれる要素を除いたもの」を返す関数 F の見方
F [1] 0 0 0 0 0 0 0 0 0 0 1000 0要素数5・節点数6の設定なので、F は長さ12(節点数6×自由度2)のベクトルです。
並びは [w1, θ1, w2, θ2, w3, θ3, w4, θ4, w5, θ5, w6, θ6] に対応しています。
- 11番目の成分だけが1000:
- これは6番目の節点6(=最終節点、自由端)の自由度 \(w_6\) に、集中荷重 \(P=1000\)N が載荷されていることを表しています。
- それ以外がすべてゼロ:
- 自由端の傾き(\(\theta_6\)、12番目の成分)や、その他すべての節点には、外から直接加わる力・モーメントがないことを表しています。
F は「各自由度に、外部から直接加わっている力(またはモーメント)の大きさ」を並べたベクトルであり、今回はその中で「6番目の節点のたわみ方向に1000Nの力が加わっている」として1箇所だけが非ゼロになっている、と確認できます。
free_dofs の見方
free_dofs [1] 3 4 5 6 7 8 9 10 11 12これは、「まだ値が分かっていない(これから連立方程式を解いて求める)自由度」の番号一覧です。
- 1番と2番が含まれていない:
- 節点1(固定端)の \(w_1, \theta_1\) は、境界条件により最初から0と分かっているため、「解くべき未知数」から除外されています。
- 3番から12番まで:
- 節点2〜6(\(w_2,\theta_2,\dots,w_6,\theta_6\))の、合計10個の自由度が「未知数」として残っており、この後
solve(K[free_dofs, free_dofs], F[free_dofs])によって、これら10個の値がまとめて計算されることになります。
- 節点2〜6(\(w_2,\theta_2,\dots,w_6,\theta_6\))の、合計10個の自由度が「未知数」として残っており、この後
つまり free_dofs は、「全体の連立方程式(12元)から、境界条件によってすでに値の分かっている2つの自由度を除いた、実際に解くべき10元の連立方程式がどの自由度に対応するか」を示すリストです。
以上です。
