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

구성요소 모델(Component Models)

구성요소 모델(Component Models)

이 섹션에서는 구성 요소 모델이 이전에 만든 모델과 어떻게 다른지 요약합니다. 이 토론은 두 부분으로 나뉩니다.첫 번째 부분은 비인과적 모델링과 그것이 보존 방정식을 자동으로 생성하고 실행하는 도식 기반, 구성 요소 지향 모델링을 위한 프레임워크를 제공하는 방법에 초점을 맞출 것입니다.이 장의 주제인 두 번째 부분에서는 구성 요소 모델의 정의가 구문적으로 어떻게 영향을 미치는지에 대한 개요를 설명합니다.

그러나 논의를 시작하기 전에 용어에 대해 정리할 필요가 있습니다. 이 장에서는 두 가지 자료형의 모델을 만들었습니다. 첫 번째 자료형은 개별 효과(예: 저항기, 커패시터, 스프링, 댐퍼)를 나타내고,다른 자료형은 더 복잡한 어셈블리(예: 회로, 메커니즘)를 나타냅니다.

이러한 서로 다른 자료형의 모델 간의 차이점에 대해 논의하기 전에 정확하게 참조할 수 있도록 몇 가지 용어를 소개하겠습니다.*구성 요소 모델* 은 방정식을 재사용 가능한 형태로 캡슐화하는 데 사용하는 모델입니다. 이러한 모델을 생성하면 포함된 방정식 대신 구성 요소 인스턴스를 사용할 수 있습니다. 하위 시스템 모델 은 구성 요소 또는 기타 하위 시스템으로 구성된 모델입니다. 즉, (일반적으로) 방정식을 포함하지 않습니다.대신 다른 구성 요소의 어셈블리를 나타냅니다. 일반적으로 이러한 하위 시스템 모델은 구성 요소 및 기타 하위 시스템 모델을 도식적으로 드래그, 드롭 및 연결하여 생성합니다. 구성 요소 모델은 "평면"(다른 구성 요소나 하위 시스템은 포함하지 않고 방정식만 포함)인 반면 하위 시스템 모델은 계층적입니다.

종종 하위 시스템 모델을 *시스템 모델*이라고 합니다.시스템 모델은 시뮬레이션할 것으로 예상되는 모델입니다. 이를 시뮬레이션할 때 모델리카 컴파일러는 모델의 계층을 탐색하고 계층 전체에 존재하는 모든 변수와 방정식을 기록합니다.시뮬레이션에 사용될 변수와 방정식입니다. 물론 고유한 해가 있으려면 시스템 모델(비부분적(non-partial) 모델과 마찬가지로)이 균형을 이루어야 합니다.

하위 시스템 모델은 방정식을 포함할 수 있음 에 주의 해야 합니다.모델리카에는 이에 대한 규칙이 없습니다. 그러나 대부분의 경우 모델은 방정식 또는 기타 구성 요소/하위 시스템으로 구성되는 경향이 있습니다. 하위 구성 요소 또는 하위 시스템을 포함하는 모델에 방정식을 두는 것은 하위 시스템의 다이어그램을 볼 때 모델에 대한 일부 정보가 "보이지 않음"을 의미하기 때문에 실제로는 피하는 것이 좋습니다. 이것에 대한 한 가지 가능한 예외는 하위 시스템에서 initial equation 섹션을 사용하는 것일 수 있습니다.

용어에 대한 논의는 생략하고, 구성 요소 모델에 대한 논의를 시작하겠습니다.

비인과적 모델링(Acausal Modeling)

비인과적 모델링에 대한 논의부터 시작하겠습니다. 커넥터(Connectors) 에 대한 장에서 이 주제에 대해 매우 간략하게 다루었습니다.여기서 비인과적 모델링에 대한 보다 포괄적으로 논의 하겠습니다.

구성 가능성(Composability)

