Found an issue with the book? Report it on Github.

상태 공간(State Space)

상태 공간(State Space)

ABCD 서식(ABCD Form)

상미분 방정식(Ordinary Differential Equations) 에서 다음 형식으로 미분 방정식을 표현할 수 있음을 다루었습니다.

\begin{split}\dot{\vec{x}}(t) &= \vec{f}(\vec{x}(t), \vec{u}(t), t) \\ \vec{y}(t) &= \vec{g}(\vec{x}(t), \vec{u}(t), t)\end{split}

이 형식에서 x 는 시스템의 상태를 나타내고, u 는 시스템에 외부적으로 지정된 입력을 나타내고 y 는 시스템의 출력을 나타냅니다(즉, 상태가 아닐 수 있지만 궁극적으로 상태 및 입력 값에서 계산될 수 있는 변수).

함수 \vec{f} \vec{g} \vec{x} 및 :math:`vec{u}`에 선형적으로 의존할 때 이러한 방정식은 특별합니다.

\begin{split}\dot{\vec{x}}(t) &= A(t) \vec{x}(t) + B(t) \vec{u}(t) \\ \vec{y}(t) &= C(t) \vec{x}(t) + D(t) \vec{u}(t)\end{split}

이 문제의 행렬은 소위 "ABCD" 행렬 이라고 부르며, 시스템이 이 형식인 경우 수행할 수 있는 몇 가지 흥미로운 계산이 있기 때문에 유용합니다. 예를 들어 A 행렬을 사용하여 시스템의 고유 주파수를 계산할 수 있습니다.이러한 매트릭스의 다양한 조합을 사용하여 기본 시스템 제어와 관련된 몇 가지 매우 중요한 속성(예: 관찰 가능성 및 제어 가능성)을 결정할 수 있습니다.

위의 ABCD 형식을 사용하면 행렬이 시간에 따라 변화하는데, 아래의 경우 처럼 시불변이면서 선형인 약간 더 특수화된 형식이 있습니다.

\begin{split}\dot{\vec{x}}(t) &= A \vec{x}(t) + B \vec{u}(t) \\ \vec{y}(t) &= C \vec{x}(t) + D \vec{u}(t)\end{split}

이러한 양식을 "LTI" 양식이라고 부르기도 합니다. LTI 형식은 ABCD 형식과 동일한 특수 속성을 갖는 것 외에도 "모델 교환" 형식으로 매우 간단하게 사용할수 있기 때문에 중요합니다. 역사적으로 누군가가 주어진 시스템에 대한 동작 방정식을 도출할 때(손으로 또는 일부 모델링 도구를 사용하여) 해당 방정식을 다른 시뮬레이션 소프트웨어로 가져올 수 있는 한 가지 방법은 방정식을 LTI 형식으로 넣는 것이었습니다. 이는 모델이 숫자 또는 표현식이 포함된 일련의 행렬로 교환, 공유 또는 게시될 수 있음을 의미합니다.물론, 이제는 모델리카 및 FMI 와 같은 기술은 모델 교환을 위한 훨씬 더 나은 옵션을 제공하긴 합니다.

LTI 모델(LTI Models)

누군가 LTI 형식으로 모델을 제공했다면 모델리카에서 어떻게 표현할까요? 이때 선택할 수 있는 한 가지 방법을 살펴 보겠습니다.

model LTI
  "Equations written in ABCD form where matrices are also time-invariant"
  parameter Integer nx=0 "Number of states";
  parameter Integer nu=0 "Number of inputs";
  parameter Integer ny=0 "Number of outputs";
  parameter Real A[nx,nx]=fill(0,nx,nx);
  parameter Real B[nx,nu]=fill(0,nx,nu);
  parameter Real C[ny,nx]=fill(0,ny,nx);
  parameter Real D[ny,nu]=fill(0,ny,nu);
  parameter Real x0[nx]=fill(0,nx) "Initial conditions";
  Real x[nx] "State vector";
  Real u[nu] "Input vector";
  Real y[ny] "Output vector";
initial equation
  x = x0 "Specify initial conditions";
equation
  der(x) = A*x+B*u;
  y = C*x+D*u;
end LTI;

