System Modeling

실행 준비

Python 경로는 python-control을 사용합니다. 모듈이 없으면 Colab·Jupyter의 코드 셀에서 %pip install control==0.10.2를 실행하세요.

학습 목표

질량이나 저항을 바꿀 때 Transient Response와 Steady-State Value 중 무엇이 변하는지 모델로 판단합니다.

Cruise 모델과 단위

시작 조건

m=1000m=1000 kg, b=50b=50 N·s/m, 힘 500 N. State와 Output은 Velocity [m/s]입니다.

진행 방법

  1. A=−b/mA=-b/m, B=1/mB=1/m, C=1C=1, D=0D=0으로 모델을 만들고 500 N의 일정한 힘에 대한 0≤t≤1500\le t\le150 s 응답을 그리세요.
  2. m∈{500,1000,1500}m\in\{500,1000,1500\}만 바꾸고 같은 힘을 입력하세요. mv̇+bv=500m\dot v+bv=500에 v̇=0\dot v=0을 대입해 Steady-State Velocity를 구하고, v̇+(b/m)v=500/m\dot v+(b/m)v=500/m의 계수를 1차 표준형과 대응시켜 Time Constant를 구하세요.
  3. 질량별로 계산한 Steady-State Velocity와 시뮬레이션 마지막 표본 v(150)v(150)를 나란히 기록하세요. 곡선이 계산한 Steady-State Velocity의 약 63.2%에 도달하는 시각을 찾아, 계산한 Time Constant와 대조하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
m=1000.; b=50.; force=500.
G=ctl.ss([[-b/m]],[[1/m]],[[1]],[[0]])
t=np.linspace(0,150,1501)
t,v=ctl.step_response(force*G,t)
plt.plot(t,v); plt.xlabel('Time [s]'); plt.ylabel('Speed [m/s]'); plt.grid()
# TODO: 질량 3조건과 식으로 예상한 값을 비교하세요.

결과 기록·자가 점검

m [kg]:

예상 최종 속도 [m/s]:

측정 속도 [m/s]:

Time Constant [s]:

확인할 점

Motor 모델의 계수 비교

시작 조건

J=.01J=.01, b=.1b=.1, K=.01K=.01, L=.5L=.5. R∈{.5,1,2}R\in\{.5,1,2\} Ω를 비교하며 입력은 1 V입니다.

진행 방법

  1. G(s)=K(Js+b)(Ls+R)+K2G(s)=\frac K{(Js+b)(Ls+R)+K^2}를 만들고 0≤t≤100\le t\le 10 s 응답을 구하세요.
  2. 각 R에서 Pole·DC Gain·최종 출력값을 표에 적으세요.
  3. 전기 저항과 관성 계수가 식의 어느 항을 바꾸는지 설명하세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import control as ctl
s = ctl.tf('s')
J=.01; b=.1; K=.01; L=.5
for R in [.5,1.,2.]:
    G=K/((J*s+b)*(L*s+R)+K**2)
    print(R,ctl.poles(G),ctl.dcgain(G))
# TODO: 같은 시간축의 응답을 추가하세요.

결과 기록·자가 점검

R [Ω]:

Pole:

DC Gain:

최종 속도 [rad/s]:

확인할 점

측정한 응답에서 모델 추정하기

시작 조건

센서의 합성 Step 기록 y=1.8(1−e−t/3)+잡음y=1.8(1-e^{-t/3})+\text{잡음}입니다. 0≤t≤150\le t\le 15 s, 151점, 잡음 표준편차 .03, seed=7입니다.

진행 방법

  1. 제공된 측정 배열을 curve_fit의 목표값으로 사용하고, K(1−e−t/τ)K(1-e^{-t/\tau})의 K,τK,\tau를 추정하세요.
  2. 전체 00–1515 s와 앞 00–33 s의 표본에 각각 같은 추정을 적용하세요. 구간별 사용 표본 수·추정한 K,τK,\tau를 표로 적으세요.
  3. 각 추정 곡선을 측정값과 같은 시간축에 그리고, 잔차는 측정값−추정값으로 그리세요. 곡선의 최종값과 잔차 형태를 근거로 더 측정하고 싶은 시간 구간 하나를 정하고 이유를 적으세요.

남길 결과

from scipy.optimize import curve_fit
rng=np.random.default_rng(7); tm=np.linspace(0,15,151)
measured=1.8*(1-np.exp(-tm/3))+rng.normal(0,.03,len(tm))
def response(t,gain,tau):return gain*(1-np.exp(-t/tau))
for end in [3,15]:
    select=tm<=end
    parameters,_=curve_fit(response,tm[select],measured[select],p0=[1,2],bounds=(0,np.inf))
    print(end,parameters)
# TODO: 곡선과 잔차를 같은 시간축으로 비교하세요.

결과 기록·자가 점검

기록 구간 [s]:

추정 Gain:

추정 Time Constant [s]:

RMSE:

확인할 점

공식 예제·데이터