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

When 구문

When 구문

when 을 사용하여 반응하고자 하는 조건과 그에 대한 반응으로 무엇을 하고 싶은지 표현할 수 있습니다.이 섹션에서는 when 문 이 가지고 있는 핵심 아이디어를 살펴 보겠습니다. when 문은 다음과 같은 일반적인 형식을 갖습니다.

when expr then
  // Statements
end when;

ifwhen 비교(if vs. when)

히스테리시스(Hysteresis) 에 대해 논의 할 때 if 문과 when 문 사이의 차이점에 대해 간략하게 논의했습니다. when 문에 있는 구문은 트리거 조건식이 참이 되는 순간에만 활성화되고, 모든 나머지 경우에는 효과가 없습니다. if 문 또는 if 표현식은 조건식이 참인 동안 활성 상태를 계속 유지합니다. 그리고, if 문 또는 if 표현식에 else 절이 포함되어 있으면 일부 분기가 항상 활성화됩니다.

표현(Expressions)

대부분의 경우 expr 표현식은 조건식이며 일반적으로 관계 연산자를 포함합니다. when 문과 함께 자주 사용하는 대표적인 표현으로는 time>=2.0 , x>=y+2 , phi<=prev_phi 등이 있습니다. 구간 측정(Interval Measurement) 섹션의 속도 추정 알고리즘에서 다루었듯이, expr 내부에 있는 변수 주위에 거의 대부분 pre 연산자를 넣어야 하는 것도 고려 해야합니다..

틩기는 공(Bouncing Ball) 예제에서 expr 이 (스칼라) 조건식이 아니라 조건식의 벡터인 경우 또한 살펴 보았습니다. 표현식 벡터의 조건 중 어느 것이라도 참이 되면 when 문이 활성화된다는 사실을 기억해야 합니다.

서술(Statements)

when 문은 일부 변수에 대한 새 값을 정의하는 데 사용하는 경우가 있는데, 두 가지 방법 중 하나로 할당할 수 있습니다. 첫 번째는 다음 형식의 방정식을 사용하는 것 입니다.

var = expr;

이 경우 변수 var 에는 expr 값이 주어집니다. expr 내부에 있는 변수에서 이전 이벤트에서의 값을 사용할 때 pre 연산자를 적용하며, 이러한 방식으로 할당된 모든 변수는 이벤트 중에만 값이 변경되는 이산 변수입니다. 그리고, 구간적 상수 함수(piecewise constant function)가 되는데, 이러한 방식으로 할당된 변수는 어떠한 시뮬레이션 시간 스탭에서도 연속적일 수 없습니다.

불연속형 변수를 명시적으로 표시하려면 discrete 한정자를 접두사로 붙일 수 있습니다(이 장 앞부분의 샘플과 홀드(Sample and Hold) 예제에서 본 것처럼).꼭 필요한 것은 아니지만. discrete 한정자를 추가하면 when 문 내에서 변수의 값을 결정 하도록 할 수 있습니다.

when 문 내에서 변수에 값을 부여할 수 있는 다른 방법은 reinit 연산자를 사용하는 것입니다.이 경우 when 문 내에서 다음과 같은 형식을 취합니다.

reinit(var, expr);

reinit 연산자를 사용할 때 var 변수는 상태 값이여야 합니다 .즉, 그 해는 미분방정식을 푸는 것으로부터 나와야 합니다. 이러한 변수에 reinit 을 사용하면 적분을 멈추고, 상태 (및 동일한 when 내에서 적용된 reinit 연산자가 영향을 주는 다른 모든 상태)의 값을 변경합니다. 그런 다음, 새로운 초기 조건 세트를 사용하여 효과적으로 적분을 다시 시작합니다. 이때, reinit 연산자로 다시 초기화되지 않은 다른 모든 상태의 값은 변경되지 않습니다.

알고리즘 섹션(algorithm Sections)

when 문에 대해 다루는 마지막 사항은 모델리카의 "단일 할당" 규칙과의 상호 작용 방법에 대한 것 입니다. 단일 할당 규칙은 각 변수의 값을 결정하는 데 사용하는 방정식이 정확히 하나여야 한다고 모델리카 스팩에서 명시합니다.:ref:speed-measurement히스테리시스(Hysteresis) 섹션에서 본 것처럼 다중 할당 측면에서 동작을 표현하는 것이 때때로 필요하거나 적어도 더 명확한 경우가 있는데,이러한 경우 모든 할당이 하나의 algorithm 섹션에 포함되어 있으면 효과적으로 단일 방정식으로 결합됩니다. 그러나 이렇게 하면 기호 조작을 수행하는 컴파일러의 기능이 제한되므로 시뮬레이션 성능 또는 모델의 재사용 가능성에 영향을 미칠 수 있습니다.

또한 초기화 방법 중에서 모델리카에는 논의된 initial equation 섹션과 유사한 형태로 algorithm 섹션에서 필요한 경우 사용하는, initial algorithm 섹션이 있습니다. 초기화(Initialization) 에 대한 이전 논의에서. initial algorithm 섹션은 initial equation 섹션과 마찬가지로 초기 조건을 결정하기 위한 초기화 단계에서만 적용되지만 initial algorithm 섹션은 동일한 변수에 대한 다중 할당을 허용합니다. 기호 조작과 관련하여 앞서 논의한 경고와 동일하게 적용됩니다.