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

초기화(Initialization)

초기화(Initialization)

개요(Overview)

이전의 정상상태 초기화(Steady State Initialization) 논의에서 이미 다루었듯이, 거동은 모델에 포함된 방정식과 모델의 상태 변수에 주어진 초기 조건으로 표현됩니다. 모델리카에서 초기 조건은 일반 방정식(방정식 섹션에 있음)과 초기 방정식(초기 방정식 섹션에 있음)을 결합하여 계산합니다.

처음 사용하는 사람들이 많이 혼란스러워 하는 첫번 째 요소는 필요한 초기 조건의 수를 이해하는 것입니다. 사실, 이 질문에 대한 답은 간단합니다. 참고로, 문제에 대해서 제대로 초기화 될 때 까지 시뮬레이션 소프트웨어가 추가 방정식으로 제공하는 초기 방정식을 보강할 수 있기 때문에 너무 적게 사용하는 경우에는 문제가 해결될 수 도 있지만,너무 많은 초기 방정식을 선언한 경우에는 문제를 해결하지 못할 수도 있습니다(이는 중복 방정식을 인식하고 제거하는 도구 기능에 따라 다르며 다른 도구는 이를 위한 다양한 수준의 지원을 제공하기 때문입니다).

물론, 초기 방정식의 수가 상태의 수와 같아야 한다고 질문 대해 답했지만, 다시 의문이 생깁니다. 즉, *얼마나 많은 상태가 있는지 어떻게 결정 하는가? 입니다.*이 장에서 살펴 본 모델의 경우는 대답이 매우 간단합니다. 지금까지 각 예제에서 상태는 der(...) 연산자 내부에 나타나는 변수 였습니다. 즉, 앞서 예제에서는 구별한 모든 변수가 상태였습니다.

상미분 방정식(Ordinary Differential Equations)

미분하는 모든 변수가 상태가 된다는 것이 항상 그런 것은 아니다 라는 는 점에 유의하는 것이 중요합니다. 이 장에서 지금까지 본 모든 모델은 상미분 방정식(ODE)입니다. ODE를 다룰 때 모든 미분 변수는 상태이며, 이는 차례로 이러한 각 미분 변수에 대한 초기 방정식이 필요함을 의미합니다. 그러나 뒤에서 다룰 장에서 결국 소위 미분 대수 방정식(DAE)이라는 예를 접하게 될 것입니다. 이러한 경우 미분 변수 중 일부 만 상태로 간주될 수 있습니다.

사실 알고 보면, 초기화를 이해하기 위해 DAE에 대해 자세히 논의할 필요는 없습니다. 실제로 모든 모델리카 시뮬레이션 소프트웨어는 "인덱스 축소(index reduction)"라는 작업을 수행합니다. 인덱스 축소 알고리즘 자체는 상당히 복잡하지만(그래서 지금은 다루지 않겠습니다) 그 효과는 매우 간단합니다. 인덱스 감소는 DAE를 ODE로 변환합니다.

즉, 모델리카 컴파일러는 모델리카 코드에 포함된 모든 DAE 문제를 상대적으로 설명하기 쉬운 ODE 형식으로 변환 합니다., DAE 및 인덱스 축소에 대한 논의는 건너뛰고 문제가 이미 ODE로 축소되었다고 가정하고 초기화에 대한 논의를 시작하겠습니다. 이 경우, 정말로 이해해야 할 유일한 것은 모델의 모든 상태에 대해 초기화가 필요하고 모델이 다음과 같은 일반적인 ODE 형식을 갖게 된다는 것입니다.

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

여기서 t 는 현재 시뮬레이션 시간이고, \vec{x}(t) 는 시간 t 에서 우리 시스템의 상태 값입니다. \vec{u}(t) 는 시간 t 에서 시스템에 대한 모든 외부 입력 값입니다.

변수 위의 화살표는 단순히 변수가 스칼라가 아니라 벡터임을 나타냅니다. 또한 이 문제에서 미분항으로 나타나는 유일한 변수는 \vec{x} 입니다. 이를 통해 \vec{x} 가 시스템의 상태를 나타낸다는 것을 알 수 있습니다. 이 시스템에 대해 주목해야 할 마지막 사항은 \vec{f} 또는 \vec{g} 함수가 모두 \vec{y} 에 의존하지 않는다는 것입니다.

