Reference Tracking과 Optimal Control

학습 목표

안정한 제어기에서도 목표값 오차가 남는 이유를 확인하고, 추종 성능과 제어입력 비용을 비교합니다.

목표값을 따라가도록 Reference 이득 정하기

시작 조건

A=[01−2−3]A=\begin{bmatrix}0&1\\-2&-3\end{bmatrix}, B=[01]B=\begin{bmatrix}0\\1\end{bmatrix}, C=[10]C=\begin{bmatrix}1&0\end{bmatrix}, K=[63]K=\begin{bmatrix}6&3\end{bmatrix}, r=1r=1, x(0)=0입니다.

진행 방법

  1. N=1N=1, N=8N=8을 각각 넣어 같은 시간축에서 Unit Step을 계산하고 응답과 Steady State 출력값을 나란히 기록하세요.
  2. 0=(A−BK)xss+BNr0=(A-BK)x_{ss}+BNr에서 r=1r=1일 때 xssx_{ss}를 NN의 식으로 구하세요. yss=Cxssy_{ss}=Cx_{ss}를 이용해 yss=1y_{ss}=1을 만족하는 NN을 구하고 계산 과정을 남기세요.
  3. 직접 구한 NN과 두 응답의 최종값을 대조해 Reference Gain이 바꾼 값을 설명하세요.

남길 결과

import numpy as np
from scipy.signal import place_poles,StateSpace,lsim
from scipy.linalg import solve_continuous_are
import matplotlib.pyplot as plt
A=np.array([[0.,1.],[-2.,-3.]])
B=np.array([[0.],[1.]]);C=np.array([[1.,0.]])
K=place_poles(A,B,[-2.,-4.]).gain_matrix
N=float((-1/(C@np.linalg.solve(A-B@K,B))).item())
print('K:',K,'N:',N);assert np.isclose(N,8)
t=np.linspace(0,5,1001)
for gain in [1.,N]:
    _,y,_=lsim(StateSpace(A-B@K,B*gain,C,0),np.ones(len(t)),t)
    plt.plot(t,y,label=f'N={gain:g}')
plt.xlabel('Time [s]');plt.ylabel('Position');plt.legend();plt.grid()

결과 기록·자가 점검

N:

Steady State 값:

Closed-loop Pole:

확인할 점

출력 오차와 입력 비용의 절충

시작 조건

Q=diag⁡(q,1)Q=\operatorname{diag}(q,1), q∈{1,25}q\in\{1,25\}이며 R=[1]R=\begin{bmatrix}1\end{bmatrix}입니다. x(0)=[10]x(0)=\begin{bmatrix}1\\0\end{bmatrix}, r=0r=0입니다.

진행 방법

  1. 각 Q의 CARE를 풀고 K=R−1B⊤PK=R^{-1}B^\top P를 계산하세요.
  2. 같은 시간축의 위치와 제어입력을 그리세요.
  3. 위치 오차 제곱의 적분과 입력 제곱의 적분을 별도로 비교하세요.

남길 결과

from scipy.linalg import solve_continuous_are
for q in [1.,25.]:
    Q=np.diag([q,1.]);P=solve_continuous_are(A,B,Q,[[1.]])
    Kq=B.T@P
    _,x,_=lsim(StateSpace(A-B@Kq,np.zeros((2,1)),np.eye(2),np.zeros((2,1))),np.zeros(len(t)),t,X0=[1,0])
    u=-(x@Kq.T).ravel()
    print(q,Kq,np.trapezoid(x[:,0]**2,t),np.trapezoid(u**2,t))
    plt.plot(t,x[:,0],label=f'q={q:g}')
plt.xlabel('Time [s]');plt.ylabel('Position');plt.legend();plt.grid()
# TODO: 제어입력 그래프와 극점 확인을 추가하세요.

결과 기록·자가 점검

q:

K:

위치 오차 적분:

입력 비용:

확인할 점

모델 오차가 있을 때의 목표 추종

시작 조건

설계는 명목 B로 하고, 실제 입력 이득만 Bactual=gBB_{\mathrm{actual}}=gB, g∈{.8,1,1.2}g\in\{.8,1,1.2\}로 바꿉니다. K=[63]K=\begin{bmatrix}6&3\end{bmatrix}, N=8N=8, r=1r=1입니다.

진행 방법

  1. 각 실제 모델의 Pole과 Step 최종값을 구하세요.
  2. 명목 모델에서 계산한 N이 모든 실제 모델에서도 목표값을 정확히 맞추는지 확인하세요.
  3. Reference 이득 조정과 오차 적분 Feedback의 역할을 구분하세요.

남길 결과

K=np.array([[6.,3.]])
for g in [.8,1.,1.2]:
    Ba=g*B;Acl=A-Ba@K
    steady=float((-C@np.linalg.solve(Acl,Ba*8)).item())
    _,y,_=lsim(StateSpace(Acl,Ba*8,C,0),np.ones(len(t)),t)
    print(g,np.linalg.eigvals(Acl),steady);plt.plot(t,y,label=str(g))
plt.xlabel('Time [s]');plt.ylabel('Position');plt.legend();plt.grid()
# TODO: 오차가 남는 이유와 적분 Feedback이 추가로 해결할 역할을 설명하세요.

결과 기록·자가 점검

입력 이득:

Pole:

최종값:

추종 오차:

확인할 점

공식 예제·데이터