- ロトカ=ヴォルテラの方程式は捕食者・被捕食者の個体数が周期的変動をする様子を表した非線形偏微分方程式(Wiki記事)
- 被捕食者(x)は、その個体数に比例して増殖するが、捕食者と出会う確率に応じて減少する
- 捕食者(y)は、その個体数に比例して自然死するが、被捕食者と出会う確率に応じて増殖する
- 次のx,yの関数Vは時間微分が0であることが示せる
- を素直に式変形すれば示せる
- 時間微分が0なのでは時間不変量であって、「保存量」と呼ばれる
- 保存量の関数はどうやったら得られるのかを考えてみる
- であるとき
- であることを利用する
- 今、時間に関して保存される量の関数はである
- は自明であるから、となるようなは保存量となるだろう
- ととを比べると
- であって、はそれぞれx,yのみの関数である
- ここで、x,yのみの関数を用いてと表せれば、
- のとき
- とできて、保存量が確保できる
- 保存量があるということは、「突拍子もない状態」には行かないで済む(かもしれない)と言うことなので、周期的になってくれそう
- を満足する点は固定点と呼ばれるが、そこの近傍を初期値に取れば、周期的になる(なりやすい)
k1<-2
k2<-3
a<-runif(1)
b<-runif(1)
c<-runif(1)
d<-runif(1)
x<-c(d/c*0.9)
y<-c(a/b*0.9)
v<-c(-a/y[1]-b*log(y[1])-(c*x[1]-d*log(x[1])))
Niter<-10000
dt<-100/Niter
for(i in 2:Niter){
dxdt<-a*x[i-1]^k1-b*x[i-1]^k1*y[i-1]
dydt<-c*x[i-1]*y[i-1]^k2-d*y[i-1]^k2
x<-c(x,x[i-1]+dxdt*dt)
y<-c(y,y[i-1]+dydt*dt)
v<-c(v,-a/y[i]-b*log(y[i])-(c*x[i]-d*log(x[i])))
}
par(mfcol=c(1,2))
plot(x,y,type="l")
plot(v,ylim=c(-max(abs(v)),max(abs(v))),type="l")
par(mfcol=c(1,1))
par(mfcol=c(1,2))
plot(x,y,type="l")
matplot(cbind(x,y),type="l")
par(mfcol=c(1,1))