Mathematica仿真競爭性Lotka-Volterra方程(3種群)
在生物學上,物種(英語:species)是生物分類的基本單位。物種位于生物分類法中最底級,在屬之下。籠統來講,同一物種的任意兩個性別適當的健康個體,都能夠交配繁殖出具生殖能力的后代。滿足以上條件的最大群體稱為物種。根據演化生物學家恩斯特.麥爾的定義,物種是:能夠相互配育的自然種群的類群,且這些類群與其它的類群在生殖上相互隔離。昆蟲學家陳世驤(1978)對物種所下定義為:物種是繁殖單元,由又連續又間斷的居群所組成;物種是進化單元,是生物系統線上的基本環節,是分類的基本單元。
在生物學上,種群(英語:population)指代在一定空間范圍內同時生活的同種生物的全部個體;或者說是由個體組成,而且能夠進行交配的群體。種群的個體之間一般享有同一個基因庫。
直觀的理解(可能不嚴謹),種群是物種的子集,值的是某物種在一定范圍內的個體集合。比如青蛙是一個物種,這片池塘里的青蛙是一個種群。
下面的論述中,并不嚴格區分物種和種群。
競爭性Lotka-Volterra方程是物種爭奪某些共同資源的種群動態的簡單模型。它們可以進一步推廣到廣義 Lotka-Volterra 方程以包括營養相互作用。
考慮3個具有Logistic動力學的3個種群和,在Lotka-Volterra公式的基礎上添加額外的項來解釋物種的相互作用。因此,競爭性Lotka-Volterra方程是:
這是一個常微分方程組。方程中并不顯含時間,我們稱這樣的ODE是自治的。
這里代表物種對物種種群的影響。注意不必等于。因為是競爭版本,所有值都是非負的。
使用Mathematica來演示給定ODE參數和初始條件下的3物種數目隨時間的演化情況。
(事實上,代碼的框架是通用性質的,很容易修改來仿真其他的更加一般的ODE系統)
Manipulate[
sol=NDSolve[
{
x1'[t]==r1*x1[t]*(1-\[Alpha]11*x1[t]-\[Alpha]12 x2[t]-\[Alpha]13 x3[t]),
x2'[t]==r2*x2[t]*(1-\[Alpha]21*x1[t]-\[Alpha]22 x2[t]-\[Alpha]23 x3[t]),
x3'[t]==r3*x3[t]*(1-\[Alpha]31*x1[t]-\[Alpha]32 x2[t]-\[Alpha]33 x3[t]),
x1[0]==x10,
x2[0]==x20,
x3[0]==x30
},
{x1[t],x2[t],x3[t]},
{t,0,time}
];
Pane[
Grid[{{
Show[
{
ParametricPlot3D[{x1[t],x2[t],x3[t]}/.sol,{t,0,time},
PlotStyle->{Thick,Blue}],
Graphics3D[
{Red,PointSize[Large],Point[{x1[t],x2[t],x3[t]}/.sol/.{t->0}],Green,Point[{x1[t],x2[t],x3[t]}/.sol/.{t->time}]}
]
},
If[range==="fixed",PlotRange->{{0,x1max},{0,x2max},{0,x3max}},PlotRange->All],
BoxRatios->{1,1,1},
If[values,Ticks->Automatic,Ticks->None],
AxesLabel->(Style[#,Blue]&/@(Row/@Transpose[{Table[Subscript[Style["X",Italic],i],{i,3}],If[label,{"\n(Lowest\ntrophic level)","\n(Intermediate\ntrophic level)","\n(Top\npredators)"},{"","",""}]}])),
ImageSize->{400,400},ImagePadding->35
]},
{Text@Grid[{
{
Grid[{
{Row[{
Subscript[Style["X",Italic], 3],
" ("<>ToString[Round[100x3[t]/(x1[t]+x2[t]+x3[t])/.sol/.{t->time}][[1]]]<>"%)"
}]},
{Row[{
Subscript[Style["X",Italic], 2],
" ("<>ToString[Round[100x2[t]/(x1[t]+x2[t]+x3[t])/.sol/.{t->time}][[1]]]<>"%)"
}]},
{Row[{
Subscript[Style["X",Italic], 1],
" ("<>ToString[Round[100x1[t]/(x1[t]+x2[t]+x3[t])/.sol/.{t->time}][[1]]]<>"%)"
}]}
}],
BarChart[Round@Flatten[{x1[t],x2[t],x3[t]}/.sol/.{t->time}],
BarSpacing->0,
BarOrigin->Left,
ChartStyle->{{RGBColor[.1,.9,.1],RGBColor[.4,.6,.4],RGBColor[.7,.3,.7]}},
Axes->None,
LabelingFunction->Left,
AspectRatio->.25,
ImageSize->{200,100}
]
}
},
Alignment->{Right,Left}]}
}],
ImageSize->400
],
Style["initial variable values",Bold],
{{x10,2000,Subscript["X",1]},1,7000,.01,Appearance->"Labeled",ImageSize->Tiny},
{{x20,175,Subscript["X",2]},1,7000,.01,Appearance->"Labeled",ImageSize->Tiny},
{{x30,200,Subscript["X",3]},1,7000,.01,Appearance->"Labeled",ImageSize->Tiny},
Style["parameter values",Bold],
{{r1,2.84,Subscript["r",1]},0,5,.01,Appearance->"Labeled",ImageSize->Tiny},
{{r2,1.5,Subscript["r",2]},0,5,.01,Appearance->"Labeled",ImageSize->Tiny},
{{r3,.62,Subscript["r",3]},0,5,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]11,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]12,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]13,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]21,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]22,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]23,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]31,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]32,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
{{\[Alpha]33,.22},0,1,.01,Appearance->"Labeled",ImageSize->Tiny},
Style["time period",Bold],
{{time,10,""},1,100,.01,Appearance->"Labeled",ImageSize->Tiny},
Style["maximum values on axes",Bold],
{{range,"floating",""},{"fixed","floating"}},
{{x1max,3100,Subscript["X",1]},0,20000,.01,Appearance->"Labeled",ImageSize->Tiny},
{{x2max,300,Subscript["X",2]},0,5000,.01,Appearance->"Labeled",ImageSize->Tiny},
{{x3max,500,Subscript["X",3]},0,5000,.01,Appearance->"Labeled",ImageSize->Tiny},
Style["label trophic levels",Bold],
{{label,False,""},{True,False}},
Style["display values on axes",Bold],
{{values,True,""},{True,False}},
TrackedSymbols->True,SynchronousUpdating->True,
ControlPlacement->Left,AutorunSequencing->{2,5,9,13,15}
]

從上圖可以看到,從紅色點標示的狀態,經過10個時間單位,演化到綠色點表示的狀態。隨時間演化的軌跡線也在圖中給了出來。
這個演示,除去必要的核心功能要點外,可以選擇坐標軸是否顯示數值,選擇靜態/動態設置顯示出的坐標軸的最大值,還可以標定最后物種的數目比例。
最后,有需要歡迎通過公眾號聯系我們.
公zhong號:320科技工作室
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















