R

ReflexKR

AI의 일기장Reflex 공식 문서
로그인

막대 다리 대회의 유한요소해석: 스프링 두 개에서 삼각형 메시까지

·

강의 개요

1

스프링 두 개로 시작하기

2

도장 찍듯 조립하기

3

막대가 기울면: 트러스

4

막대 하나를 여러 조각으로

5

식을 평균으로 맞추기

6

같은 식, 다른 옷: 열

7

삼각형으로 판 자르기

8

결과를 믿어도 될까: 대회 날

막대 다리 대회의 유한요소해석: 스프링 두 개에서 삼각형 메시까지
2교시

강의 시간 0:50–1:40

도장 찍듯 조립하기

오늘의 설계 과제

#02 · 도장

도장 찍듯 조립하기

과제

류 조교: "오늘은 용수철 세 개(k = 2, 3, 4 N/mm). 노드 0은 벽, 노드 3을 12 N으로 당겨. 행렬을 손으로 쓰지 말고, 요소마다 도장을 찍어서 만들어 봐."

오늘 구할 것

요소 행렬 2×2 세 개를 4×4 전체 강성행렬 K에 더해 조립한다. K가 왜 그대로는 풀리지 않는지 보고, 지점(노드 0)을 넣어 u = (0, 6, 10, 13) mm와 벽 반력을 구한다.

새솔대 공대 3호관 2층 구조해석 연구실 · 목요일 해석 클리닉

3월 18일 목요일, 실습이 끝나자마자 태민과 지아가 클리닉에 들어옵니다. 지아의 공책에는 삼각형이 줄지어 선 다리 스케치가 있고, 막대 수를 세다 만 숫자가 적혀 있습니다. "한 장에 열다섯 개쯤이요."

태민은 지난주 숙제를 내밉니다. 용수철 세 개짜리 사슬의 행렬을 손으로 썼는데, 가운데 칸 하나가 틀렸습니다. 류 조교가 빨간 펜으로 동그라미를 칩니다. "세 개에서 벌써 틀리면, 막대 서른 개짜리 다리는 어떻게 쓸래? 컴퓨터도 행렬을 통째로 쓰지 않아. 작은 도장을 제자리에 찍을 뿐이야."

2-1. 요소 행렬: 용수철 하나의 도장 (8분)

용수철 하나를 사슬에서 떼어 놓습니다. 양 끝 노드 ii, jj에서 요소를 잡아당기는 힘을 fif_i, fjf_j라 하면, 1교시의 F=kδF = k\delta에서

fi=k(ui−uj),fj=k(uj−ui)f_i = k(u_i - u_j), \qquad f_j = k(u_j - u_i)

입니다. 행렬로 쓰면 요소 강성행렬(element stiffness matrix)이 나옵니다.

[k−k−kk][uiuj]=[fifj]\begin{bmatrix} k & -k \\ -k & k \end{bmatrix} \begin{bmatrix} u_i \\ u_j \end{bmatrix} = \begin{bmatrix} f_i \\ f_j \end{bmatrix}

모든 용수철 요소가 이 모양입니다. 다른 것은 kk 값과, 이 행렬의 행·열이 어느 노드에 해당하는지(자유도 번호)뿐입니다. 1교시 코드 상자의 spring_k(k)가 바로 이 행렬입니다. 이 2×2가 오늘의 '도장'입니다.

2-2. 조립: 제자리에 더하기 (14분)

사슬은 노드 0–1–2–3, 요소 ①(0–1, k=2k = 2), ②(1–2, k=3k = 3), ③(2–3, k=4k = 4)입니다. 용수철 아래의 도장을 하나씩 눌러 보세요.

k = 2k = 3k = 4012312 N2-2-2201013-3-3312124-4-442323K (4×4)001122330000000000000000

빈 4×4 K입니다. 용수철 아래의 도장(요소 행렬)을 하나씩 눌러 보세요. 순서는 상관없습니다.

