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

냉각에 대한 재고(Cooling Revisited)

냉각에 대한 재고(Cooling Revisited)

주변 조건 변경(Changing Ambient Conditions)

물리적 자료형(Physical Types) 섹션에서 앞서 소개한 열(thermal) 모델을 다시 살펴보면서, 시간 이벤트(time event)를 보여주는 간단한 예제부터 시작하겠습니다. 이전 모델과 차이는 시스템에 외란이라는 내용을 도입했다는 것입니다. 상세히 설명하면, 0.5초의 시뮬레이션 시간 이 후에 주변 온도의 급격한 감소가 발생 합니다. 이렇게 수정된 모델을 다음과 같이 작성했습니다.

model NewtonCoolingDynamic
  "Cooling example with fluctuating ambient conditions"
  // Types
  type Temperature=Real(unit="K", min=0);
  type ConvectionCoefficient=Real(unit="W/(m2.K)", min=0);
  type Area=Real(unit="m2", min=0);
  type Mass=Real(unit="kg", min=0);
  type SpecificHeat=Real(unit="J/(K.kg)", min=0);

  // Parameters
  parameter Temperature T0=363.15 "Initial temperature";
  parameter ConvectionCoefficient h=0.7 "Convective cooling coefficient";
  parameter Area A=1.0 "Surface area";
  parameter Mass m=0.1 "Mass of thermal capacitance";
  parameter SpecificHeat c_p=1.2 "Specific heat";

  // Variables
  Temperature T_inf "Ambient temperature";
  Temperature T "Temperature";
initial equation
  T = T0 "Specify initial value for T";
equation
  if time<=0.5 then
    T_inf = 298.15 "Constant temperature when time<=0.5";
  else
    T_inf = 298.15-20*(time-0.5) "Otherwise, decreasing";
  end if;
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";
end NewtonCoolingDynamic;

하이라이트되어 있는 라인이 if 문 입니다.이 특정 if 문을 사용하여, T_inf 를 계산하기 위한 두 가지 다른 방정식을 구성 했습니다.

두 방정식 중 실제로 사용하는 방정식에 대한 결정은 조건식 time<=0.5 에 따라 다릅니다.이렇게 구현된 것은 time 에만 의존하고 모델의 다른 변수가 연산에 사용되지 않기 때문에 두 방정식 사이의 전환을 "시간 이벤트"로 특성화할 수 있습니다.요점은, 방정식을 통합할 때 시스템을 연산하는 솔버가 정확히 0.5초에서 중지한 다음, 다른 방정식을 사용하여 다시 재개하도록 지시할 수 있다는 것입니다. 이러한 연산이 불가능한 다른 상태 이벤트에 대한 예제는 다음 섹션에서 살펴보기로 하고, 지금은 앞서 살펴본 냉각 예제를 계속 보겠습니다.

이 모델을 1초 동안 시뮬레이션하면 다음과 같은 온도에 대한 궤적을 얻을 수 있습니다.

/static/_images/NCD.svg

이 결과에서 볼 수 있듯이 주변 온도는 0.5초 후에 실제로 감소하기 시작합니다.온도 자체의 동적 반응을 살펴 보면 두 종류의 뚜렷한 단계를 가집니다. 첫 번째 단계는 평형을 위한(주변 온도와 일치시키기 위한) 초기 과도 응답이며, 두 번째 단계는 감소하는 주변 온도를 추적하는 것입니다.

초기 전환(Initial Transients)

초기 전환은 모델링 할때 주어지는 매우 일반적인 문제 입니다.종종 상황에 따라, 외란(이 경우 주변 온도 감소와 같은)에 대한 시스템 응답을 모델링 하려고 할 때에 평형 상태에서 시스템을 시작하지 않으면,시스템 응답에는 일종의 초기 과도 상태(여기에 표시된 것과 같은)가 포함 됩니다. 이렇게 발생하는 두 종류의 응답을 명확하게 분류하여, 응답이 겹쳐서 발생하는 현상을 피하는 방법이 필요 합니다. **이를 수행하는 가장 간단한 방법은 평형 조건에서 시뮬레이션을 시작하는 것입니다**(이전에 정상상태 초기화(Steady State Initialization) 에 논의됨). 이렇게 하면 초기 과도 현상을 모두 피하고 관심이 있는 외란 부분에 전적으로 집중할 수 있습니다.

초기화(Initialization) 에서 배웠듯이, 시스템이 평형 상태에서 시작하도록 T 값을 결정하는 초기 방정식을 포함함으로써 초기 과도 현상의 문제를 해결할 수 있습니다. 즉, 예를들면 아래와 같습니다.

model NewtonCoolingSteadyThenDynamic
  "Dynamic cooling example with steady state conditions"
  type Temperature=Real(unit="K", min=0);
  type ConvectionCoefficient=Real(unit="W/(m2.K)", min=0);
  type Area=Real(unit="m2", min=0);
  type Mass=Real(unit="kg", min=0);
  type SpecificHeat=Real(unit="J/(K.kg)", min=0);

  parameter ConvectionCoefficient h=0.7 "Convective cooling coefficient";
  parameter Area A=1.0 "Surface area";
  parameter Mass m=0.1 "Mass of thermal capacitance";
  parameter SpecificHeat c_p=1.2 "Specific heat";

  Temperature T_inf "Ambient temperature";
  Temperature T "Temperature";
initial equation
  der(T) = 0 "Steady state initial conditions";
equation
  if time<=0.5 then
    T_inf = 298.15 "Constant temperature when time<=0.5";
  else
    T_inf = 298.15-20*(time-0.5) "Otherwise, decreasing";
  end if;
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";
end NewtonCoolingSteadyThenDynamic;

