Reference Tracking과 Optimal Control
학습 목표
안정한 제어기에서도 목표값 오차가 남는 이유를 확인하고, 추종 성능과 제어입력 비용을 비교합니다.
목표값을 따라가도록 Reference 이득 정하기
시작 조건
, , , , , x(0)=0입니다.
진행 방법
- , 을 각각 넣어 같은 시간축에서 Unit Step을 계산하고 응답과 Steady State 출력값을 나란히 기록하세요.
- 에서 일 때 를 의 식으로 구하세요. 를 이용해 을 만족하는 을 구하고 계산 과정을 남기세요.
- 직접 구한 과 두 응답의 최종값을 대조해 Reference Gain이 바꾼 값을 설명하세요.
남길 결과
- 두 Step 응답과 Steady State 값, N을 구한 식.
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:
확인할 점
- 직접 계산한 Steady State 출력값이 각 시뮬레이션의 최종값과 일치하는가?
- N을 바꾸어도 Closed-loop Pole은 같은가?
출력 오차와 입력 비용의 절충
시작 조건
, 이며 입니다. , 입니다.
진행 방법
- 각 Q의 CARE를 풀고 를 계산하세요.
- 같은 시간축의 위치와 제어입력을 그리세요.
- 위치 오차 제곱의 적분과 입력 제곱의 적분을 별도로 비교하세요.
남길 결과
- 위치·입력 그래프와 두 적분값의 비교표.
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:
위치 오차 적분:
입력 비용:
확인할 점
- 두 Q가 모두 양의 정부호이고 인가?
- 의 모든 Pole 실수부가 음수인가?
모델 오차가 있을 때의 목표 추종
시작 조건
설계는 명목 B로 하고, 실제 입력 이득만 , 로 바꿉니다. , , 입니다.
진행 방법
- 각 실제 모델의 Pole과 Step 최종값을 구하세요.
- 명목 모델에서 계산한 N이 모든 실제 모델에서도 목표값을 정확히 맞추는지 확인하세요.
- 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:
최종값:
추종 오차:
확인할 점
- Feedback 항과 Reference 항 모두 실제 B_actual에 곱해졌는가?
- 최종값을 계산하기 전에 안정성을 확인했는가?