비인과적 모델링에는 두 가지 매우 큰 장점이 있습니다. 첫 번째는 구성 가능성인데, 이 맥락에서는 "호환성"에 대해 걱정할 필요 없이 원하는 거의 모든 구성에서 구성 요소 인스턴스를 끌어다 놓고 연결할 수 있는 기능을 의미합니다.이는 비인과적 커넥터가 인과적 호환성이 아닌 물리적 호환성이라는 개념을 중심으로 설계되어서, 비인과적 연결 정의가 정보가 흐르는 방향이 아닌 교환되는 물리적 정보에 초점을 맞추기 때문에 가능합니다. 그 결과 정보 교환의 특성(즉, 방향성)에 대한 선험적 지식 없이도 물리적 상호 작용이라는 개념을 중심으로 구성 요소 모델을 만들 수 있습니다.

그러나 이 구성 가능성에는 다른 의미가 있습니다. 구성 요소를 끌어다 놓고 연결하여 시스템을 쉽게 만들 수 있을 뿐만 아니라 쉽게 재구성할 수도 있습니다.전기 회로의 전압원을 전류원으로 교체하면 해당 시스템의 수학적 표현에 중대한 영향을 미칠 수 있습니다(예: 시스템이 블록 다이어그램으로 표시되는 경우).그러나 이러한 변화는 비인과적 접근 방식을 사용할 때 큰 영향을 미치지 않습니다. 기본 수학적 표현이 여전히 변경되고 경우에 따라서는 크게 변경되지만 해당 표현은 컴파일 프로세스의 일부로 자동 생성되기 때문에 사용자에게 영향을 미치지 않습니다.

마지막으로 구성 가능성의 또 다른 측면은 다중 도메인 시스템 지원에 있습니다.실제로 모델리카는 다양한 엔지니어링 도메인(전기, 열, 유압)을 지원할 뿐만 아니라 여러 모델링 형식을 지원합니다. 모델 개발자는 블록 다이어그램, 상태 차트, 페트리넷 을 위한 라이브러리를 만들었습니다. 각 경우에 특별한 도구나 편집기를 요구하는 대신 이러한 모든 다양한 도메인과 형식을 모델리카에서 적절하게 자유롭게 결합할 수 있습니다.

계산(Accounting)

커넥터(Connectors)

비인과적 모델링의 또 다른 이점은 이 접근 방식으로 수행되는 자동 "계산"의 양입니다. 어떤 계정이 수행되는지 정확히 이해하기 위해 모델리카 표준 라이브러리에서 다음과 같은 회전식 connector 정의를 살펴보겠습니다.

connector Flange_a "1-dim. rotational flange of a shaft (filled square icon)"
  Modelica.SIunits.Angle phi "Absolute rotation angle of flange";
  flow Modelica.SIunits.Torque tau "Cut torque in the flange";
  annotation ...
end Flange_a;

connector Flange_b "1-dim. rotational flange of a shaft (filled square icon)"
  Modelica.SIunits.Angle phi "Absolute rotation angle of flange";
  flow Modelica.SIunits.Torque tau "Cut torque in the flange";
  annotation ...
end Flange_b;

이전에 논의한 바와 같이 비인과적 커넥터에는 변수 사이 혹은 변수를 통과하는 두 가지 다른 자료형의 변수가 존재합니다.통과 변수는 flow 한정자로 표시합니다.``Rotational`` 커넥터의 경우 교차 변수는 각도 위치인 phi 이고 통과 변수는 토크인 tau 입니다.

부호 체계(Sign Conventions)

또한 모델리카 모델은 다음 규칙을 준수해야 한다고 했던 이전 논의를 기억하겠습니다. 이것은 모든 계산이 정확한지 확인할 뿐만 아니라 스프링, 댐퍼 과 같은 (본질적으로 대칭인) 구성 요소가 뒤집어져도 여전히 동일하게 작동하도록 함으로써 구성 가능성에도 도움이 되기 때문에 중요한 규칙입니다.

연결 세트(Connection Sets)

컴파일러가 수행하는 계산에 대해 자세히 알아보기 전에 연결 세트 의 개념을 소개해야 합니다. 연결 세트가 무엇인지 설명하려면 다음 도식을 참고 할 수 있습니다.

Spring mass damper connection set

이 모델에는 8개의 연결이 있습니다.