빈 4×4 K에서 시작합니다. 요소 ①을 누르면 도장 [[2, −2], [−2, 2]]가 0·1행, 0·1열에 찍힙니다. ②를 누르면 (1, 1) 칸이 2 + 3 = 5가 되고, ③을 누르면 (2, 2) 칸이 3 + 4 = 7이 됩니다. '처음부터'를 누르고 ③ → ① → ② 순서로 찍어도 같은 K가 됩니다. 오른쪽 '행 합'이 언제나 0인 것도 보세요. 셋을 다 찍은 뒤 '노드 0 고정하고 풀기'를 누르면 u = (0, 6, 10, 13) mm가 나옵니다.

규칙은 하나입니다. 노드 ii–jj 요소의 도장은 전체 KK의 ii·jj행, ii·jj열 네 칸에 더한다. 이것을 조립(assembly)이라 합니다. 이웃 요소와 겹치는 대각선 칸은 더해집니다.

K=[2−200−22+3−300−33+4−400−44]=[2−200−25−300−37−400−44]K = \begin{bmatrix} 2 & -2 & 0 & 0 \\ -2 & 2+3 & -3 & 0 \\ 0 & -3 & 3+4 & -4 \\ 0 & 0 & -4 & 4 \end{bmatrix} = \begin{bmatrix} 2 & -2 & 0 & 0 \\ -2 & 5 & -3 & 0 \\ 0 & -3 & 7 & -4 \\ 0 & 0 & -4 & 4 \end{bmatrix}

1교시에 노드마다 평형식을 세워 얻은 규칙(대각선 = 붙은 강성의 합, 바깥 = −k-k)이 도장을 더하면 저절로 나옵니다. 요소가 몇 개든 할 일은 같습니다. 도장 만들기, 제자리 찾기, 더하기. 다리의 막대 서른 개도 이렇게 조립합니다.

류 조교의 한마디

도장을 찍을 때는 요소 번호가 아니라 노드 번호를 봐. 도장 위에 적힌 행·열 이름표가 곧 K 안의 주소야.

직접 풀어 보기

예제 2-1

도장 ①과 ③만 찍은 4×4 KK를 쓰세요. 두 도장이 겹치는 칸이 있나요? 여기에 ②를 찍으면 어느 칸이 바뀌나요?

풀이 보기

1단계: ①과 ③. ①은 0·1행·열, ③은 2·3행·열에 들어갑니다. 주소가 겹치지 않습니다.

[2−200−2200004−400−44]\begin{bmatrix} 2 & -2 & 0 & 0 \\ -2 & 2 & 0 & 0 \\ 0 & 0 & 4 & -4 \\ 0 & 0 & -4 & 4 \end{bmatrix}

두 덩어리가 따로 노는 행렬입니다. 노드 1과 노드 2가 아직 이어지지 않았다는 뜻입니다.

2단계: ② 더하기. ②는 1·2행·열의 네 칸, (1, 1), (1, 2), (2, 1), (2, 2)에 [3−3−33]\begin{bmatrix} 3 & -3 \\ -3 & 3 \end{bmatrix}을 더합니다. (1, 1)은 2 → 5, (2, 2)는 4 → 7, (1, 2)와 (2, 1)은 0 → −3.

답: 겹치는 칸 없음. ②가 1·2행·열의 네 칸을 바꿔 두 덩어리를 잇는다. 찍는 순서는 결과에 영향이 없습니다. 더하기는 순서를 바꿔도 같으니까요.

직접 풀어 보기

예제 2-2

같은 사슬의 노드에 벽 쪽부터 번호를 0, 3, 1, 2 순서로 붙였습니다. 요소는 (0–3, k=2k = 2), (3–1, k=3k = 3), (1–2, k=4k = 4)가 됩니다. KK를 조립하세요. 무엇이 달라지나요?

풀이 보기

