2012-11-15 8 views
4

Modelica의 하이브리드 모델링 패러다임에 혼란 스럽습니다. 한편으로 사건은 유용하지만 다른 사건은 피해야한다. 내 경우를 설명해 드리겠습니다.하이브리드 Modelica 모델에서 이벤트 제어

1 년 동안 시뮬레이션 된 인근의 여러 건물로 구성된 대형 모델이 있습니다. 처음에는 모델이 매우 느리게 실행되었습니다. 가능한 한 많은 if-condition에 noEvent()를 추가하면 속도가 크게 향상되었습니다.

개발이 계속됨에 따라 모델의 제어가 더욱 복잡해졌으며, 매우 짧은 간격으로 많은 이벤트가 다시 발생했습니다. 아이디어 제공합니다 :

Number of (model) time events : 28170 
Number of (U) time events  : 0 
Number of state events  : 22572 
Number of step  events  : 0 

이러한 이벤트는 (I 이벤트에 변수를 필요로 정확한 사후 처리를위한) 출력을 폭파를 시뮬레이션 속도가 느려집니다. 또한, noEvent (if ...) 중 일부가 예기치 않은 동작을 일으킨다는 느낌이 들었습니다.

특정 시간 단계에서 내 이벤트를 강제 실행하고 이러한 시간 간격 사이에서 이벤트를 금지하는 솔루션이 될 수 있을지 궁금합니다. 이상적으로, 나는 특정 조건에 따라 이러한 '강제 된 사건'을 일으키고 싶습니다. 예를 들면 : 낮에는 매일 15 분마다, 일분에 높은 태양 복사로, 밤에는 이벤트를 원하지 않습니다.

이렇게하는 것이 좋습니까? 많은 국가 이벤트가 시간 이벤트가 될수록 더 빠를 것이라고 생각하십니까? Modelica 3.2 (Dymola에서)로 어떻게이 작업을 수행 할 수 있습니까?

미리 답변 해 주셔서 감사합니다. Roel

답변

5

몇 개의 의견.

첫 번째로 (시뮬레이션의 총 지속 시간 대비) 많은 이벤트가있는 시뮬레이션을 사용하는 경우 우선 저급 통합자를 사용하는 것이 좋습니다. 여기서 중요한 점은 고차원 적분기는 일반적으로 더 긴 시간 간격을 가질 수 있다는 것입니다. 그러나 이러한 단계가 이벤트에 의해 끊어지면 결국 비용이 많이 듭니다.

둘째, 고정 단계 통합을 시도 할 수 있습니다. 도구에 따라 고정 된 시간 단계 통합 자의 맥락에서 이러한 종류의 "풀 이벤트를 구현하고 동시에 한꺼번에 처리"할 수 있습니다. 그러나 사양은 고정 된 시간 간격 사이에 발생하는 이벤트를 도구가 어떻게 처리해야하는지에 대해서는 전혀 말하지 않습니다.

셋째,이 방법에 접근하는 다른 방법은 직접 이벤트를 "풀링"하는 것입니다. 가장 간단한 방법은 현재 이벤트를 생성하고 "샘플 (..., ...) then then"문으로 감싸는 모든 명령문을 취하는 것입니다. 이렇게하면 일정한 간격으로 이벤트가 트리거되었는지 확인할 수 있습니다. 이것은 고정 시간 단계 접근 방식보다 이식성이 높습니다. 나는 이것이 당신이 당신의 질문에서 실제로 제안한 것이라고 생각하지만 그것은 시간 단계 (모델은 시간 단계에 대한 개념이 없다)에 기반해서는 안된다는 것을 지적하는 것이 중요합니다. 오히려 모델 지정 샘플링 간격 실제로는 시간 단계와 완전히 독립적입니다.)

"sample (..., ...)"을 사용하면 시간 이벤트로 바뀌고 네가 빠를 것입니다.

+1

유용한 팁과 통찰력이 가득한 또 다른 답입니다. 마이클에게 감사드립니다. – saroele