equation
  connect(ground.flange_a, damper2.flange_b);
  connect(ground.flange_a, spring2.flange_b);
  connect(damper2.flange_a, inertia2.flange_b);
  connect(spring2.flange_a, inertia2.flange_b);
  connect(inertia2.flange_a, damper1.flange_b);
  connect(inertia2.flange_a, spring1.flange_b);
  connect(damper1.flange_a, inertia1.flange_b);
  connect(spring1.flange_a, inertia1.flange_b);

두 개의 연결 문에 하나의 커넥터가 공통으로 있는 경우 동일한 연결 집합에 속합니다. 커넥터가 다른 커넥터에 연결되어 있지 않으면 자신만 포함하는 연결 세트에 속합니다. 이 규칙을 사용하여 커넥터를 다음과 같이 연결 세트로 구성할 수 있습니다.

  • Connection Set #1

    • ground.flange_a

    • damper2.flange_b

    • spring2.flange_b

  • Connection Set #2

    • damper2.flange_a

    • spring2.flange_a

    • inertia2.flange_b

  • Connection Set #3

    • inertia2.flange_a

    • damper1.flange_b

    • spring1.flange_b

  • Connection Set #4

    • inertia1.flange_b

    • damper1.flange_a

    • spring1.flange_a

  • Connection Set #5

    • inertia1.flange_a

이러한 연결 세트는 다이어그램에서 오른쪽에서 왼쪽으로 나타납니다.시간을 들여 다이어그램의 커넥터를 연결 세트에 나열된 커넥터와 일치시켜 연결 세트가 무엇인지 직관적으로 이해하는 것이 유용할 수 있습니다. flange_a 커넥터는 채워진 원이고 flange_b 커넥터는 외곽선만 표시됩니다.

만들어진 방정식(Generated Equations)

여기에서 "계산"이 시작됩니다. 각 연결 설정 에 대해 특수 방정식이 자동으로 생성됩니다. 첫 번째 자동 방정식 세트는 교차 변수와 관련된 것인데, 수학적으로 말해서 모든 변수가 동일한 값을 가져야 한다는 제약을 부과합니다. 다음으로, 연결 세트의 모든 통과 변수의 합이 0이 되어야 한다는 공식이 필요 합니다.

위 연결 세트의 경우 다음 방정식이 자동으로 생성됩니다.

// Connection Set #1
//   Equality Equations:
ground.flange_a.phi = damper2.flange_b.phi;
damper2.flange_b.phi = spring2.flange_b.phi;
//   Conservation Equation:
ground.flange_a.tau + damper2.flange_b.tau + spring2.flange_b.tau = 0;

// Connection Set #2
//   Equality Equations:
damper2.flange_a.phi = spring2.flange_a.phi;
spring2.flange_a.phi = inertia2.flange_b.phi;
//   Conservation Equation:
damper2.flange_a.tau + spring2.flange_a.tau + inertia2.flange_b.tau = 0;

// Connection Set #3
//   Equality Equations:
inertia2.flange_a.phi = damper1.flange_b.phi;
damper1.flange_b.phi = spring1.flange_b.phi;
//   Conservation Equation:
inertia2.flange_a.tau + damper1.flange_b.tau + spring1.flange_b.tau = 0;

// Connection Set #4
//   Equality Equations:
inertia1.flange_b.phi = damper1.flange_a.phi;
damper1.flange_a.phi = spring1.flange_a.phi;
//   Conservation Equation:
inertia1.flange_b.tau + damper1.flange_a.tau + spring1.flange_a.tau = 0;

// Connection Set #5
//   Equality Equations: NONE
//   Conservation Equation:
inertia1.flange_a.tau = 0;