변경한 유일한 것은 초기 방정식입니다.일부 고정된 온도에서 시스템을 시작하는 대신 온도 변화(최소한 처음으로 발생하는 외란 이전)가 0이 되는 온도에서 시스템을 시작 하게 한 것입니다.이제 온도 응답에는 더 이상 초기 과도 현상이 포함되지 않으며, 외란에 대한 응답에만 집중할 수 있습니다.

/static/_images/NCSTD.svg

간결함(Compactness)

if 문을 사용하면 상대적으로 간단한 동작 변경을 매우 복잡하게 보이게 할 수 있다는 문제점이 있습니다. 그래서, 동일한 동작을 하면서도 더 적은 줄의 코드로 구현 할 수 있는 몇 가지 대체 구조가 있습니다.

첫 번째 접근 방식은 if 표현식(expression) 을 사용하는 것입니다. if 문에는 방정식을 포함하는 "분기"가 포함되는 반면 if 표현식에는 표현식만 포함하는 분기가 있습니다. 또한 if 표현식의 구문도 덜 장황합니다. 만약, if 표현식을 사용하기로 선택했다면 방정식 은 다음과 같이 단순화될 수 있습니다.

equation
  T_inf = 298.15 - (if time<0.5 then 0 else 20*(time-0.5));
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";

또는 max 와 같은 많은 내장 모델리카 함수 중 하나를 사용하여 주변 온도의 변화를 나타낼 수 있습니다. 예를 들면 아래와 같습니다.

equation
  T_inf = 298.15 - max(0, 20*(time-0.5));
  m*c_p*der(T) = h*A*(T_inf-T) "Newton's law of cooling";

이벤트(Events)

시스템 동작에 급격한 변화가 존재한다는 사실을 표현하는 여러 가지 방법을 보았습니다.그러나 앞서 살펴본 예시는 주변 온도의 변화 만을 설명하는 것이 아니라, 그것이 변하는 시점 도 명시하고 있다는 점을 기억해야 합니다. 이것은 미묘하지만 매우 중요한 포인트입니다.

시스템이 평형 상태에서 시작된 마지막 예시를 생각 해보면, 시뮬레이션 시작 시에는 특별하게 중요한 역학적인 연산은 없습니다. 시스템에서는 실제로 변경되는 것이 없기 때문에 적분기가 적분 오류를 과도하게 누적할 가능성이 없습니다.따라서 시뮬레이션을 완료하는 데 필요한 시간을 최소화하기 위해,가변 타임 스탭 적분기(variable time step integrators)는 이러한 상황에서 해석의 타임 스탭 크기를 늘립니다.

그러나 이렇게 하면 적분기가 시스템의 갑작스러운 외란으로 인해 "무방비한 (blind-sided)" 상태가 될 수 있다는 위험이 발생합니다. 왜란이 발생하는 경우에는 "큰 타임 스탭이 적분 오류를 과도하게 발생시키지 않을 것"이라는 처음 했었던 적분기의 가정은 사실이 아니게 됩니다.

적분기가 언제 큰 타임 스탭을 사용하여 해석할 수 있고, 언제 그렇게 할 수 없는지를 알 수 있도록 해야합니다.일반적으로 이러한 통합 체계는 일종의 시행 착오 방식(trial and error)을 사용합니다. 큰 타임 스탭을 이용해 해석을 시도한 다음에 해당 타임 스탭에서 발생하는 오류의 양을 추정합니다. 임계값보다 작으면 그 상태를 수용하고(또는 더 큰 단계를 시도할 수도 있음),이 타임 스탭에서 너무 많은 오류가 발생하면 더 작은 타임 스탭을 시도합니다. 그러나 오류 임계값 아래에 도달하는 데 얼마나 작은 타임 스탭이 필요한지 알 수 없습니다. 즉, 계속해서 더 작은 타임 스탭으로 맹목적으로 시도할 것입니다.

그러나, 모델리카는 기본 시스템을 이런 형태로 적분하는 것 보다 개선된 동작 방식을 가지고 있습니다. 모델리카 컴파일러는 문제에서의 구조 를 분석합니다. 다룬 모든 예제를 살펴보면, 컴파일러는 동작에 뚜렷한 변화가 있음을 미리 알 수 있었습니다.*즉* 해의 궤적에 대한 지식 없이도 선험적으로 시간이 알려진 이벤트인지 알 수 있었습니다.

따라서 모델리카 컴파일러가 수행하는 작업은 기본 적분기에게 0.5초에 동작이 갑자기 변경될 것이라고 알리고, 적분기에게 해당 지점까지만 정확하게 적분하고 더 이상 적분하지 않도록 지시합니다.결과적으로 타임 스탭 내 에서 급격한 변화가 발생하지 않습니다.대신 적분기는 이벤트의 다른 쪽에서 다시 시작 합니다.이렇게 하면 타임 스탭에서 오류를 최소화하는 컷오프 시간에 대한 블라인드 검색을 완전히 피할 수 있습니다. 대신 적분기는 해당 지점까지 자동으로 적분한 다음에 해당 지점 이후에 다시 시작합니다.

이것은 시뮬레이션이 수행되는 방식을 최적화하는 모델리카 기능의 많은 예 중 하나입니다. 이러한 종류의 처리에 대한 자세한 설명은 다음 섹션인 이벤트(Events) 에서 찾을 수 있으며,해 변수에 따라 달라지는 이벤트의 더 복잡한 예도 볼 수 있습니다.