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

로트카-볼테라 방정식(Lotka-Volterra Systems)

로트카-볼테라 방정식(Lotka-Volterra Systems)

지금까지 열, 전기 및 기계 관련 예시를 살펴보았는데, 사실상 이것들은 모두 공학적 예시였습니다. 그러나 모델리카는 공학적인 분야에만 엄격하게 제한되어 사용하지 않았습니다. 이 점을 보완해서 보여주기 위해 이 섹션에서는 포식자와 피식자 종 간의 관계에 기반한 공통 생태계 역학 모델을 제시하겠습니다.사용할 방정식은 [Lotka]-[Volterra] 방정식입니다.

고전 로트카-볼테라(Classic Lotka-Volterra

고전적인 Lotka-Volterra 모델 은 두 종으로 구성 됩니다. 한 종은 "피식자" 종입니다. 이 섹션에서 피식자 종의 개체수는 x 로 표시됩니다. 다른 종은 인구가 y 로 표시되는 "포식자" 종입니다.

Lotka-Volterra 시스템에는 세 가지 중요한 효과가 있습니다.첫 번째는 "피식자" 종의 번식입니다. 번식은 인구에 비례한다고 가정합니다. 본인이 화학 반응에 익숙한 사람이라면,`질량 작용의 법칙 <http://en.wikipedia.org/wiki/Law_of_mass_action>`_ [Guldberg] 과 개념적으로 동일 하게 이해하면 됩니다. 질량 작용의 법칙에 익숙하지 않은 사람이라면, 환경에 더 많은 잠재적 짝이 있을수록 번식이 더 잘 일어난다라는 개념으로 이해하면 됩니다. 이것을 수학적으로 다음과 같이 나타낼 수 있습니다.

\dot{x}_{r} = \alpha x

여기서 x 는 피식자 개체수이고, \dot{x}_r 번식으로 인한 피식자 개체 수의 변화이며, \alpha 는 성공적인 번식 가능성에 대한 비례 상수입니다.

고려해야 할 다음 효과는, 포식자 종의 기아 상태(starvation) 입니다. 먹을 수 있는 "피식자"가 충분하지 않으면 포식자 종은 죽을 것입니다. 기아 상태를 모델링할 때 경쟁의 영향을 고려하는 것이 중요합니다. 다시 비례 관계를 가지지만 이번에는 역으로 작용합니다. 왜냐하면 먹이 번식과 달리 주위에 포식자가 많을수록 굶주릴 가능성이 높기 때문입니다. 이것은 재생산과 거의 같은 방식으로 수학적으로 표현됩니다.

\dot{y}_{s} = -\gamma y

여기서 y 는 포식자 개체수이고, \dot{y}_s 굶주림으로 인한 포식자 개체수의 변화이며 \gamma 는 기아 가능성에 대한 비례 상수입니다.

마지막으로 고려해야 할 마지막 효과는 "포식", , 포식자 종에 의한 먹이 종의 소비입니다. 포식자가 없다면 먹이 종은 (적어도 수학적으로는) 기하급수적으로 증가할 것입니다. 따라서 포식은 먹이 종의 개체수를 억제하는 효과를 가집니다. 마찬가지로 먹이가 없으면 포식자 종은 단순히 죽을 것입니다. 따라서 포식은 이 효과의 균형을 맞추고 포식자 개체수가 0이 되는 것을 방지합니다. 다시 말하지만, 비례 관계가 있습니다. 그러나 이번에는 실제로 개념적으로 질량 작용의 법칙(앞서 언급한 화학적 법칙)과 유사한 이중 선형 관계입니다. 이 관계는 단순히 포식자가 먹이를 찾아서 소비할 기회가 먹이와 포식자의 개체수에 비례한다는 사실을 수학적으로 표현한 것입니다. 이 특정 효과는 두 종이 모두 관련되어야 하기 때문에 이 수학적 관계는 번식 및 기아와는 약간 다른 구조를 갖습니다.이를 아래와 같은 수식으로 표현할 수 있습니다.

\begin{split}\dot{x}_p &= -\beta x y \\ \dot{y}_p &= \delta x y\end{split}

여기서 \dot{x}_p 포식으로 인한 피식자 개체수 감소이고, \dot{y}_p 포식에 의한 포식자 개체수 증가입니다. \beta 는 먹이 섭취 가능성을 나타내는 비례 상수이고 \delta 는 포식자가 번식을 하기에 충분한 추가 영양을 가질 가능성을 나타내는 비례 상수입니다.

다양한 효과를 고려한 각 모집단의 전반적인 변화는 다음 두 방정식으로 나타낼 수 있습니다.

\begin{split}\dot{x} &= \dot{x}_r + \dot{x}_p \\ \dot{y} &= \dot{y}_p + \dot{y}_s\end{split}

이전에 표현한 관계를 사용하여 이 두 방정식의 각 오른쪽 항을 다음과 같이 확장할 수 있습니다.

\begin{split}\dot{x} &= x (\alpha - \beta y) \\ \dot{y} &= y (\delta x - \gamma)\end{split}

지금까지 이 장에서 배운 내용을 사용하여 이러한 방정식을 모델리카로 변환하는 것은 매우 간단 합니다.

model ClassicModel "This is the typical equation-oriented model"
  parameter Real alpha=0.1 "Reproduction rate of prey";
  parameter Real beta=0.02 "Mortality rate of predator per prey";
  parameter Real gamma=0.4 "Mortality rate of predator";
  parameter Real delta=0.02 "Reproduction rate of predator per prey";
  parameter Real x0=10 "Start value of prey population";
  parameter Real y0=10 "Start value of predator population";
  Real x(start=x0) "Prey population";
  Real y(start=y0) "Predator population";
equation
  der(x) = x*(alpha-beta*y);
  der(y) = y*(delta*x-gamma);
end ClassicModel;

이 시점에서 아직 논의하지 않은 단 한 가지가 있는데, 그것은 xy 에 대한 start 속성의 존재입니다. 이전 섹션 물리적인 이해(Getting Physical)NewtonCoolingWithUnits 예제에서 본 것처럼 변수에는 지정할 수 있는 다양한 속성이 있습니다.(사용 가능한 속성에 대한 자세한 내용은 다음 섹션인 내장 자료형(Built-In Types) 에서 확인).이전에 unit 속성에 대해 논의하긴 했지만 start 속성은 여기에서 처음 언급 됩니다.

관찰력 있는 독자라면 x0y0 파라미터 변수의 존재와 이들이 초기 모집단을 나타낸다는 사실을 알아차렸을 것입니다.이전 예제들을 기반으로 이러한 초기 조건이 다음과 같이 모델에 표현될 것으로 예상했을 수 있습니다.

model ClassicModelInitialEquations "This is the typical equation-oriented model"
  parameter Real alpha=0.1 "Reproduction rate of prey";
  parameter Real beta=0.02 "Mortality rate of predator per prey";
  parameter Real gamma=0.4 "Mortality rate of predator";
  parameter Real delta=0.02 "Reproduction rate of predator per prey";
  parameter Real x0=10 "Initial prey population";
  parameter Real y0=10 "Initial predator population";
  Real x(start=x0) "Prey population";
  Real y(start=y0) "Predator population";
initial equation
  x = x0;
  y = y0;
equation
  der(x) = x*(alpha-beta*y);
  der(y) = y*(delta*x-gamma);
end ClassicModelInitialEquations;

그러나 ClassicModel 예제에서는 작은 지름길을 선택해서 사용 했습니다. 초기화(Initialization) 섹션에서 곧 논의하겠지만 변수에 직접 start 속성 값을 지정하여 초기 조건을 지정할 수 있습니다.

이 접근 방식에는 장점과 단점이 모두 있다는 점은 주목할 가치가 있습니다. 그중 하나가 유연성 입니다. start 속성은 실제로 연결이 되어 있다기 보다는 힌트에 가깝습니다. 모델리카 컴파일러가 특정 변수를 상태(, 초기 조건이 필요한 변수)로 식별하며, **그리고 나서**``initial equation`` 섹션을 통해 모델에 이미 명시적으로 지정된 초기 조건이 충분하지 않은 경우 연관된 변수의 초기 조건으로 start 속성을 대체할 수 있습니다.다르게 표현하면, 초기 조건이 필요한데 초기화가 되지 않는 경우 start 속성을 "대비책 초기 조건(fallback initial condition)"으로 생각할 수 있습니다.

주의해야 할 start 속성에는 몇 가지 단점이 있습니다. 첫째, 힌트일 뿐이며 시뮬레이션 소프트웨어는 이를 완전히 무시할 수 있습니다. 다음으로, 시뮬레이션 소프트웨어 마다 처리할 변수의 상태에 대해 서로 다른 선택을 할 수 있기 때문에 무시할지 여부도 예측하기 어렵습니다.

이러한 단점을 모두 피하는 한 가지 방법은 내장 자료형(Built-In Types) 섹션에서도 논의된것 처럼``fixed`` 속성을 사용하는 것입니다. fixed 속성을 이용해서 start 속성이 반드시 초기 조건으로 사용되어야 한다고 컴파일러에 알리는 데 사용할 수 있습니다.즉, initial equation 은 다음과 같은데,

  Real x;
initial equation
  x = 5;

startfixed 속성을 사용하는 다음 선언과 동일합니다.

Real x(start=5, fixed=true);

마지막으로 또 다른 문제는 start 속성도 "오버로드(overloaed)"된다는 것입니다. 이것은 실제로 두 가지로 다르게 사용됨을 의미합니다. 해당하는 변수가 상태가 아니고, "상호작용하는 변수(interation variable)"(, 비선형 방정식 시스템에 따라 해가 달라지는 변수)인 경우 start 속성은 모델리카 컴파일러의 초기 추측 값(, 비선형 솔버의 초기 상호작용에 의한 계산에서 변수에 사용된 값)으로 사용할 수 있습니다.

start 속성을 지정할지 여부는 주어진 초기 조건을 얼마나 엄격하게 적용할지에 따라 다릅니다.그것은 아는 내용에 대해서 시뮬레이션 언어로 변환한 경험이 있어야 하며, 이 장의 범위를 벗어납니다.그러나 장단점에 대한 기본적인 설명과 함께 다양한 옵션이 있다는 점을 적어도 지적할 가치가 있다고 생각 합니다.

초기화 방법(initialization method)을 사용하면 이러한 모델들의 결과는 동일합니다. Lotka-Volterra 시스템의 일반적인 동작은 다음 선도에서 볼 수 있습니다.

/static/_images/LVCM.svg

각 모집단의 주기적인 행동에 유의해서 살펴 보겠습니다. 처음에는 기존 식량 공급으로 지원할 수 있는 것보다 더 많은 포식자가 있습니다. 존재하는 포식자는 찾을 수있는 모든 먹이를 먹습니다. 그럼에도 불구하고 약간의 기아가 발생하고 포식자 개체수가 감소합니다. 이 기간 동안 포식자가 피식자을 소비하는 비율이 너무 높아서 피식자 종이 번식하는 비율이 포식자에게 손실된 종을 보충하기에 충분하지 않아 피식자 개체군도 감소합니다.

어떤 시점에서 포식자 개체수가 너무 낮아져 피식자 종의 번식률이 포식자가 먹이를 소비하는 속도보다 더 커지고 피식자 종이 반등하기 시작합니다. 포식자 종의 개체수가 반등하는 데 시간이 더 오래 걸리기 때문에 피식자 종은 현재 포식자에 의해 사실상 억제되지 않는 성장을 하게 됩니다. 결국, 시스템이 원래의 포식자와 먹이 개체군으로 돌아갈 때까지 포식자 개체군은 풍부한 먹이로 인해 반등하기 시작하고 전체 주기가 무한히 반복됩니다.

시스템이 계속해서 동일한 초기 조건으로 되돌아간다는 사실(물론 수치 오류 무시)은 시스템에 대한 가장 흥미로운 점 중 하나입니다.이것은 Lotka-Volterra 방정식 시스템이 실제로 비선형이라는 사실을 고려할 때 훨씬 더 놀랍습니다.

정상상태 초기화(Steady State Initialization)

종 개체군의 이러한 극심한 변동이 일부 바람직하지 않은 생태학적 결과를 가져왔다고 상상해 봅시다.그러한 경우 이러한 변동을 줄이거나 심지어 제거할 수 있는 것이 무엇인지 이해하는 것이 유용할 것입니다. 간단한 접근법은 개체군을 평형 상태로 유지하는 것입니다. 그러나 이러한 "정지(quiescent)" 상태로 값을 결정하기 위해서 모델을 어떻게 해야할 까요?

답은 초기 조건에 있습니다. 포식자와 피식자 종 모두에 대한 초기 개체군을 지정하는 대신에 시스템이 평형 상태에 있다는 사실을 표현하는 다른 방정식으로 시스템을 초기화하도록 선택할 수 있습니다.(이전에 논의된 모델의 FirstOrderSteady 에서 이 트릭을 사용했다는 것을 기억할 수 있습니다.다행스럽게도, 이와 같은 (혹은 이 이외에도 더욱 많은) 유용한 형태의 초기 조건을 지정할 수 있을 정도로 초기화에 대해 모델리카는 풍부한 구현 방법을 제공합니다.

시스템이 평형 상태에서 시작되도록 하려면 그 평형 상태라는 것이 무엇인지 정의하기만 하면 됩니다. 수학적으로 말하면 다음 두 조건이 충족되면 시스템이 평형 상태에 있습니다.

\begin{split}\dot{x} &= 0 \\ \dot{y} &= 0\end{split}

모델리카 모델에서 이를 표현 하려면 다음과 같이 initial equation 섹션에서 이 방정식을 사용하기만 하면 됩니다.

model QuiescentModel "Find steady state solutions to LotkaVolterra equations"
  parameter Real alpha=0.1 "Reproduction rate of prey";
  parameter Real beta=0.02 "Mortality rate of predator per prey";
  parameter Real gamma=0.4 "Mortality rate of predator";
  parameter Real delta=0.02 "Reproduction rate of predator per prey";
  Real x "Prey population";
  Real y "Predator population";
initial equation
  der(x) = 0;
  der(y) = 0;
equation
  der(x) = x*(alpha-beta*y);
  der(y) = y*(delta*x-gamma);
end QuiescentModel;

강조 표시된 초기 방정식의 존재가 이 모델과 이전 모델의 주요 차이점 입니다. 이 모델을 보면 보여지는 초기 방정식이 정확히 무엇을 의미하는지 궁금할 것입니다. 결국 풀어야 할 것은 xy 입니다.그러나 이러한 변수는 초기 방정식 나타나지도 않습니다.그러면 어떻게 문제를 해결할 수 있었던 것일까요?

이 질문에 대한 답은 x(t) y(t) 함수가 초기 방정식에서 정의된 미분 방정식을 통합하여 시작하면서 문제를 푼다는데 있습니다. 시뮬레이션 중에 x \dot{x} 가 다음 방정식에 의해 "결합"되는 것을 볼 수 있습니다.

x(t) = \int_{t_0}^{t_f} \dot{x}\ \mathrm{d}x + x(t_0)

(물론 y \dot{y} 사이에도 유사한 관계가 존재합니다.)

그러나 시스템 초기화 중(즉,, 초기 조건을 풀때) 이 관계는 유지되지 않습니다. 따라서 이 경우 x \dot{x} 사이에 "결합"이 없습니다( y \dot{y} 도 마찬가지). 즉, \dot{x} 또는 \dot{y} 를 아는 것 만으로 x 또는 y 를 계산하는 방법을 알 수 있는 것이 아닙니다. 결과적으로 초기화 문제의 경우에 독립변수는 x , y , \dot{x} \dot{y} 4개를 고려해야합니다.

반면에, 시뮬레이션 하는 동안에는 \dot{x} x 에 결합하여 문제를 풉니다. 따라서 적분 방정식은 x 를 푸는 데 사용하는 방정식입니다. 그러나 초기화 중에는 해당 방정식을 사용할 수 없으므로 시뮬레이션 중에 수행할 각 결합에 대한 추가 방정식이 필요합니다.

결론은, 초기화 중에 네 가지 다른 방정식이 있어야지만 문제를 해결 할 수 있습니다. QuiescentModel 의 경우 이 네 가지 방정식은 다음과 같습니다.

\begin{split}\dot{x} &= 0 \\ \dot{x} &= x \ (\alpha - \beta y) \\ \dot{y} &= 0 \\ \dot{y} &= y \ (\delta x - \gamma)\end{split}

이러한 방정식이 서로 모순되지 않음 을 이해하는 것이 매우 중요합니다. 만약, 프로그래밍을 주로 했던 사람의 경우(우변이 좌변에 대입된다고 생각하는 경우)에는 두 방정식을 처음보고 " \dot{x} 가 뭡니까? 0입니까? 아니면 x (\alpha - \beta y) 입니까?"라는 질문을 할 수 있습니다. 그에 대한 답은 둘 다 입니다. 두 방정식이 모두 참(true)이 아닐 이유가 없습니다.

여기서 기억해야 할 필수 사항은 이것이 대입문이 아닌 방정식 이라는 것입니다. 다음 방정식 표현은 수학적으로 동일하며 x y 를 풀 수 있는 방법을 이전 방정식 보다는 명확하게 보여줍니다.

\begin{split}\dot{x} &= 0 \\ \dot{y} &= 0 \\ x (\alpha - \beta y) &= \dot{x} \\ y (\delta x - \gamma) &= \dot{y}\end{split}

이 형식에서는 x y 값이 결과에 도달하는 방법을 인식하기가 조금 더 쉽습니다. 가장 먼저 주목해야 할 점은 x y 에 대해서 명시적으로 바로 풀 수 없다는 것입니다. 다른 말로 표현하면, 이 방정식의 오른쪽에 x 를 표현하지 않으면서, x=... 형식으로 재정렬할 수 없습니다. 결국은 x y 둘다 이 수식에 있어서 연립방정식 이라는 사실을 다루어야 합니다.

그러나 이 시스템이 비선형이라는 사실로 인해 상황은 더욱 복잡해(일련의 명시적 방정식으로 문제는 풀기 위해 선형 대수학을 사용할 수 없는 이유) 집니다. 사실은, 이 방정식을 주의 깊게 연구하면 두 가지 잠재적 해결 방법이 있다는 사실을 발견할 수 있습니다. 한 가지 방법은 자명한 방식이고( x=0;y=0 ) 다른 하나는 그렇지 않습니다.

그렇다면 QuiescentModel 을 시뮬레이트하면 어떻게 될까요? 그 질문에 대한 답은 아래 그림과 같은 결과를 확인 할 수 있습니다.

/static/_images/LVQM.svg

피식자와 포식자 개체수가 0인 너무 뻔한 해결 방법을 보았습니다. 이 경우, 이러한 모든 효과가 인구가 바뀌지 않는 현상(, 0)에 비례하기 때문에,번식, 포식 또는 기아가 발생하지 않습니다. 그러나 이것은 관심을 가지는 문제에 대한 해결책이 아닙니다.

이 방정식 시스템은 비선형이기 때문에 두 가지 해가 있습니다. 앞서 보여준 비선형 솔버를 피해서 뻔한 해결 방법으로 귀결되는 것을 해결하려면 어떻게 해야 할까요? 전통적인-로트카-볼테라 모델에 대해 논의 할때, 주의를 기울였다면 이미 답에 대한 힌트를 알게 되었을 것 입니다.

start 속성이 오버로드되었음을 다시 생각 해보겠습니다. 고전 로트카-볼테라(Classic Lotka-Volterra 모델에 대해 논의하는 동안, start 속성의 목적 중 하나는 start 속성이 있는 변수가 상호 작용하는 변수로 선택된 경우에는 초기 추측 값을 제공하는 것이라는 사실을 알게 되었습니다. QuiescentModel 에서 xy 변수는 비선형 방정식 시스템을 사용하여 해결해야 하기 때문에 실제로 상호 작용하는 변수입니다. 즉, 앞서와 같은 뻔한 해결 방안을 피하려면 이전에 보여준 값에서 "멀리 떨어진" (또는 적어도 추구하는 뻔하지 않은 해결방법에 가깝게) xy 변수 모두에 start 속성에 대한 값을 지정해야 합니다. 예를 들어:

model QuiescentModelUsingStart "Find steady state solutions to LotkaVolterra equations"
  parameter Real alpha=0.1 "Reproduction rate of prey";
  parameter Real beta=0.02 "Mortality rate of predator per prey";
  parameter Real gamma=0.4 "Mortality rate of predator";
  parameter Real delta=0.02 "Reproduction rate of predator per prey";
  Real x(start=10) "Prey population";
  Real y(start=10) "Predator population";
initial equation
  der(x) = 0;
  der(y) = 0;
equation
  der(x) = x*(alpha-beta*y);
  der(y) = y*(delta*x-gamma);
end QuiescentModelUsingStart;

이 모델은 원래 찾고 있던 것과 더 일치하는 일련의 초기 조건으로 변경되어 집니다(, 포식자와 피식자 종 모두에 대해서 인구가 0이 아닌 값).

/static/_images/LVQMUS.svg

내장 자료형(Built-In Types) 섹션에서 곧 하겠지만 start 속성의 기본값은 0이다 라는 점을 기억할 필요가 있습니다. 이것이 원래의 QuiescentModel 을 시뮬레이션 해봤을 때 본것 처럼, 인구가 0인 지극히 뻔한 해결 책에 정확히 도달하게 된 이유입니다.왜냐하면, 그것은 설정했던 추측 값이였고 정확한 문제에 대한 해결 방안중 하나 였기 때문에 다른종류의 문제 풀이 방법에 대한 고려나 반복해서 다른 연산을 찾을 필요가 없었기 때문입니다.

반복 피하기(Avoiding Repetition)

이미 Lotka-Volterra 방정식을 기반으로 하는 몇 가지 다른 모델(ClassicModel , QuiescentModelQuiescentModelUsingStart )을 보았습니다. 그들 모두의 공통점을 눈치채셨나요? 자세히 살펴보면 거의 모든 부분에서 공통점이 있고 실제로 차이점 이 거의 없다는 것을 알 수 있습니다!

소프트웨어 공학에서 "중복은 모든 악의 근원"이라는 말이 있습니다. 여기서 상황은 다르지 않습니다(모델리카 코드가 결국은 소프트웨어이기 때문에 이 말은 모델리카 코드에서도 작은 영향을 미치는 말이 아닙니다.)지금까지 작성한 코드는 유지하기가 매우 귀찮습니다.이는 발견한 모든 버그가 각각의 모델에서 모두 수정되어야 하기 때문입니다. 또한 만든 모든 개선 사항도 각 모델에 각각 적용해야 합니다. 지금까지는 상대적으로 적은 수의 모델만 다루고 있습니다.하지만, 모델 개발에 대한 이러한 종류의 "복사 및 붙여넣기" 접근 방식은 모델 간에 약간의 차이만 있는 모델에서는 기하급수적으로 문제를 초래할 것입니다.

그래서 이것에 대해서 무엇으로 대책 해야 할 까요? 객체 지향 프로그래밍 언어에는 기본적으로 중복 코드의 양을 줄이기 위해 존재하는 두 가지 메커니즘이 있습니다. 그것들은 앞으로 컴포넌트(Components) 장에서 다룰 예정인 (여기서 간단히 소개할) 포함(composition)상속(inheritance) 입니다

QuiescentModelUsingStart 예제를 자세히 살펴보면 원래 ClassicModel 버전과 거의 차이가 없음을 알 수 있습니다. 사실 유일한 실제 차이점은 다음과 같습니다.

model ClassicModel "This is the typical equation-oriented model"
  parameter Real alpha=0.1 "Reproduction rate of prey";
  parameter Real beta=0.02 "Mortality rate of predator per prey";
  parameter Real gamma=0.4 "Mortality rate of predator";
  parameter Real delta=0.02 "Reproduction rate of predator per prey";
  parameter Real x0=10 "Start value of prey population";
  parameter Real y0=10 "Start value of predator population";
  Real x(start=x0) "Prey population";
  Real y(start=y0) "Predator population";
equation
  der(x) = x*(alpha-beta*y);
  der(y) = y*(delta*x-gamma);
end ClassicModel;
model QuiescentModelUsingStart "Find steady state solutions to LotkaVolterra equations"
  parameter Real alpha=0.1 "Reproduction rate of prey";
  parameter Real beta=0.02 "Mortality rate of predator per prey";
  parameter Real gamma=0.4 "Mortality rate of predator";
  parameter Real delta=0.02 "Reproduction rate of predator per prey";
  Real x(start=10) "Prey population";
  Real y(start=10) "Predator population";
initial equation
  der(x) = 0;
  der(y) = 0;
equation
  der(x) = x*(alpha-beta*y);
  der(y) = y*(delta*x-gamma);
end QuiescentModelUsingStart;

즉, 유일한 실제 차이점은 initial equation 섹션(원래 ClassicModel 에는 이미 두 변수 xy 에 대한 0이 아닌 start 값이 포함되어 있음) 입니다.이상적으로는 단순히 모델과 다른 모델 간의 차이점을 기준으로 모델을 정의함으로써 중복 코드를 피할 수 있습니다. 결론부터 이야기 하면, 모델리카에서는 extends 키워드가 정확히 제공하는 기능 입니다. 이를 고려해서 살펴 보면, QuiescentModelUsingStart 모델에 대해서 다음과 같이 대체 해서 사용할 수 있습니다.

model QuiescentModelWithInheritance "Steady state model with inheritance"
  extends ClassicModel;
initial equation
  der(x) = 0;
  der(y) = 0;
end QuiescentModelWithInheritance;

extends 키워드의 존재에 주목해야 합니다. 개념적으로 이 "extends 절"은 단순히 컴파일러에게 다른 모델(이 경우 ClassicModel )의 내용을 정의 중인 모델에 삽입하도록 요청합니다. 이런 식으로 내용을 반복하지 않고 ClassicModel 에서 모든 것을 복사(또는 "상속")합니다. 결과적으로 QuiescentModelWithInheritance 는 추가 초기 방정식 세트가 삽입된 ClassicModel 과 동일 합니다.

그러나 물려받은 모델에 있는 것을 정확히 똑같이 받기를 원하지 않는 경우는 어떻게 해야할 까요?예를 들어 gammadelta 파라미터의 값을 변경하려면 어떻게 해야 할까요?

모델리카는 extends 를 사용할 때 일련의 "수정"을 포함하도록 허용하여 이를 처리합니다. 이러한 수정 사항은 아래와 같이 상속되는 모델의 이름 뒤에 옵니다.

model QuiescentModelWithModifications "Steady state model with modifications"
  extends QuiescentModelWithInheritance(gamma=0.3, delta=0.01);
end QuiescentModelWithModifications;

단순히 생각하면, ClassicModel 에서 상속할 수 있었겠지만, 이 경우에는 초기 조건을 설정하기 위해서 초기 방정식을 다시 정의 해야 합니다.그러나 대신 QuiescentModelWithModifications 에서 상속함으로써 개의 서로 다른 모델의 콘텐츠(모델에 대한 정의와 초기화)를 동시에 재사용 함으로써 한 번도 변수의 선언을 재정의 하지 않을 수 있습니다.

[Lotka]

Lotka, A.J., "Contribution to the Theory of Periodic Reaction", J. Phys. Chem., 14 (3), pp 271–274 (1910)

[Volterra]

Volterra, V., Variations and fluctuations of the number of individuals in animal species living together in Animal Ecology, Chapman, R.N. (ed), McGraw–Hill, (1931)

[Guldberg]

C.M. Guldberg and P. Waage,"Studies Concerning Affinity" C. M. Forhandlinger: Videnskabs-Selskabet i Christiana (1864), 35