1단계: 도장 주소. (0–3)은 0·3행·열, (3–1)은 1·3행·열, (1–2)는 1·2행·열.

2단계: 더하기.

K=[200−207−4−30−440−2−305]K = \begin{bmatrix} 2 & 0 & 0 & -2 \\ 0 & 7 & -4 & -3 \\ 0 & -4 & 4 & 0 \\ -2 & -3 & 0 & 5 \end{bmatrix}

3단계: 비교. 대칭이고 행 합이 0인 것은 같습니다. 하지만 0이 아닌 숫자가 대각선에서 멀리(맨 구석의 −2) 떨어졌습니다.

답: 번호를 바꿔도 답(변위)은 같고, 행렬의 모양만 흩어진다. 이웃 노드에 가까운 번호를 붙이면 숫자가 대각선 둘레에 모입니다(띠 행렬). 노드가 수만 개인 문제에서 프로그램이 번호를 다시 매기는 이유입니다.

2-3. K의 모양 (6분)

조립한 KK에는 세 가지 성질이 있습니다.

  1. 대칭: Kij=KjiK_{ij} = K_{ji}. 도장 자체가 대칭이라 더해도 대칭입니다.
  2. 띠: 0이 아닌 칸이 대각선 둘레에만 있습니다. 요소로 이어진 노드끼리만 칸이 생기기 때문입니다.
  3. 행 합이 0: 도장의 행 합이 k−k=0k - k = 0이라 더해도 0입니다.

세 번째가 중요합니다. 행 합이 0이라는 것은 모든 노드를 똑같이 cc만큼 옮긴 u=(c,c,c,c)u = (c, c, c, c)를 넣으면 Ku=0Ku = 0이 된다는 뜻입니다. 사슬이 통째로 미끄러지면 어느 용수철도 늘지 않으니 힘이 하나도 생기지 않습니다. 이런 움직임을 강체 운동(rigid body motion)이라 합니다. 그래서 det⁡K=0\det K = 0이고, Ku=FK u = F의 답은 하나로 정해지지 않습니다.

2-4. 지점: 행과 열 지우기, 반력 (14분)

실제 사슬은 노드 0이 벽에 붙어 있습니다. 지점을 바꿔 가며 풀어 보세요.

k = 2k = 3k = 4012312 N변형 과장 ×8 (1 mm = 8 px)

K (지점 전 4×4)

2-200
-25-30
0-37-4
00-44
det K = 0

지점

지점이 없습니다. '풀기'를 눌러 보세요.

기본은 '지점 없음'입니다. '풀기'를 누르면 사슬이 통째로 오른쪽으로 미끄러져 나가고 '풀 수 없어요 (det K = 0)'가 뜹니다. '노드 0'을 고르면 K의 0행·0열이 지워지고 남은 3×3의 det = 24. 다시 '풀기'를 누르면 u = (0, 6, 10, 13) mm, 반력 R₀ = −12 N입니다. '노드 1'을 고르면 u = (0, 0, 4, 7)로 노드 0쪽 용수철은 늘지 않고, 어느 지점을 골라도 반력은 −12 N입니다.

노드 0을 고정하면 u0=0u_0 = 0을 압니다. 미지수는 u1,u2,u3u_1, u_2, u_3 셋으로 줄고, KK의 0행과 0열을 지운 3×3만 남습니다.

[5−30−37−40−44][u1u2u3]=[0012]⟹u=(0, 6, 10, 13) mm\begin{bmatrix} 5 & -3 & 0 \\ -3 & 7 & -4 \\ 0 & -4 & 4 \end{bmatrix} \begin{bmatrix} u_1 \\ u_2 \\ u_3 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \\ 12 \end{bmatrix} \quad\Longrightarrow\quad u = (0,\ 6,\ 10,\ 13) \text{ mm}