이 모델의 첫 번째 단계는 nx , nuny 파라미터를 선언하는 것이며, 이들은 각각 상태, 입력 및 출력의 수를 나타냅니다. 다음으로 행렬 A , B , CD 를 정의합니다. 선형의 시불변 표현을 위한 모델을 만들고 있기 때문에 이러한 모든 행렬이 파라미터가 될 수 있습니다. A , B , CD 는 선언 뒤에 [] 가 있기 때문에 배열이고, [] 들 안에 두 개의 차원이 있기 때문에 그것들이 행렬이라는 것을 압니다.마지막으로 x0 , x , uy 에 대한 선언을 볼 수 있으며, 이것들도 배열입니다. 그러나 이 경우에는 각각 단일 차원만 가지므로 벡터입니다.

이 모델에 대해 주목해야 할 또 다른 사항은 모든 파라미터에 기본값이 주어졌다는 것입니다. nx , nuny 의 경우 상태, 입력 및 출력의 수가 기본적으로 0이라고 가정하며, 행렬의 경우 또한 기본적으로 0으로 채워져 있다고 가정합니다. 마찬가지로, 초기 조건의 경우 달리 지정하지 않는 한 모든 상태가 0 값으로 시뮬레이션을 시작한다고 가정합니다. 이러한 가정을 통해 이러한 파라미터의 값을 단순히 재정의함으로써 매우 간단한 모델을 작성할 수 있는 방법을 곧 설명 하겠습니다.

벡터 방정식(Vector Equations)

이제는, 모델의 나머지 부분의 경우는 꽤 익숙해 보일 것입니다.지적해야 할 중요한 한 가지는 이 모델의 방정식이 모두 벡터 방정식이라는 사실입니다.모델리카의 방정식에는 스칼라 또는 배열이 포함될 수 있는데, 이때의 유일한 요구 사항은 방정식의 양쪽 측면이 동일한 차원 수와 각 차원에 대해 동일한 크기를 가져야 한다는 것입니다.따라서 LTI 모델의 경우 다음과 같이 초기 방정식을 선언합니다.

initial equation
  x = x0 "Specify initial conditions";

이 방정식은 시뮬레이션 시작 시 x 의 각 요소가 x0 값을 갖는다는 사실을 표현하는 벡터 방정식입니다.실제로는 일련의 스칼라 값을 바탕으로 각 요소가 벡터 방정식으로 자동 확장됩니다.

모델리카에 함수의 벡터화 와 관련된 몇 가지 특별한 규칙으로 인해 방정식을 바로 읽도록 표현할 수 있습니다. 간단히 말해서 이러한 규칙은 스칼라와 함께 작동하는 함수가 있는 경우에도 특별한 변경 없이 벡터와 함께 사용할 수 있습니다.모델리카가 자동으로 벡터의 각 요소에 함수를 적용하기 때문 입니다.예를 들어, LTI 모델의 der(x) 표현은 벡터의 각 요소가 x 의 각 요소의 도함수를 나타내는 벡터로 사용합니다.

마지막으로 +, -* 와 같은 많은 일반적인 대수 연산자는 벡터 및 행렬에 적용될 때 특별한 의미를 갖는데, 이에 대한 정의는 기존의 수학적 표기법과 일치하도록 설계되었습니다. 따라서 LTI 모델에서 A*x 라는 표현은 행렬-벡터 곱에 해당합니다.

LTI 예제(LTI Examples)

이 모든 것을 염두에 두고, 이전 예제를 다시 LTI 모델을 사용하여 어떻게 표현할 수 있는지 살펴보겠습니다. LTI 모델에서 코드를 재사용하기 위해 상속(extends 키워드를 통해)을 사용할 것입니다.

앞에서 제시한 간단한 1차 시스템(Simple First Order System) 부터 시작해보면, LTI 모델을 사용하여 다음과 같이 작성할 수 있습니다.

model FirstOrder "Represent der(x) = 1-x"
  extends LTI(nx=1,nu=1,A=[-1], B=[1]);
equation
  u = {1};
end FirstOrder;

LTI 에서 확장할 때 기본값과 다른 파라미터 값만 지정하면 됩니다. 이 경우 하나의 상태와 하나의 입력이 있음을 정의하고, AB 를 1x1 행렬로 지정합니다. 마지막으로 입력이 있으므로 이에 대한 방정식을 제공해야 하는데, 입력은 일반적으로 시간에 따라 변할 수 있으므로 파라미터로 표시하지 않고 방정식으로 표시합니다.

u = {1};

