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

구성요소의 배열(Arrays of Component)

구성요소의 배열(Arrays of Component)

이 장의 여러 예제에서는 구성 요소 배열을 사용했습니다.:ref:distributed-heat-transfer진자의 하모닉 운동(Harmonic Motion of Pendulums) 둘 다에서 다루 었던것 처럼,구성요소 배열은 사용자가 파라미터를 사용하여 구성요소의 수를 "스케일링"하려는 경우에 유용합니다

구성 요소 배열을 만드는 것은 벡터 및 배열에 대한 이전 논의에서 했던 것처럼, 스칼라 변수 배열을 만드는 것과 실제로 다르지 않습니다.아래의 예제에서 볼 수 있습니다.

  HTC.HeatCapacitor capacitance[n](each final C=C/n, each T(start=T0, fixed=true))
    annotation ...
  HTC.ThermalConductor wall[n](each final G=G_wall/n)
    annotation ...
  HTC.ThermalConductor rod_conduction[n-1](each final G=G_rod*(n-1))
    annotation ...

구성 요소 배열을 만드는 구문은 다른 자료형에 사용하는 구문과 동일합니다. 여기서 필요한 것은 일련의 차원에 의해 선언하는 변수의 이름을 따르는 것입니다.

그러나, 스칼라와 달리 구성 요소에는 내부에 기존과 다른 선언이 있습니다.따라서 구성 요소 배열이 생성될 때마다 해당 구성 요소의 구조가 배열의 각 구성 요소에 대해 복제됩니다. 모델리카는 모든 배열에서 모든 요소가 동일한 자료형이어야 한다는 제한을 부과하는데, 이것은 뻔하고 당연한 일인 것 처럼 보입니다. 왜냐하면 아직 교체 가능한 구성 요소에 대해 논의하지 않았기 때문입니다.모델리카의 설정 관리(Configuration Management) 기능에 대해 이야기할 때 다음 장에서 교체 가능한 구성 요소에 대해 자세히 알아볼 것입니다.그러나 지금은 배열에서 단 하나의 요소만 재선언 하는 것이 불가능하다는 점에 대해서 언급하겠습니다.

진자의 하모닉 운동(Harmonic Motion of Pendulums) 에 대한 논의에서 간략하게 언급했듯이 구성 요소 배열에 하위 수정을 만들 때 구성 요소 내부의 각 변수는 암시적으로 배열로 처리됩니다.예를 들어, 다음 record 정의를 보겠습니다.

record Point
  Real x;
  Real y;
  Real z;
end Point;

Point 구성 요소의 배열을 선언하는 경우를 예로 들면, Point p[5], p.x 에 대한 모든 참조는 5개의 real 변수 배열로 처리됩니다.*즉,* p[1].x, p[2].x, p[3].x, p[4]. xp[5].x 입니다. 이것을 슬라이싱 이라고 합니다. 결론은 아래 첨자(e.g., p.x)를 생략하면 "끝까지 밀려난다"는 것입니다(또는 더 기술적으로는 "언바운드"로 남겨두고 나중에 "바운드"될 수 있음).또한 아래 첨자가 범위(예: :, 1:end, 2:3)로 제공되면 식은 범위의 인덱스에 해당하는 배열의 하위 집합으로 해석합니다.이 모든 것은 구성 요소 배열 등을 포함하는 구성 요소 배열에도 적용됩니다.

다음 예제는 보다 일반적인 경우의 일부를 보여줍니다.

record Vector3D
  Real x[3];
end Vector3D;

model ArrayExample
  Point p[2];
  Point q[2,3];
  Vector3D v[4];
equation
  p.x = {1, 2}; // p[1].x = 1, p[2].x = 2
  q[:,3].y = {4, 5}; // q[1,3].y = 4, q[2, 3].y = 5;
  q.x = [1, 2, 3; 4, 5, 6] // q[1,1].x = 1,
                           // q[1,2].x = 2,
                           // q[2,3].x = 6
  v.x[1] = {1, 2, 3, 4}; // v[1].x[1] = 1, v[2].x[1] = 2,
                         // v[3].x[1] = 3, v[4].x[1] = 4
  v[:].x[1] = {1, 2, 3, 4}; // v[1].x[1] = 1, v[2].x[1] = 2,
                            // v[3].x[1] = 3, v[4].x[1] = 4
  v[2:3].x[1] = {2, 3}; // v[2].x[1] = 2, v[3].x[1] = 3
  v[1].x = {1, 2, 3};   // v[1].x[1] = 1, v[1].x[2] = 2,
                        // v[1].x[3] = 3
end ArrayExample;