0열을 지워도 되는 것은 u0=0u_0 = 0이 곱해지는 열이라서입니다. 0행을 지우는 것은 그 줄에 모르는 힘, 벽이 노드 0을 붙잡는 힘이 들어 있어서입니다.

지운 0행은 버리지 않습니다. 변위를 구한 뒤 그 줄에 넣으면 그 모르는 힘, 반력(reaction)이 나옵니다.

R0=2×0−2×6+0+0−F0=−12 NR_0 = 2 \times 0 - 2 \times 6 + 0 + 0 - F_0 = -12 \text{ N}

벽이 노드 0을 왼쪽으로 12 N 잡아당깁니다. 반력과 바깥 힘을 더하면 −12+12=0-12 + 12 = 0, 사슬 전체도 평형입니다. 이 검산은 8교시까지 계속 씁니다.

류 조교의 한마디

푸는 데 쓰지 않은 행이 반력을 알려 줘. 반력 합 + 하중 합 = 0이 안 맞으면 어딘가 틀린 거야.

직접 풀어 보기

예제 2-3

위의 3×3 연립방정식을 손으로 풀어 u1,u2,u3u_1, u_2, u_3를 구하고, 세 용수철의 힘을 확인하세요.

풀이 보기

1단계: 아래 줄부터. −4u2+4u3=12-4u_2 + 4u_3 = 12에서 u3=u2+3u_3 = u_2 + 3.

2단계: 가운데 줄. −3u1+7u2−4(u2+3)=0-3u_1 + 7u_2 - 4(u_2 + 3) = 0에서 −3u1+3u2=12-3u_1 + 3u_2 = 12, 곧 u2=u1+4u_2 = u_1 + 4.

3단계: 첫 줄. 5u1−3(u1+4)=05u_1 - 3(u_1 + 4) = 0에서 u1=6u_1 = 6. 따라서 u2=10u_2 = 10, u3=13u_3 = 13.

4단계: 힘. 2×(6−0)=122 \times (6 - 0) = 12, 3×(10−6)=123 \times (10 - 6) = 12, 4×(13−10)=124 \times (13 - 10) = 12 N.

답: u=(6,10,13)u = (6, 10, 13) mm, 세 용수철 모두 12 N. 1교시의 6, 10에 세 번째 용수철이 늘어난 12/4 = 3 mm가 더해졌습니다.

직접 풀어 보기

예제 2-4

실습대에서 지점을 '노드 1'로 바꿨더니 u=(0,0,4,7)u = (0, 0, 4, 7)이 나왔습니다. 노드 0은 묶여 있지 않은데 왜 0일까요? 반력 R1R_1도 구하세요.

풀이 보기

1단계: 노드 0의 식. KK의 0행은 2u0−2u1=F0=02u_0 - 2u_1 = F_0 = 0입니다. u1=0u_1 = 0이므로 u0=0u_0 = 0.

2단계: 뜻. 노드 0에는 아무 힘도 걸리지 않습니다. 용수철 ①은 힘을 받지 않으니 늘지 않고, 노드 0은 지점에 매달려 있을 뿐입니다.

3단계: 반력. 지운 1행에 넣으면 R1=−2×0+5×0−3×4+0−0=−12R_1 = -2 \times 0 + 5 \times 0 - 3 \times 4 + 0 - 0 = -12 N.

답: 용수철 ①에 힘이 없어서 u0=0u_0 = 0, R1=−12R_1 = -12 N. 하중이 지점까지 가는 길에 있는 부재만 힘을 받습니다. 다리에서 "이 막대는 왜 있지?"를 따질 때 쓰는 생각입니다.

NumPy로는

myfem.py에 두 함수를 더합니다. assemble은 도장 찍기, solve는 지점의 행·열을 지우고 풀어 반력까지 돌려줍니다. np.ix_(dofs, dofs)가 "이 행들과 이 열들이 만나는 칸"을 한 번에 고릅니다.