생각해 보면 t \vec{u}(t) 둘 다 우리 시스템 외부에 있습니다.그것들을 계산하거나 제어하지 않습니다.:math:vec{x} 를 우리 시스템의 상태라고 부르는 이유는 그것이 (우리 시스템 내에서) \dot{\vec{x}}(t) \vec{y}(t) 를 계산하는 데 필요한 유일한 정보이기 때문입니다. (결과적으로 해에 도달하기 위해 계산해야 하는 유일한 것입니다).

초기화 주제로 돌아가서, 정상 상태에서의 시간 동안 \vec{x}(t) 를 계산하고 \dot{\vec{x}}(t) 를 적분하여 \vec{x}(t) 에 대해 문제 풀 수 있습니다. 다시 말해 아래 수식과 같습니다.

\vec{x}(T) = \int_{t_i}^{T} \dot{\vec{x}}(t) \ \mathrm{d}t + \vec{x}(t_i)

이 모든 계산은 이전 시간 단계가 있는 동안은 작동 합니다.반면에, 이전 시간 단계가 없을 때 시뮬레이션에서 방정식에 연결하는 \vec{x} 의 값은 방정식의 첫 번째 값인 \vec{x} 여야 합니다. 즉, 초기 조건입니다.

다음과 같은 방정식을 추가하여 초기 조건을 지정한다고 상상할 수 있습니다.

\vec{x}(t_0) = \vec{x}_0

여기서 t_0 은 시뮬레이션의 시작 시간이고 \vec{x}_0 은 초기 값의 명시적 사양입니다. 상태에 대한 명시적 값을 제공하는 것은 초기 조건을 지정할 때 매우 일반적인 경우이기 때문에 확실히 이러한 형태의 초기화를 처리할 수 있어야 합니다. 그러나 이 접근 방식은 정상상태 초기화(Steady State Initialization) 보여준 예시에서는 적용할 수 없습니다. 이때는 상태에 대한 명시적인 초기 값을 제공하지 않았기 때문입니다.대신 \dot{\vec{x}}(t_0) 에 대한 초기 값을 제공했습니다. 그렇다면 이 두 가지 경우를 모두 만족 하려면 어떻게 해야 할까요?

초기 방정식(Initial Equations)

질문에 대한, 답은 시뮬레이션 시작 시 다음과 같은 문제를 해결해야 한다고 가정하는 것입니다.

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

새로운 함수인 \vec{h} 의 도입에 하겠습니다. 이 새로 도입된 함수는 initial equation 섹션에 배치한 모든 방정식을 나타냅니다. \vec{h} \vec{x} \dot{\vec{x}} 를 인수로 취한다는 사실은 다음과 같이 넓은 영역에서의 초기화로 표현할 수 있습니다. 다양한 초기 조건의 상태에 대한 명시적인 초기 값을 정의하려면 \vec{h} 를 다음과 같이 정의할 수 있습니다.

\vec{h}(\vec{x}(t_0), \dot{\vec{x}}(t_0), \vec{u}(t_0), t_0) = \vec{x}(t_0)-\vec{x}_0

하지만 \vec{h} 를 다음과 같이 정의하여 정상 상태 해로 시작하려는 의도에 맞춰 표현할 수도 있습니다.

\vec{h}(\vec{x}(t_0), \dot{\vec{x}}(t_0), \vec{u}(t_0), t_0) = \dot{\vec{x}}(t_0)

물론 초기 조건을 설명하기 위해 이러한 다양한 형식을 혼합하거나 상태별로 다양한 다른 형식을 사용할 수 있습니다. 따라서 초기 방정식을 작성할 때 명심해야 할 것은, 위에 표시된 일반적인 형식이어야 하며 시스템에 있는 상태보다 더 많이 가질 수 없다는 것입니다.

결론(Conclusion)

이 장에서 설명했듯이 모델리카의 initial equation 구조를 사용하면 시스템을 초기화하는 다양한 방법을 표현할 수 있고,여기 구현된 표현으로 우리 시스템의 상태에 대한 초기 값을 계산할 것입니다.그러나 이러한 값이 계산되는 방법을 정확히 묘사하는데 다양한 운신의 폭이 주어집니다.

이것은 모델리카가 가지는 뛰어난 장점입니다.초기화는 모델리카에서 최고 수준으로 처리되며, 이러한 유연성은 많은 실제 응용 프로그램에서 효과가 있습니다.