다음과 같이 이산시간(discrete-time) 차분 방정식(difference equation)으로 표현된 비선형 시스템이 있다.
\[ \mathbf{x}_{t+1} = \mathbf{f}_t (\mathbf{x}_t, \mathbf{u}_t) \tag{1} \]
여기서 아래 첨자 \( t \)는 시간스텝을 나타낸다. 일반적으로 시스템을 시변(time-varying)으로 간주하기 때문에 함수 \( \mathbf{f}_t \)에 아래 첨자로 시간 표시를 한다. 시불변 시스템일 경우에는 생략하면 된다. 상태변수는 \( \mathbf{x}_t \in \mathbb{R}^n \), 제어변수는 \( \mathbf{u}_t \in \mathbb{R}^p \)이다.
최적제어 문제는 시스템이 어떤 스칼라 목적함수를 최소화하도록 제어변수를 결정하는 문제이다. 목적함수는 상태변수와 제어변수에 관한 비용함수(cost function)로 주어지는 것이 일반적이다.
\[ J_t = \phi ( \mathbf{x}_N, N ) + \sum_{t=i}^{N-1} g_t ( \mathbf{x}_t, \mathbf{u}_t ) \tag{2} \]
여기서 \([i, N]\) 는 관심 시간 구간이다. \(\phi\) 는 최종 상태변수와 최종 시간에 부과되는 비용(cost)이고, \(g_t (\mathbf{x}_t, \mathbf{u}_t )\) 는 관심 시간 구간 전체에 부과되는 운행비용(running cost)이다. 운행비용도 시변 함수일 수 있기 때문에 아래 첨자로 시간을 표기한다.
최종 상태변수 제약조건은 최종 상태변수와 최종시간의 함수로서 다음과 같이 주어진다.
\[ \psi ( \mathbf{x}_N, N ) =0 \tag{3} \]
여기서 \(\psi \in \mathbb{R}^m\) 로서 구성요소가 \(m\) 개인 벡터이다. 상태변수의 최종값에 대한 함수가 \(\phi\) 와 \(\psi\) 등 두 개가 있는데, \(\phi\) 는 스칼라 함수로서 목적함수의 일부이므로 그 값을 작게 만드는 게 목적이 되는 것이고, \(\psi\) 는 벡터함수로서 제약조건이므로 반드시 \(0\) 으로 만들어야 한다는 점에서 차이가 있다.
최적제어는 시간 구간 \( [i,N] \)에서 목적함수를 최소화하는 최적 제어입력의 시퀀스 \( \{ \mathbf{u}_i^*, \mathbf{u}_{i+1}^*, \cdots , \mathbf{u}_{N-1}^* \} \)를 계산하는 것이다. 이 최적 제어입력의 시퀀스를 시스템에 인가하면 최적 경로 \( \mathbf{x}_t^* \)가 생성될 것이다.
목적함수는 설계자가 의도한대로 시스템을 움직이면서 의도한 성능을 발휘할 수 있도록 구성해야 한다. 최적제어란 단지 목적함수를 최소화하는 제어입력을 의미하는 것이지 시스템의 동작이 설계자가 원하는 대로 이상적으로 움직이게 한다는 뜻이 아니다. 따라서 목적함수를 최소화하면 시스템이 설계자가 원하는 대로 움직이거나 성능이 고도화되도록 잘 선정할 필요가 있다. 실제 문제에서는 여러 가지 목적함수를 바꿔가면서 최적제어를 설계하고 시뮬레이션을 통해서 설계자가 의도한 대로 시스템이 반응하는지 확인하는 작업을 반복하여 수행한다.
최적제어 문제는 제약조건이 있는 최적화 문제이므로 라그랑지 곱수(Lagrange multiplier)를 도입하여 동역학식과 제약조건을 목적함수에 포함시킨다. 라그랑지 곱수 \(λ_{t+1} \in \mathbb{R}^n\) 는 동역학 식에, \(\nu \in \mathbb{R}^m\) 는 제약조건에 연결시키면, 다음과 같이 제약조건이 없는 최적화 문제로 변환시킬 수 있다.
\[ \begin{align} J_t^\prime &= \phi (\mathbf{x}_N, N ) + \nu^T \psi(\mathbf{x}_N, N) \tag{4} \\ \\ & \ \ \ \ \ + \sum_{t=i}^{N-1} \left[ g_t ( \mathbf{x}_t, \mathbf{u}_t ) + \mathbf{\lambda}_{t+1}^T \left( \mathbf{f}_t ( \mathbf{x}_t , \mathbf{u}_t ) - \mathbf{x}_{t+1} \right) \right] \end{align} \]
여기서 동역학 제약조건(즉, 시스템 운동 모델)이 매 시간스텝마다 존재하기 때문에 라그랑지 곱수도 매 시간마다 필요하다. 라그랑지 곱수가 \( \mathbf{\lambda}_t \)가 아니라 \( \mathbf{\lambda}_{t+1} \)인 이유는 계산과 표기상의 편리함 때문이다.
변경된 목적함수 \( J_i^\prime \)를 최소화하기 위한 필요 조건은 미분(differential) \( dJ_i^\prime \)가 \( 0 \) 이 되게 하는 것이다. 초기 시간 \( i \)이 정해진 값이라고 하면, \( J_i^\prime \)는 \( \mathbf{\lambda}_t, \nu, \mathbf{x}_t, \mathbf{u}_t, N \)의 함수다. 따라서 \( dJ_i^\prime \)는 다음과 같이 계산된다.
\[ \begin{align} dJ_t^\prime & = \left( \frac{\partial \phi}{\partial \mathbf{x}_N } + \left( \frac{\partial \psi}{\partial \mathbf{x}_N} \right)^T \nu \right) ^T d \mathbf{x}_N + \left( \frac{\partial \phi}{\partial N} + \left( \frac{\partial \psi}{\partial N} \right)^T \nu \right) ^T d N + \psi^T d\nu \tag{5} \\ \\ & \ \ \ \ \ + \sum_{t=i}^{N-1} \left[ \left( \mathbf{f}_t ( \mathbf{x}_t , \mathbf{u}_t ) - \mathbf{x}_{t+1} \right) ^T d \mathbf{\lambda}_{t+1} \right] \\ \\ & \ \ \ \ \ + \sum_{t=i}^{N-1} \left[ \left( \frac{\partial g_t}{\partial \mathbf{x}_t } \right) ^T d \mathbf{x}_t + \left( \frac{\partial g_t}{\partial \mathbf{u}_t } \right)^T d \mathbf{u}_t \right] \\ \\ & \ \ \ \ \ + \sum_{t=i}^{N-1} \left[ \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{x}_t } \right) ^T \mathbf{\lambda}_{t+1} \right) ^T d \mathbf{x}_t + \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{u}_t } \right) ^T \mathbf{\lambda}_{t+1} \right) ^T d \mathbf{u}_t \right] \\ \\ & \ \ \ \ \ + \sum_{t=i}^{N-1} \left[ - \mathbf{\lambda}_{t+1}^T d \mathbf{x}_{t+1} \right] \end{align} \]
식 (5)에서 세번째 줄은 다음과 같이 바꿀 수 있다.
\[ \begin{align} & \sum_{t=i}^{N-1} \left[ \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{x}_t } \right) ^T \mathbf{\lambda}_{t+1} \right) ^T d \mathbf{x}_t + \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{u}_t } \right) ^T \mathbf{\lambda}_{t+1} \right) ^T d \mathbf{u}_t \right] \\ \\ & \ \ \ \ \ = \left( \left( \frac{\partial \mathbf{f}_i}{\partial \mathbf{x}_i } \right) ^T \mathbf{\lambda}_{i+1} \right) ^T d \mathbf{x}_i + \left( \left( \frac{\partial \mathbf{f}_i}{\partial \mathbf{u}_i } \right) ^T \mathbf{\lambda}_{i+1} \right) ^T d \mathbf{u}_i \\ \\ & \ \ \ \ \ \ \ \ \ \ \ + \sum_{t=i+1}^{N-1} \left[ \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{x}_t } \right) ^T \mathbf{\lambda}_{t+1} \right) ^T d \mathbf{x}_t + \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{u}_t } \right) ^T \mathbf{\lambda}_{t+1} \right) ^T d \mathbf{u}_t \right] \\ \\ \end{align} \]
한편, 식 (5)에서 맨 마지막 줄은 다음과 같이 바꿀 수 있으므로,
\[ \sum_{t=i}^{N-1} \left[ - \mathbf{\lambda}_{t+1}^T d \mathbf{x}_{t+1} \right] = - \mathbf{\lambda}_N^T d \mathbf{x}_N + \sum_{t=i+1}^{N-1} \left[ - \mathbf{\lambda}_t^T d \mathbf{x}_t \right] \]
식 (5)는 다음과 같이 된다.
\[ \begin{align} dJ_t^\prime & = \left( \frac{\partial \phi}{\partial \mathbf{x}_N } + \left( \frac{\partial \psi}{\partial \mathbf{x}_N} \right)^T \nu -\mathbf{\lambda}_N \right) ^T d \mathbf{x}_N \tag{8} \\ \\ & \ \ + \left( \frac{\partial \phi}{\partial N} + \left( \frac{\partial \psi}{\partial N} \right)^T \nu \right)^T d N + \psi^T d\nu \\ \\ & \ \ + \sum_{t=i}^{N-1} \left[ \left( \mathbf{f}_t ( \mathbf{x}_t , \mathbf{u}_t ) - \mathbf{x}_{t+1} \right) ^T d \mathbf{\lambda}_{t+1} \right] \\ \\ & \ \ \ \ \ + \left( \left( \frac{\partial \mathbf{f}_i}{\partial \mathbf{x}_i } \right) ^T \mathbf{\lambda}_{i+1} + \frac{\partial g_i}{\partial \mathbf{x}_i } \right) ^T d \mathbf{x}_i + \left( \left( \frac{\partial \mathbf{f}_i}{\partial \mathbf{u}_i } \right) ^T \mathbf{\lambda}_{i+1} + \frac{\partial g_i}{\partial \mathbf{u}_i } \right) ^T d \mathbf{u}_i \\ \\ & \ \ \ \ \ + \sum_{t=i+1}^{N-1} \left[ \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{x}_t } \right) ^T \mathbf{\lambda}_{t+1} + \frac{\partial g_t}{\partial \mathbf{x}_t } -\mathbf{\lambda}_t \right) ^T d \mathbf{x}_t + \left( \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{u}_t } \right) ^T \mathbf{\lambda}_{t+1} + \frac{\partial g_t}{\partial \mathbf{u}_t } \right) ^T d \mathbf{u}_t \right] \end{align} \]
따라서 \( dJ_i^\prime=0 \)이 되기 위한 조건은 다음과 같다.
\[ \begin{align} & \mathbf{x}_{t+1} = \mathbf{f}_t ( \mathbf{x}_t , \mathbf{u}_t ) \tag{9} \\ \\ & \mathbf{\lambda}_t = \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{x}_t } \right) ^T \mathbf{\lambda}_{t+1} + \frac{\partial g_t}{\partial \mathbf{x}_t } \tag{10} \\ \\ & 0 = \left( \frac{\partial \mathbf{f}_t}{\partial \mathbf{u}_t } \right) ^T \mathbf{\lambda}_{t+1} + \frac{\partial g_t}{\partial \mathbf{u}_t} \tag{11} \\ \\ & 0 = \psi (\mathbf{x}_N, N) \tag{12} \\ \\ & 0 = \left( \left( \frac{\partial \mathbf{f}_i}{\partial \mathbf{x}_i } \right) ^T \mathbf{\lambda}_{i+1} + \frac{\partial g_i}{\partial \mathbf{x}_i } \right) ^T d \mathbf{x}_i \tag{13} \\ \\ & 0 = \left( \frac{\partial \phi}{\partial \mathbf{x}_N } +\left( \frac{ \partial \psi}{(\partial \mathbf{x}_N } \right)^T \nu -\mathbf{\lambda}_N \right) ^T d \mathbf{x}_N + \left( \frac{\partial \phi}{\partial N}+ \left( \frac{\partial \psi}{ \partial N} \right)^T \nu \right)^T dN \tag{14} \end{align} \]
식 (9)는 시스템의 동역학인 상태변수 차분 방정식이고, 식 (10)은 라그랑지 곱수의 차분 방정식으로서 코스테이트(costate) 방정식이라고 한다. 식 (11)은 정정조건(stationary condition)이라고 한다. 이 식으로부터 최적 제어변수를 계산할 수 있다. 최종 상태변수 제약조건은 식 (12)에 있다.
위 식에서 주목할 점은 라그랑지 곱수에 관한 식 (10)이다. 상태변수 식 (9)가 정방향(forward) 시간 식이라면, 라그랑지 곱수 식은 시간적으로 역방향(backward) 식이다. 라그랑지 곱수도 차분 운동 방정식에 의해 결정되므로 코스테이트라고 한다. 상태변수 식은 초기 상태변수가 \( \mathbf{x}_i \)를 이용하여 시간적으로 정방향으로 진행하면서 풀어야 하는 반면, 코스테이트는 최종값 \( \mathbf{\lambda}_N \)을 이용하여 시간적으로 거슬러 올라가면서 풀어야 한다.
식 (13)과 (14)는 각각 상태변수의 최종값과 초기값에 관한 식으로서 경계조건 식이라고 한다. 보통 상태변수 초기값은 정해져 있으므로 \( d \mathbf{x}_i=0 \) 이다. 따라서 식 (13)은 무시해도 된다.
경계조건은 최종시간이 설정된(fixed) 값으로 주어지는지 아닌지, 그리고 초기 및 최종 상태변수가 설정된 값으로 주어지는지 아닌지에 따라 다양하게 적용할 수 있다. 만약 최종시간이 미리 설정된 값으로 주어진다면 위 식에서 \(dN=0\) 이 된다. 만약 상태변수의 최종값이 설정된 값(fixed state)이라면 \(d\mathbf{x}_N=0\), 계산해야 되는 값(free state)이라면 \(d\mathbf{x}_N \ne 0\) 으로 놓는다.
'유도항법제어 > 최적제어' 카테고리의 다른 글
변분법과 오일러-라그랑지 방정식 (0) | 2021.01.12 |
---|---|
변분법 (calculus of variation) (0) | 2021.01.11 |
브라키스토크론 문제와 변분법 (0) | 2021.01.08 |
[Discrete-Time] 자유최종상태 (Free-final-state) LQR (1) | 2020.10.31 |
[Discrete-Time] LQR 문제 (0) | 2020.10.31 |
댓글