{1} 표현식은 벡터 리터럴입니다. 이는 벡터를 구성 요소 목록으로 작성하고 있음을 의미하며, 이 경우 벡터에는 하나의 구성 요소인 1 만 있습니다. 그러나 예제 와 같이 쉼표로 구분된 표현식 목록을 사용하여 더 긴 벡터를 만들 수 있습니다.

v = {1, 2, 3*4, 5*sin(time)};

파라미터 값을 설정하는 것 외에도 extends 문에 방정식을 포함할 수 있다는 점은 주목할 가치가 있습니다. 따라서 equation 섹션을 모두 피하고 다음과 같이 모델을 더 간결하게 작성할 수 있었습니다.

model FirstOrder_Compact "Represent der(x) = 1-x"
  extends LTI(nx=1,nu=1,A=[-1], B=[1], u={1});
end FirstOrder_Compact;

일반적으로 equation 섹션을 포함하면 다른 사람들이 코드를 좀 더 읽기 쉽게 만들 수 있습니다. 그러나 extends 문에 방정식을 수정하도록 포함하는 것이 더 편리한 경우가 있습니다.

다음으로, 앞에서 논의한 cooling 에 대해 살펴보겠습니다. LTI 형식으로 모델을 다음과 같이 작성할 수 있습니다.

model NewtonCooling "NewtonCooling model in state space form"
  parameter Real T_inf=27.5 "Ambient temperature";
  parameter Real T0=20 "Initial temperature";
  parameter Real hA=0.7 "Convective cooling coefficient * area";
  parameter Real m=0.1 "Mass of thermal capacitance";
  parameter Real c_p=1.2 "Specific heat";
  extends LTI(nx=1,nu=1,A=[-hA/(m*c_p)],B=[hA/(m*c_p)],x0={20});
equation
  u = {T_inf};
end NewtonCooling;

이 모델은 이전 모델과 매우 유사합니다만, 행렬에 숫자를 넣는 대신 m, c_p 등과 같은 다른 파라미터를 포함하는 표현식을 넣었습니다.이와 같이 표현하면, 물리적 파라미터가 변경되면 AB 값이 그에 따라 변경됩니다.

이전의 mechanical example 을 LTI 형식으로 재구성할 때 유사한 접근 방식을 취할 수 있습니다.

model RotationalSMD
  "State space version of a rotational spring-mass-damper system"
  parameter Real J1=0.4;
  parameter Real J2=1.0;
  parameter Real c1=11;
  parameter Real c2=5;
  parameter Real d1=0.2;
  parameter Real d2=1.0;
  extends LTI(nx=4, nu=0, ny=0, x0={0, 1, 0, 0},
                  A=[0, 0, 1, 0;
                     0, 0, 0, 1;
                     -c1/J1, c1/J1, -d1/J1, d1/J1;
                     c1/J2, -c1/J2-c2/J2, d1/J2, -d1/J2-d2/J2]);
equation
  u = fill(0, 0);
end RotationalSMD;

다시 한 번, 앞서 보인 예제와 동일하게 물리적 파라미터를 이용해서 A 를 계산하는데, 이 예제에서 주목해야 할 한 가지는 A 의 구조입니다. 수학적으로 A 행렬은 다음과 같이 정의합니다.

\begin{split}A &= \left| \begin{array}{cccc} 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ -\frac{k_1}{J_1} & \frac{k_1}{J_1} & -\frac{d_1}{J_1} & \frac{d_1}{J_1} \\ \frac{k_1}{J_2} & -\frac{k_1}{J_2}-\frac{k_2}{J_2} & \frac{d_1}{J_2} & -\frac{d_1}{J_2}-\frac{d_2}{J_2} \\ \end{array} \right|\end{split}

A 구성에 대해 주목할 수 있는 한 가지는, 처음 두 행이 0의 행렬과 항등 행렬로 표현하는 것이 더 쉬울 수 있다는 것입니다. 즉, 전체 행렬을 아래와 같이 하위 행렬의 집합으로 구성하는 것이 더 간단할 수 있습니다.

