26.4 형상·설계 최적화와 역설계

실습 · 연습문제 1개

열전도 설계의 adjoint 기울기 adjoint-gradient

길이가 같은 요소 nn개로 나눈 1차원 막대의 정상 열전도를 1차 유한요소로 푼다. 요소 ee의 열전도도 kek_e가 설계 변수다. 왼쪽 끝 절점의 온도는 0으로 고정하고, 나머지 절점 1,…,n1, \dots, n의 온도 T∈Rn\mathbf{T} \in \mathbb{R}^n은

K(k) T=f\mathbf{K}(\mathbf{k})\,\mathbf{T} = \mathbf{f}

를 푼다. K\mathbf{K}는 요소 행렬 keh[1−1−11]\frac{k_e}{h}\begin{bmatrix}1 & -1\\ -1 & 1\end{bmatrix}를 절점 (e,e+1)(e, e+1) 자리에 더해 만든 행렬에서 고정 절점 0의 행과 열을 뺀 n×nn \times n 행렬이다(hh는 요소 길이). 목적함수는 절점 온도의 가중합 J=c⊤TJ = \mathbf{c}^\top\mathbf{T}다.

함수 adjoint_gradient(k, f, c, h)를 완성해 (J, grad)를 반환한다. grad[e]는 ∂J/∂ke\partial J/\partial k_e다.

adjoint 방법은 다음과 같다.

  1. KT=f\mathbf{K}\mathbf{T} = \mathbf{f}를 푼다.
  2. K⊤λ=c\mathbf{K}^\top\boldsymbol{\lambda} = \mathbf{c}를 푼다(adjoint 해석).
  3. ∂J∂ke=−λ⊤∂K∂keT\dfrac{\partial J}{\partial k_e} = -\boldsymbol{\lambda}^\top \dfrac{\partial \mathbf{K}}{\partial k_e}\mathbf{T}. 고정 절점의 값을 0으로 붙인 T~=(0,T)\tilde{\mathbf{T}} = (0, \mathbf{T}), λ~=(0,λ)\tilde{\boldsymbol{\lambda}} = (0, \boldsymbol{\lambda})를 쓰면 −1h(λ~e+1−λ~e)(T~e+1−T~e)-\dfrac{1}{h}(\tilde\lambda_{e+1} - \tilde\lambda_e)(\tilde T_{e+1} - \tilde T_e)이다.

테스트는 다음을 확인한다.

  • 기울기가 유한차분과 맞는다(여러 c\mathbf{c}에 대해).
  • c=f\mathbf{c} = \mathbf{f}(열 compliance)이면 λ=T\boldsymbol{\lambda} = \mathbf{T}이므로 모든 성분이 0 이하다. 어느 요소의 전도도를 올려도 compliance가 줄어든다.
  • 설계 변수가 200개여도 선형계 풀이(np.linalg.solve) 호출이 3회 이하다. 유한차분은 201회가 필요하다.

힌트: K\mathbf{K}의 대각 원소는 (ke+ke+1)/h(k_e + k_{e+1})/h(마지막 절점은 kn/hk_n/h), 위·아래 대각 원소는 −ke+1/h-k_{e+1}/h다(절점 번호 기준으로 맞춰 본다). np.linalg.solve를 두 번만 쓴다.