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

이벤트(Events)

이벤트(Events)

기본 방정식(Basic Equations) 에 대한 첫 번째 장에서 연속 동작을 설명하는 방법에 대한 예를 보았습니다. 그 장에서 소개된 방정식은 항상 문제를 해결 할 수(applied) 있었고, 그 방정식에 대한 해는 항상 연속적이었습니다. 이 장에서는 이산 동작을 설명하기 위해 모델리카의 다양한 방법에 대해 논의했습니다. 모델리카의 모든 이산적인 동작의 근본 원인은 이벤트 였습니다.

조건문(Conditional Expressions)

이벤트는 두 가지 방법 중 하나로 생성됩니다. 첫째, 조건식으로 생성할 수 있습니다. 이 장의 처음 몇 가지 예제에서 조건식이 이벤트를 트리거할 수 있음을 확인했습니다. 이러한 조건식이 time 변수만 포함하는 경우 "시간 이벤트"라고 합니다. time 변수는 모든 모델에 대한 "입력"으로 처리되는 기본 제공 전역 변수입니다.

해 변수가 포함된 조건식으로 인해 이벤트가 생성되는 경우 이를 "상태 이벤트"라고 합니다. 시간 이벤트와 상태 이벤트 간의 중요한 차이점은 각각 이 장의 첫번째 그리고 두번째 섹션에서 논의되었습니다.

관계 연산자(> , >= , < , <= , == ) 및 논리 연산자(not , and , or )를 사용하여 조건식을 만들 수 있습니다.:ref:no-event 에 대한 논의에서 보았듯이 이러한 조건식을 noEvent 연산자로 둘러싸서 이러한 조건식에 의해 생성된 이벤트를 억제할 수 도 있습니다.

종종 이러한 이벤트 생성 조건식은 if 문 또는 if 표현식의 컨텍스트에서 발생합니다. 그러나 간단한 변수 할당에 의해서도 가능한데 이에 대해 예를 들면, 아래와 같습니다.

  Boolean late;
equation
  late = time>=5.0 "This will generate an event";

can trigger an event to be generated.

구분적 구조(Piecewise Constructions)

조건식을 다룰 때 중요한 특별한 경우가 있습니다.구간을 구분하여 구성하는 식을 만드는 것이 유용한 경우가 있는데, 예를 들어 아래와 같습니다,

x = if (x<0) then 0 else x^3;

모델리카 컴파일러가 이러한 함수가 연속적이고 연속 도함수를 갖는다는 것을 확실하게 판단하는 것은 어렵습니다.이러한 이유로 모델리카는 연속적이라는 조건을 명시적으로 표현하기 위해 smooth 연산자를 포함 하고 있습니다. 다음과 같이 smooth 연산자에 대해서 예를 살펴 볼 수 있습니다.

x = smooth(2, if (x<0) then 0 else x^3);

식이 연속적이라는 의미이며 두 번까지 미분해도 연속으로 유지됨을 나타냅니다.

\begin{split}x' & = \begin{cases} 0, & \text{for } x < 0, \\ 3 \, x^2, & \text{otherwise,} \end{cases} \\ x'' & = \begin{cases} 0, & \text{for } x < 0, \\ 6 \, x, \phantom{^2} & \text{otherwise,} \end{cases} \\ x''' & = \begin{cases} 0, & \text{for } x < 0, \\ 6, \phantom{6 \, ^2}& \text{otherwise.} \end{cases}\end{split}

따라서 함수, 함수의 1차 및 2차 도함수는 x=0 에서 연속적이지만 3차 도함수는 불연속입니다.

이와 같이 smooth 연산자를 사용하려면 상한선을 지정해야 한다는 점을 기억해야 합니다.

이벤트 와 함수(Events and Functions)

조건식에 의해 생성되는 것 외에도 이벤트는 모델리카의 특정 기능에 의해 생성될 수도 있습니다.

이벤트를 생성하는 함수(Event Generating Functions)

다음은 반환 값에 불연속성이 있는 경우 이벤트를 생성하는 함수 목록입니다.

함수(Function)

설명(Description)

div(x,y)

소수 부분을 버린 대수적 몫 (Algebraic quotient with fractional part discarded.)

mod(x,y)

x/y 의 계수 (Modulus of x/y)

rem(x,y)

대수적 몫의 나머지 (Remainder from the algebraic quotient)

ceil(x)

x 보다 작지 않은 가장 작은 정수 (Smallest integer not less than x)

floor(x)

x 보다 크지 않은 가장 큰 정수(Real 반환) (Largest integer not greater than x (returns a Real))

integer(x)

x 보다 크지 않은 가장 큰 정수(정수 반환) (Largest integer not greater than x (returns an Integer))

initial()

초기화 중에는 true, 그렇지 않으면 false (true during initialization, otherwise false)

terminal()

시뮬레이션 종료 시 true, 그렇지 않으면 false (true at end of simulation, otherwise false)

sample(t0,dt)

t0 에 이벤트를 생성하고 이후 dt 초마다 (Generates an event at t0 and every dt seconds later)

edge(x)

x 가 참인 순간에만 참 (true only at the instant that x is true)

change(x)

x 가 값을 변경할 때마다 참 (true whenever x changes value)

비 이벤트 생성 기능(Non-Event Generating Functions)

다음은 이벤트를 생성하지 않는 함수의 표입니다.

함수(Function)

설명(Description)

abs(x)

x 의 절대값 (Absolute value of x)

sign(x)

x 의 부호(-1, 0 또는 1) (Sign of x (-1, 0, or 1))

sqrt(x)

x 의 제곱근 (Square root of x)

min(x,y)

xy 사이의 최소값 (Minimum value between x and y)

max(x,y)

xy 사이의 최대값 (Maximum value between x and y)