\begin{split}A &= \left| \begin{array}{cc} \left| \begin{array}{cc} 0 & 0 \\ 0 & 0 \end{array} \right| ~ \left| \begin{array}{cc} 1 & 0 \\ 0 & 1 \end{array} \right| \\ \left| \begin{array}{cc} -\frac{k_1}{J_1} & \frac{k_1}{J_1} \\ \frac{k_1}{J_2} & -\frac{k_1}{J_2}-\frac{k_2}{J_2} \end{array} \right| \left| \begin{array}{cc} -\frac{d_1}{J_1} & \frac{d_1}{J_1} \\ \frac{d_1}{J_2} & -\frac{d_1}{J_2}-\frac{d_2}{J_2} \end{array} \right| \end{array} \right|\end{split}

모델리카에서는 다음과 같은 방법으로 A 행렬에 대해 하위 행렬을 이용해서 구성할 수 있습니다.

model RotationalSMD_Concat
  "State space version of a rotationals spring-mass-damper system using concatenation"
  parameter Real J1=0.4;
  parameter Real J2=1.0;
  parameter Real c1=11;
  parameter Real c2=5;
  parameter Real d1=0.2;
  parameter Real d2=1.0;
  parameter Real S[2,2] = [-1/J1, 1/J1; 1/J2, -1/J2];
  extends LTI(nx=4, nu=0, ny=0, x0={0, 1, 0, 0},
                  A=[zeros(2, 2), identity(2);
                     c1*S+[0,0;0,-c2/J2], d1*S+[0,0;0,-d2/J2]],
                  B=fill(0, 4, 0), C=fill(0, 0, 4),
                  D=fill(0, 0, 0));
equation
  u = fill(0, 0);
end RotationalSMD_Concat;

위 섹션에서 Lotka-Volterra 방정식 표현을 LTI 형식으로 바꾸는 내용은 포함하지 않았는데, 이는 Lotka-Volterra 방정식이 시불변이지만 선형이 아니기 때문입니다.모델리카에서는 LTI 모델을 사용할 때와 같은 속성(시불변, 선형) 중 어느 것도 직접 관여하지 않기 때문에 비선형 또는 시변 모델을 나타낼 수 있었습니다. 그러나, LTI 형태는 선형이고 시불변이라는 것을 의미하기 때문에 혼란스럽게 느껴질 수 있습니다.

구성요소 사용(Using Components)

지금까지의 모든 예제에서 extends 를 통해 상속으로 LTI 모델의 방정식을 재사용했습니다. 그러나, 일반적으로 방정식을 하위 구성 요소로 취급 하는 방식이 방정식을 재사용 하는 훨씬 더 좋은 방법입니다.어떻게 이 방법을 사용하는지 확인하기 위해, 이전 electrical examples 을 LTI 형식으로 재구성해보겠습니다.이번에는 LTI 모델을 이름이 정해진 인스턴스를 만드는 방식으로 구현할 것입니다.

model RLC "State space version of an RLC circuit"
  parameter Real Vb=24;
  parameter Real L=1;
  parameter Real R=100;
  parameter Real C=1e-3;
  LTI rlc_comp(nx=2, nu=1, ny=2, x0={0,0},
               A=[-1/(R*C), 1/C; -1/L, 0],
               B=[0; 1/L],
               C=[1/R, 0; -1/R, 1],
               D=[0; 0]);
equation
  rlc_comp.u = {Vb};
end RLC;

LTI 타입인 rlc_comp 라는 변수를 선언하고, extends 또는 어떤 종류의 상속도 사용하지 않았습니다. 다양한 동작을 구현하는 모델리카의 기본 방법을 모두 다룬 후에 전체 방정식을 재사용 가능한 구성 요소로 표현하는 방법을 다루겠습니다. 지금 보이는 방식은 나중에 다룰 큰 그림에 대한 "미리 보기" 수준 입니다.

위 예제에서 볼 수 있는 것은, rlc_comp 라는 변수가 있고 이 구성 요소에는 LTI 모델의 모든 파라미터와 변수가 내부에 있다는 것입니다. 예를 들어, 입력 u 를 지정하는 등식은 다음과 같이 작성 합니다.

rlc_comp.u = {Vb};

변수 rlc_comp 내부 에 있는 변수 u 에 대한 방정식을 위의 표현을 통해 제공하고 있습니다.나중에 살펴보겠지만 복잡한 시스템을 표현할때 생기는 상당한 양의 복잡성을 관리하기 위해 계층 구조를 사용할 수 있는데, . 연산을 사용하면 계층 구조의 변수를 참조할 수 있습니다.다시 말하지만, 이것은 뒤에서 컴포넌트를 소개할 때 철저히 논의하겠습니다.