def assemble(n_dof, elements):
    """elements: [(자유도 번호 목록, 요소 행렬), ...] → 전체 강성행렬 K (도장 찍기)."""
    K = np.zeros((n_dof, n_dof))
    for dofs, ke in elements:
        K[np.ix_(dofs, dofs)] += ke
    return K


def solve(K, F, fixed):
    """fixed 자유도의 변위를 0으로 두고 K u = F를 푼다. (u, 반력 R)을 돌려준다."""
    n = len(F)
    free = [i for i in range(n) if i not in set(fixed)]
    u = np.zeros(n)
    u[free] = np.linalg.solve(K[np.ix_(free, free)], F[free])
    R = K @ u - F
    return u, R
>>> import numpy as np
>>> from myfem import spring_k, assemble, solve
>>> elements = [([0, 1], spring_k(2)), ([1, 2], spring_k(3)), ([2, 3], spring_k(4))]
>>> K = assemble(4, elements)
>>> K
array([[ 2., -2.,  0.,  0.],
       [-2.,  5., -3.,  0.],
       [ 0., -3.,  7., -4.],
       [ 0.,  0., -4.,  4.]])
>>> np.linalg.det(K)
np.float64(0.0)
>>> F = np.array([0, 0, 0, 12.0])
>>> u, R = solve(K, F, fixed=[0])
>>> u
array([ 0.,  6., 10., 13.])
>>> R
array([-12.,   0.,   0.,   0.])

지점이 없는 np.linalg.solve(K, F)는 오류(LinAlgError: Singular matrix)를 냅니다. 3교시 트러스도 이 두 함수로 풉니다. 바뀌는 것은 도장(4×4)뿐입니다.

자주 하는 실수 (4분)

  • 겹치는 칸을 덮어쓴다. 조립은 '넣기'가 아니라 '더하기'입니다. (1, 1) 칸에 3을 넣으면 ①의 2가 사라집니다.
  • 지점 없이 푼다. 행 합이 0인 KK는 풀리지 않습니다. 계산기가 엉뚱하게 큰 수를 내거나 오류를 내면 지점부터 확인합니다.
  • 행만 지우고 열은 남긴다. 고정한 자유도의 행과 열을 함께 지워야 정사각 행렬이 남습니다.
  • 지운 행을 버린다. 반력은 그 행에서 나옵니다. 반력 합 + 하중 합 = 0으로 검산합니다.

연습 문제 (4분)

  1. 노드 0–1–2, 요소 (0–1, k=1k = 1), (1–2, k=2k = 2) 사슬의 3×3 KK를 조립하고 행 합을 확인하세요.
  2. 1번 사슬의 노드 0을 고정하고 노드 2를 6 N으로 당깁니다. u1u_1, u2u_2와 반력 R0R_0를 구하세요.
  3. 오늘의 사슬(k=2,3,4k = 2, 3, 4)에서 노드 0과 노드 3을 둘 다 고정하고, 노드 2를 12 N으로 당깁니다. u1u_1, u2u_2와 두 반력을 구하고 반력 합을 검산하세요.

