본문 바로가기
유도항법제어/최적제어

[Discrete-Time] 최적제어 문제

by 세인트워터멜론 2020. 10. 27.

다음과 같이 이산시간(discrete-time) 차분 방정식(difference equation)으로 표현된 비선형 시스템이 있다.

 

\[ \mathbf{x}_{t+1} = \mathbf{f}_t (\mathbf{x}_t, \mathbf{u}_t) \]

 

여기서 아래 첨자 \( t \)는 시간스텝을 나타낸다. 일반적으로 시스템을 시변(time-varying)으로 간주하기 때문에 함수 \( \mathbf{f}_t \)에 아래 첨자로 시간 표시를 한다. 시불변 시스템일 경우에는 생략하면 된다. 상태변수는 \( \mathbf{x}_t \in R^n \), 제어변수는 \( \mathbf{u}_t \in R^m \)이다.

 

 

최적제어 문제는 시스템이 어떤 스칼라 성능지수(performance index)를 최소화하도록 제어변수를 결정하는 문제이다. 성능지수의 일반적인 형태는 다음과 같다.

 

\[ J_t = \phi ( N, \mathbf{x}_N ) + \sum_{t=i}^{N-1} g_t ( \mathbf{x}_t, \mathbf{u}_t ) \]

 

여기서 \( [i,N] \)는 관심 시간 구간이며 성능지수는 초기 시간 \( t=i \)와 초기 상태변수 \( \mathbf{x}_i \)의 함수이다. \( \phi \)는 최종 상태변수와 최종 시간에 부과되는 최종 성능함수이고, \( g_t ( \mathbf{x}_t, \mathbf{u}_t) \)는 관심 시간 구간 전체에 부과되는 운행 성능함수이다. 운행 성능함수도 시변 함수일 수 있기 때문에 아래 첨자로 시간을 표기한다.

최적제어는 시간 구간 \( [i,N] \)에서 성능지수를 최소화하는 최적 제어입력의 시퀀스 \( \{ \mathbf{u}_i^*, \mathbf{u}_{i+1}^*, \cdots , \mathbf{u}_{N-1}^* \} \)를 계산하는 것이다. 이 최적 제어입력의 시퀀스를 시스템에 인가하면 최적 경로 \( \mathbf{x}_t^* \)가 생성될 것이다.

성능지수는 설계자가 의도한대로 시스템을 움직이면서 의도한 성능을 발휘할 수 있도록 구성해야 한다. 최적제어란 단지 성능지수를 최소화하는 제어입력을 의미하는 것이지 시스템의 동작이 설계자가 원하는 대로 이상적으로 움직이게 한다는 뜻이 아니다. 따라서 성능지수를 최소화하면 시스템이 설계자가 원하는 대로 움직이거나 성능이 고도화되도록 잘 선정할 필요가 있다. 실제 문제에서는 여러 가지 성능지수를 바꿔가면서 최적제어를 설계하고 시뮬레이션을 통해서 설계자가 의도한 대로 시스템이 반응하는지 확인하는 작업을 반복하여 수행한다.

 

 

최적제어 문제는 제약조건이 있는 최적화 문제이므로 라그랑지 곱수(Lagrange multiplier)를 이용하여 다음과 같이 제약조건이 없는 최적화 문제로 변환한다.

 

\[ J_t^\prime = \phi ( N, \mathbf{x}_N ) + \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] \]

 

여기서 \( \mathbf{\lambda}_t \in R^n \)는 라그랑지 곱수이다. 제약조건(즉, 시스템 운동 모델)이 매 시간스텝마다 존재하기 때문에 라그랑지 곱수도 매 시간마다 필요하다. 라그랑지 곱수가 \( \mathbf{\lambda}_t \)가 아니라 \( \mathbf{\lambda}_{t+1} \)인 이유는 계산과 표기상의 편리함 때문이다.

변경된 성능지수 \( J_i^\prime \)를 최소화하기 위한 필요 조건은 미분(differential) \( dJ_i^\prime \)가 \( 0 \)이 되게 하는 것이다. 초기 시간 \( i \), 최종 시간 \( N \)이 정해진 값이라고 하면 \( J_i^\prime \)는 \( \mathbf{\lambda}_t, \mathbf{x}_t, \mathbf{u}_t \)의 함수다. 따라서 \( dJ_i^\prime \)는 다음과 같이 계산된다.

 

\[ \begin{align} dJ_t^\prime & = \left( \frac{\partial \phi}{\partial \mathbf{x}_N } \right) ^T d \mathbf{x}_N + \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] \tag{1} \\ \\ & \ \ \ \ \ + \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( \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} \]

 

식 (1)에서 세번째 줄은 다음과 같이 바꿀 수 있다.

 

\[ \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} \]

 

한편, 맨 마지막 줄은 다음과 같이 바꿀 수 있으므로,

 

\[ \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] \]

 

식 (1)은 다음과 같이 된다.

 

\[ \begin{align} dJ_t^\prime & = \left( \frac{\partial \phi}{\partial \mathbf{x}_N } -\mathbf{\lambda}_N \right) ^T d \mathbf{x}_N + \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{2-1} \\ \\ & \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{2-2} \\ \\ & 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{2-3} \\ \\ & 0 = \left( \frac{\partial \phi}{\partial \mathbf{x}_N } -\mathbf{\lambda}_N \right) ^T d \mathbf{x}_N \tag{2-4} \\ \\ & 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{2-5} \end{align} \]

 

위 식에서 주목할 점은 라그랑지 곱수에 관한 식 (2-2)이다. 상태변수 식 (2-1)이 정방향(forward) 시간 식이라면, 라그랑지 곱수 식은 시간적으로 역방향(backward) 식이다. 라그랑지 곱수도 차분 운동 방정식에 의해 결정되므로 동반 상태변수(costate)라고 한다. 상태변수 식은 초기 상태변수가 \( \mathbf{x}_i \)를 이용하여 시간적으로 정방향으로 진행하면서 풀어야 하는 반면, 동반 상태변수는 최종값 \( \mathbf{\lambda}_N \)을 이용하여 시간적으로 거슬러 올라가면서 풀어야 한다.

식 (2-4)와 (2-5)는 각각 상태변수의 최종값과 초기값에 관한 식으로서 경계조건 식이라고 한다. 보통 상태변수 초기값은 정해져 있으므로 \( d \mathbf{x}_i=0 \)이다. 따라서 식 (2-5)는 무시해도 된다.
상태변수의 최종값 \( \mathbf{x}_N \)이 정해져 있다면 \( d \mathbf{x}_N=0 \)이므로 식 (2-4)도 무시해도 된다. 만약 그렇지 않다면,

 

\[ \mathbf{\lambda}_N = \frac{\partial \phi}{\partial \mathbf{x}_N } \]

 

이 되어야 한다. 이 식으로 동반 상태변수의 최종값 \( \mathbf{\lambda}_N \)이 정해진다.

 

 

댓글0