Found an issue with the book? Report it on Github.
이 섹션에서는 이미 수행한 작업을 기반으로 재사용 가능한 구성 요소 모델을 구축하는 방법을 이해하기 위해 Lotka-Volterra 모델을 다시 한 번 다시 살펴보겠습니다.그 다음 단계로 개별 지역에 대한 재사용 가능한 모델(각각 일반적인 인구 역학이 있음)을 만든 다음 이러한 지리적 지역을 마이그레이션(이주) 모델과 함께 연결할 것입니다.
이 섹션의 모델은 모두 일반적인 Lotka-Volterra 개체군 역학을 사용하여 두 개체군(하나는 토끼이고 다른 하나는 여우)으로 구성된 지역을 나타내는 다음 모델을 사용합니다.모델의 모델리카 소스 코드는 다음과 같습니다.
within ModelicaByExample.Subsystems.LotkaVolterra.Components;
model TwoSpecies "Lotka-Volterra two species configuration"
// Import several component models from ModelicaByExample.Components.LotkaVolterra
import ModelicaByExample.Components.LotkaVolterra.Components.RegionalPopulation;
import ModelicaByExample.Components.LotkaVolterra.Components.Reproduction;
import ModelicaByExample.Components.LotkaVolterra.Components.Starvation;
import ModelicaByExample.Components.LotkaVolterra.Components.Predation;
parameter Real alpha=0.1 "Birth rate";
parameter Real gamma=0.4 "Starvation coefficient";
parameter Real initial_rabbit_population=10 "Initial rabbit population";
parameter Real initial_fox_population=10 "Initial fox population";
parameter Real beta=0.02 "Prey (rabbits) consumed";
parameter Real delta=0.02 "Predators (foxes) fed";
ModelicaByExample.Components.LotkaVolterra.Interfaces.Species rabbits
"Population of rabbits in this region"
annotation ...
ModelicaByExample.Components.LotkaVolterra.Interfaces.Species foxes
"Population of foxes in this region"
annotation ...
protected
RegionalPopulation rabbit_population(
initial_population=initial_rabbit_population,
init=RegionalPopulation.InitializationOptions.FixedPopulation) "Rabbit population"
annotation ...
Reproduction reproduction(alpha=alpha) "Reproduction of rabbits"
annotation ...
RegionalPopulation fox_population(
init=RegionalPopulation.InitializationOptions.FixedPopulation,
initial_population=initial_fox_population)
annotation ...
Starvation fox_starvation(gamma=gamma) "Starvation of foxes"
annotation ...
Predation fox_predation(beta=beta, delta=delta)
"Foxes eating rabbits"
annotation ...
equation
connect(reproduction.species, rabbit_population.species)
annotation ...
connect(fox_predation.a, rabbit_population.species)
annotation ...
connect(fox_starvation.species, fox_population.species)
annotation ...
connect(fox_population.species, fox_predation.b)
annotation ...
connect(rabbit_population.species, rabbits)
annotation ...
connect(fox_population.species, foxes)
annotation ...
end TwoSpecies;
이 구성 요소의 다이어그램은 다음과 같이 렌더링됩니다.
이 모델은 섹션 뒤에 제시하는 모델에서 지역 인구 역학의 기초로 사용합니다.
4개의 연결되지 않은 영역으로 구성된 모델을 구축하는 것으로 시작하겠습니다. 이러한 모델의 모델리카 소스 코드는 매우 간단합니다.
within ModelicaByExample.Subsystems.LotkaVolterra.Examples;
model UnconnectedPopulations "Several unconnected regional populations"
Components.TwoSpecies A "Region A"
annotation ...
Components.TwoSpecies B "Region B"
annotation ...
Components.TwoSpecies C "Region C"
annotation ...
Components.TwoSpecies D "Region D"
annotation ...
annotation ...
end UnconnectedPopulations;
이 모델의 다이어그램은 똑같이 간단합니다.
이 모델을 시뮬레이션하는 경우 각 모집단은 초기 조건이 동일하므로 동일한 궤적을 따라야 합니다. 다음 선도는 이것이 사실임을 보여줍니다.
잠시 후 마이그레이션의 영향을 살펴보겠습니다. 그러나 마이그레이션이 미치는 영향을 충분히 이해하려면 서로 다른 지역의 진화에 약간의 차이점을 도입해야 합니다. 따라서 UnconnectedPopulations
모델의 초기 조건을 수정하여 일부 지역적 변형을 도입해 보겠습니다.
within ModelicaByExample.Subsystems.LotkaVolterra.Examples;
model InitiallyDifferent "Multiple regions with different initial populations"
extends UnconnectedPopulations(
B(initial_rabbit_population=5, initial_fox_population=12),
C(initial_rabbit_population=12, initial_fox_population=5),
D(initial_rabbit_population=7, initial_fox_population=7));
end InitiallyDifferent;
이 모델을 시뮬레이션하면 각 지역의 인구 역학이 약간씩 다릅니다.
이제 4개의 연결되지 않은 지역에서 인구 역학을 시뮬레이션했으므로 이주가 이러한 역학에 미칠 수 있는 영향에 주목하는 것이 필요합니다.
마이그레이션을 위해 다음 모델리카 모델을 살펴보겠습니다.
within ModelicaByExample.Subsystems.LotkaVolterra.Components;
model Migration "Simple 'diffusion' based model of migration"
parameter Real rabbit_migration=0.001 "Rabbit migration rate";
parameter Real fox_migration=0.005 "Fox migration rate";
ModelicaByExample.Components.LotkaVolterra.Interfaces.Species rabbit_a
"Rabbit population in Region A"
annotation ...
ModelicaByExample.Components.LotkaVolterra.Interfaces.Species rabbit_b
"Rabbit population in Region B"
annotation ...
ModelicaByExample.Components.LotkaVolterra.Interfaces.Species fox_a
"Fox population in Region A"
annotation ...
ModelicaByExample.Components.LotkaVolterra.Interfaces.Species fox_b
"Fox population in Region B"
annotation ...
equation
rabbit_a.rate = (rabbit_a.population-rabbit_b.population)*rabbit_migration;
rabbit_a.rate + rabbit_b.rate = 0 "Conservation of rabbits";
fox_a.rate = (fox_a.population-fox_b.population)*fox_migration;
fox_a.rate + fox_b.rate = 0 "Conservation of foxes";
annotation ...
end Migration;
이 모델은 연결된 지역에서 토끼와 여우의 개체수를 살펴보고 지역 간 개체수 차이에 비례하는 이동 속도를 지정합니다.즉, 한 지역에 다른 지역보다 더 많은 토끼가 있으면 토끼는 인구가 많은 지역에서 인구가 적은 지역으로 이동합니다.이것은 사실상 이동의 "확산" 모델이며 반드시 생태학에 기반을 둔 것은 아닙니다.지역 간 인구 역학을 변경하기 위해 각 지역에서 구현된 효과 위에 추가 효과를 추가할 수 있는 방법의 예로 간단히 소개하는 것 입니다.
이전에 연결되지 않은 지역을 마이그레이션 경로와 연결하면 다음 예시와 같습니다.
within ModelicaByExample.Subsystems.LotkaVolterra.Examples;
model WithMigration "Connect populations by migration"
extends InitiallyDifferent;
Components.Migration migrate_AB "Migration from region A to region B"
annotation ...
Components.Migration migrate_BC "Migration from region B to region C"
annotation ...
Components.Migration migrate_CD "Migration from region C to region D"
annotation ...
equation
connect(migrate_CD.rabbit_b, D.rabbits) annotation ...
connect(migrate_CD.rabbit_a, C.rabbits) annotation ...
connect(migrate_BC.rabbit_b, C.rabbits) annotation ...
connect(migrate_CD.fox_b, D.foxes) annotation ...
connect(migrate_BC.fox_b, C.foxes) annotation ...
connect(migrate_CD.fox_a, C.foxes) annotation ...
connect(migrate_BC.fox_a, B.foxes) annotation ...
connect(migrate_BC.rabbit_a, B.rabbits) annotation ...
connect(migrate_AB.fox_b, B.foxes) annotation ...
connect(migrate_AB.rabbit_b, B.rabbits) annotation ...
connect(migrate_AB.fox_a, A.foxes) annotation ...
connect(migrate_AB.rabbit_a, A.rabbits) annotation ...
end WithMigration;
결과 시스템 다이어그램은 다음과 같습니다.
이 시스템을 시뮬레이션하면 서로 다른 지역의 인구 역학이 동기화되지 않은 상태에서 시작하지만 결국에는 반복되는 패턴으로 안정화되는 것을 볼 수 있습니다.
이전에는 Lotka-Volterra 방정식을 포식, 기아 및 번식을 나타내는 구성 요소로 전환했습니다. 이 섹션에서 이러한 구성 요소 모델을 사용하여 특정 지역의 인구 역학을 나타내는 하위 시스템 모델을 구축한 다음,이러한 하위 시스템을 서로 다른 지역 간의 마이그레이션 효과를 구성한 계층적 시스템 모델로 연결할 수 있었습니다.