빈 연결 집합(즉, 연결 집합 #5)의 경우 집합에 변수가 하나만 있으므로 등식이 생성되지 않습니다. 보존 방정식은 여전히 생성 되지만 하나의 항만 포함합니다.따라서 연결되지 않은 커넥터에서 아무 것도 흘러나올 수 없습니다. 이것은 직관으로 볼 수 있는 물리적 의미 또한 갖습니다.

이 모든 것이 물리적으로 무엇을 의미 할까요? 전기 연결의 경우 이는 각 연결이 커넥터 사이의 "완벽한 단락"으로 취급될 수 있음을 의미합니다.기계 시스템의 경우 연결은 관성이 없는 완전 강성 샤프트로 취급합니다.결론은 연결이란 각 커넥터의 전체 변수가 동일하고, 한 구성 요소를 떠나는 모든 보존된 양이 다른 구성 요소에 들어가야 함을 의미한다는 것입니다.구성 요소 사이에 아무 것도 손실되거나 저장되지 않습니다.

보존(Conservation)

이 방정식에는 두 가지 중요한 결과가 있습니다. 첫 번째는 flow 변수가 자동으로 보존된다는 것입니다. 일반적인 유량 변수는 전류, 토크, 질량 유량 등입니다.이들은 항상 보존된 양(각각 *즉, * 전하, 각 운동량 및 질량)의 시간 미분이므로 이러한 방정식은 자동으로 이러한 변수를 보존합니다.

그러나 다른 것도 암묵적으로 보존되고 있습니다. 구체적으로, 에너지 보존도 보장 할 수 있습니다. 이러한 모든 도메인에 대해 커넥터를 통한 전력 흐름은 통과 변수와 교차 변수 또는 교차 변수의 파생물의 곱으로 나타낼 수 있습니다. 결과적으로 각 도메인 연결 세트에 대해 자동으로 생성된 방정식에서 전력 보존 방정식을 쉽게 도출할 수 있습니다. 위의 예제에서 첫 번째 연결 세트에 다음 방정식이 있음을 알고 있습니다.

ground.flange_a.phi = damper2.flange_b.phi;
damper2.flange_b.phi = spring2.flange_b.phi;
ground.flange_a.tau + damper2.flange_b.tau + spring2.flange_b.tau = 0;

마지막 방정식에 ground.flange_a 커넥터의 각속도인 der(ground.flange_a.phi) 를 곱하면 다음과 같은 결과를 얻습니다.

der(ground.flange_a.phi)*ground.flange_a.tau
+ der(ground.flange_a.phi)*damper2.flange_b.tau
+ der(ground.flange_a.phi)*spring2.flange_b.tau = 0;

그러나 연결 집합의 모든 교차 변수가 동일하다는 것도 알고 있습니다. 결과적으로 이들의 미분도 동일해야 합니다. 이것은 그들 중 하나를 다른 것으로 대체할 수 있음을 의미합니다. 이러한 두 가지 대체를 수행하면 다음이 생성됩니다.

der(ground.flange_a.phi)*ground.flange_a.tau
+ der(damper2.flange_b.phi)*damper2.flange_b.tau
+ der(spring2.flange_b.phi)*spring2.flange_b.tau = 0;

위 방정식의 첫 번째 항은 flange_a 를 통해 접지 구성 요소로 흐르는 전력입니다. 두 번째 항은 flange_b 를 통해 damper2 구성 요소로 흐르는 힘입니다. 마지막 항은 flange_b 를 통해 spring2 구성 요소로 흐르는 힘입니다. 이들은 연결 세트의 모든 커넥터를 통해 흐르는 전력을 나타내므로 이는 해당 연결 세트에 의해 전력이 보존됨을 의미합니다( 한 구성 요소에서 흐르는 모든 전력은 다른 구성 요소로 흘러야 하며 손실되거나 저장되는 것은 없습니다).

균형잡힌 구성요소(Balanced Components)

연결 집합의 비인과적 변수를 포함하여 생성된 방정식에 대한 이전 논의를 주의 깊게 살펴보면매우 흥미로운 것을 볼 수 있습니다. 그러나 이를 보려면 먼저 커넥터 및 커넥터 세트에 대해 배운 몇 가지 사항을 검토해야 합니다.

  1. 연결은 하나의 연결 세트에만 속할 수 있습니다.

  2. 비인과적 변수(Acausal Variables) 에 대한 이전 논의에서 배웠듯이 커넥터의 모든 통과 변수(즉, flow 한정자로 선언된 변수)에 대해 변수(즉, 한정자가 없는 변수)와 일치하는 항목이 있어야 합니다.

  3. 연결 세트에서 생성된 방정식의 수는 연결 세트의 커넥터 수에 커넥터의 통과(through)-(교차)across 쌍 수를 곱한 것과 같습니다.

비인과적 변수는 쌍으로 나온다는 것을 기억하십시오. 이러한 변수의 절반(쌍당 하나)에 대한 방정식은 연결을 통해 자동으로 생성됩니다. 즉, 방정식의 나머지 절반은 구성 요소 모델 자체에서 가져와야 합니다.

이 논의는 커넥터의 비인과적 변수에만 초점을 맞추고 있습니다.또한 다른 두 가지 경우도 고려해야 합니다.

  1. 구성 요소 모델 내에서 선언된 변수(커넥터가 아닌).

  2. 커넥터의 원인 변수(i.e. input 또는 output 에 의해 한정된 변수).

모델리카는 모든 비``partial`` 모델이 균형을 이루도록 요구합니다.그러나 그것은 무엇을 의미하는 걸까요? 이는 구성 요소가 적절한 수의 방정식을 제공해야 함을 의미합니다(필요 이상도 이하도 아님).문제는 필요한 방정식의 수를 계산하는 방법입니다.

비인과적 변수에 대한 논의를 기반으로 이미 시작했습니다. 비인과적 변수에 필요한 방정식의 절반은 생성된 방정식에서 가져오므로 나머지 절반은 이러한 커넥터를 포함하는 구성 요소 모델 내에서 가져와야 합니다. 특히 구성 요소는 각 커넥터의 모든 관통 쌍에 대해 하나의 방정식을 제공해야 합니다. 또한 output 한정자가 있는 커넥터의 모든 변수에 대해 하나의 방정식을 제공해야 합니다(참고: 구성 요소는 input 한정자가 있는 커넥터의 변수에 대해 방정식을 제공할 필요가 없습니다).여기서 이론적 근거는 구성 요소가 모든 input 신호가 알려져 있고(외부적으로 지정됨) 자신이 연결하는 모든 output 신호를 계산할 책임이 있다고 가정할 수 있다는 것입니다. 마지막으로 구성 요소 내에서 선언된 모든 (paramter 가 아닌) 변수에도 방정식이 있어야 합니다.

요약하면 구성 요소가 제공해야 하는 방정식의 수는 다음의 합계입니다.

  1. 모든 커넥터에 걸친 관통 쌍의 수

  2. 구성 요소 모델에서 선언된 비``파라미터`` 변수의 수.

  3. 모든 커넥터에 걸쳐 있는 output 변수의 수.

이러한 방정식은 상속된 partial 모델에서 발생할 수 있습니다(그리고 자주 발생함).

구성 요소에서 제공하는 방정식의 수가 필요한 방정식의 수와 같으면 구성 요소 모델의 균형 이 맞다고 합니다.

구성요소 정의(Component Definitions)

이 장에서는 구성 요소 모델을 만드는 방법에 대해 설명했습니다.근본적으로 모델 정의에 무엇을 포함해야 하는지 처음 논의한 이후로 변경된 사항은 없습니다. 그러나 구성 요소 모델에 대한 몇 가지 사항을 강조할 가치가 있습니다.

블럭(Blocks)

먼저 블록 구성 요소에 대한 논의에서 block 이라는 개념을 소개했습니다.``block`` 은 커넥터가 inputoutput 신호만 포함하는 특별한 종류의 model 입니다.

상태 변수/ 커넥터(Conditional Variables/Connectors)

접지 커넥터 옵션(Optional Ground Connector) 에 대한 논의에서 본 또 다른 사항은 선언을 조건부로 만드는 기능이었습니다. 조건 선언이 의존하는 표현식은 시간의 함수로 변경할 수 없습니다(즉, 시뮬레이션 중에 변수가 나타나고 사라질 수 없음). 대신 컴파일러 또는 시뮬레이션 런타임이 시뮬레이션 전에 변수가 있어야 하는지 여부를 결정할 수 있도록 파라미터 및 상수의 함수로 만들어야 합니다.살펴 본 바와 같이 이러한 선언의 구문은 다음과 같습니다.

VariableType variableName(/* modifications /*) if conditional_expression;

즉, if 키워드와 변수 이름 바로 뒤에 조건식을 포함하면(및 변수에 적용되는 모든 수정 사항) 해당 변수를 조건부로 선언할 수 있습니다.조건식이 true 이면 조건 변수가 존재합니다. false 이면 존재하지 않습니다.

모델 제한(Model Limitations)

경고(assert)

모델 제한을 적용하는 방법을 이해하려면 먼저 assert 기능을 알아야합니다.``assert`` 함수에 대한 호출 구문은 다음과 같습니다.

assert(conditional_expression, "Explanation of failure", assertLevel);

여기서 conditional_expressiontrue 또는 false 를 산출하는 표현식입니다. false 값은 어설션의 실패를 나타냅니다. 그 결과에 대해서는 나중에 잠시 논의할 것입니다. 두 번째 인수는 어설션이 실패한 이유를 설명하는 String 이어야 합니다. 마지막 인수인 assertLevelAssertionLevel 자료형입니다(이전 enumerations 논의에서 정의됨). 이 마지막 인수는 선택 사항 이며 기본값은 AssertionalLevel.error 입니다.

이제 assert 함수를 사용하는 방법을 알았으니, 왜 그들이 중요한지 이해하기 위해 시뮬레이션 동안 어서션의 결과를 조사해 보겠습니다.

모델 제한 정의(Defining Model Limitations)

컴포넌트 모델 (또는 모델)을 생성할 때 방정식을 모델에 직접 포함하여 방정식에 대한 제한을 통합하는 것이 유용합니다. 이것은 equation 또는 algorithm 섹션에 assert 호출을 추가하여 수행됩니다. 이름에서 알 수 있듯이 이러한 주장은 특정 조건이 항상 참이어야 한다고 주장합니다.

모델 내의 방정식이 특정 조건에서만 정확하거나 적용 가능한 경우 이러한 조건이 어설션을 통해 모델에 포함되어야 합니다.그렇지 않으면 모델이 자동으로 잘못된 해을 산출할 수 있습니다.발견되지 않으면 모델 해을 기반으로 잘못된 결정을 내릴 수 있습니다. 이러한 모델이 후에 적발되면 모델에 대한 사람들의 신뢰가 약화될 것입니다. 따라서 항상 이러한 모델 제한 사항을 사전에 포착할 수 있도록 노력해야 합니다.

시뮬레이션 중에 이러한 주장이 어떤 영향을 미치는지 이해하는 데 잠시 시간을 할애할 가치가 있습니다. 시뮬레이션 프로세스의 일부는 소위 후보 해 을 생성하는 것입니다. 이러한 해은 실제 해가 될 수도 있고 그렇지 않을 수도 있습니다.그들은 일반적으로 기본 솔버가 해을 제안하고 해당하는"해"가 일부 수치 허용오차 내에서 정확한지 확인하기 위해 생성합니다.부정확한 것으로 확인된 후보 해은 일반적으로 충분히 정확한 해을 찾을 때까지 어떤 방식으로든 정제합니다.

후보 해가 어설션을 위반하면 자동으로 부정확한 것으로 간주합니다. 위반된 어설션은 바라건대 자동으로 더 정확하고 어설션을 위반하지 않는 해을 찾기 위해 노력합니다. 그러나 이러한 개선 프로세스가 충분히 정확한 해(즉, 허용 가능한 허용 오차 내에서 정확도 요구 사항을 충족)를 찾지 못하고, 여전히 시스템의 어설션을 위반하는 경우 시뮬레이션 환경은 두 가지 중 하나를 수행합니다. assert 호출의 level 인수가 AssertionLevel.error 이면 시뮬레이션이 종료되고, 반면에 level 인수가 AssertionLevel.warning 이면 어설션 설명이사용자에게 경고 메시지를 생성하는 데 사용합니다.이 메시지가 전달되는 방식은 각 시뮬레이션 환경에 따라 다릅니다. level 인수의 기본값(assert 호출에서 제공되지 않은 경우)은 AssertionLevel.error 임을 기억해야 합니다.