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}

]



Mathematica仿真競爭性Lotka-Volterra方程(3種群)的圖1


從上圖可以看到,從紅色點標示的狀態,經過10個時間單位,演化到綠色點表示的狀態。隨時間演化的軌跡線也在圖中給了出來。

這個演示,除去必要的核心功能要點外,可以選擇坐標軸是否顯示數值,選擇靜態/動態設置顯示出的坐標軸的最大值,還可以標定最后物種的數目比例。

最后,有需要歡迎通過公眾號聯系我們.

公zhong號:320科技工作室

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

1