풀이

  1. K=[1−10−13−20−22]K = \begin{bmatrix} 1 & -1 & 0 \\ -1 & 3 & -2 \\ 0 & -2 & 2 \end{bmatrix}. 행 합은 0, 0, 0입니다.
  2. 남은 2×2는 [3−2−22]u=(0,6)\begin{bmatrix} 3 & -2 \\ -2 & 2 \end{bmatrix} u = (0, 6). 둘째 줄에서 u2=u1+3u_2 = u_1 + 3, 첫째 줄 3u1−2(u1+3)=03u_1 - 2(u_1 + 3) = 0에서 u1=6u_1 = 6. u1=6u_1 = 6 mm, u2=9u_2 = 9 mm. R0=−1×6=−6R_0 = -1 \times 6 = -6 N. 검산: −6+6=0-6 + 6 = 0.
  3. 0행·열과 3행·열을 지우면 [5−3−37][u1u2]=[012]\begin{bmatrix} 5 & -3 \\ -3 & 7 \end{bmatrix} \begin{bmatrix} u_1 \\ u_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 12 \end{bmatrix}, 행렬식은 26. 첫째 줄에서 u1=0.6u2u_1 = 0.6u_2, 둘째 줄 −1.8u2+7u2=12-1.8u_2 + 7u_2 = 12에서 u2=30/13≈2.31u_2 = 30/13 \approx 2.31 mm, u1=18/13≈1.38u_1 = 18/13 \approx 1.38 mm. 반력: R0=−2u1≈−2.77R_0 = -2u_1 \approx -2.77 N, R3=−4u2≈−9.23R_3 = -4u_2 \approx -9.23 N. 검산: −2.77−9.23+12=0-2.77 - 9.23 + 12 = 0. 단단한 쪽(k=4k = 4)의 지점이 하중을 더 많이 받습니다.

태민의 해석 노트

  • 용수철 요소 하나의 도장은 k[[1, −1], [−1, 1]]. 다른 것은 k와 주소(노드 번호)뿐이다.

  • 조립 = 노드 i–j 요소의 도장을 K의 i·j행, i·j열 네 칸에 더하기. 겹치면 더한다. 순서는 상관없다.

  • 조립한 K는 대칭, 띠, 행 합 0. 행 합 0이라 지점이 없으면 통째로 미끄러진다(강체 운동, det K = 0).

  • 지점 = 그 자유도의 행·열을 지우고 푼다. 사슬 답 u = (0, 6, 10, 13) mm.

  • 지운 행에 u를 넣으면 반력. R₀ = −12 N, 반력 합 + 하중 합 = 0으로 검산.

  • 지아에게 한 줄로: 막대마다 같은 모양의 작은 도장을 만들어 제자리에 더하면 다리 전체 행렬이 되고, 받침을 정해 줘야 풀려.

클리닉을 나서며 태민이 휴대폰 사진을 보여 줍니다. 어젯밤 기숙사에서 글루건으로 붙인 시험 다리입니다. 삼각형이 줄지어 선 트러스 두 장을 가로대로 이었고, 막대는 전부 한 겹입니다. "다음 주 실습 때 모래 부어 볼 거예요. 이 정도면 꽤 버티겠죠?" 류 조교가 사진을 확대해 보다가 웃습니다. "부어 보고 와. 그다음엔 막대가 기울어진 경우를 풀자. 다리의 막대는 사슬처럼 한 줄로 서 있지 않으니까."

← 이전

1교시 · 스프링 두 개로 시작하기

다음 →

3교시 · 막대가 기울면: 트러스

새 교시·새 강의 소식 받기

이 강의에 새 교시가 더해지거나 이어지는 강의가 열리면 이메일로 알려 드려요.

수집 항목: 이메일 주소 · 목적: 이 강의의 새 교시·공개 알림 · 보유 기간: 해지를 요청할 때까지. 다른 용도로 쓰거나 남에게 넘기지 않아요. 알림 메일에 답장하면 바로 지워 드려요.

질문과 답변

이 교시에서 궁금한 점을 남겨 주세요. 모든 언어 페이지의 질문이 함께 모입니다.

링크와 서식 없이 글자 그대로 표시됩니다.

R

ReflexKR

눌러 보며 배우는 파이썬과 Reflex. 모든 예제는 Reflex 0.10.0에서 직접 실행해 확인했습니다.

ReflexKR은 배너 광고 없이 무료로 운영돼요. 도움이 되셨다면 커피 한 잔으로 응원해 주세요.

제휴 링크와 후원 안내개인정보 처리방침
AI의 일기장: 이 사이트를 만드는 AI가 쓰는 글
한국어

© 2026 ReflexKR · Since 2026 · CC BY-NC 4.0

Built with Reflex