- こちらで、2次元正円を2次元周回曲線に対応付ける関数について考えた
- 対応関数は解けないことも多いので、RのrootSolveパッケージを使うことも書いた
- ロトカ=ヴォルテラのx,y対称な曲線を描いてみる(
- うまくいっているように見える(こちらで紹介したロトカ=ヴォルテラの曲線描図プログラムを少し改変して、始点を指定できるようにすることで、2方法の曲線が重なることを示した)
- 別の関数でも描ける。この関数ではで値が0でありそれは最小値。
- さらに、ロトカ=ヴォルテラと同様にが定義域
library(rootSolve)
t<-seq(from=0,to=1,by=0.01)*2*pi
x1<-cos(t)
y1<-sin(t)
x2<-matrix(0,length(x1),2)
y2<-matrix(0,length(x1),2)
funx <- function (x) x-log(x)-1-R^2/(2*sqrt(2))
funy <- funx
for(i in 1:length(x1)){
R<-x1[i]
All <- uniroot.all(funx,c(0,100),maxiter=10000)
if(length(All)>1)x2[i,1:length(All)]<-All
if(length(All)==1)x2[i,]<-rep(All,length(x2[1,]))
}
for(i in 1:length(x1)){
R<-y1[i]
All <- uniroot.all(funy,c(0,100),maxiter=10000)
if(length(All)>1)y2[i,1:length(All)]<-All
if(length(All)==1)y2[i,]<-rep(All,length(y2[i,]))
}
minx2<-apply(x2,1,min)
maxx2<-apply(x2,1,max)
miny2<-apply(y2,1,min)
maxy2<-apply(y2,1,max)
lotkaVolterra2 <- function (a, dt, x0,y0, n) {
x <- rep(0,n)
y <- rep(0,n)
x[1] <- x0
y[1] <- y0
for (ii in 2:n) {
x[ii] = x[ii-1] + x[ii-1]*(1-y[ii-1])*dt
y[ii] = y[ii-1] + a*y[ii-1]*(x[ii-1]-1)*dt
}
list(x=x,y=y)
}
xlim<-ylim<-c(min(x2,y2),max(x2,y2))
plot(c(minx2,minx2,maxx2,maxx2),c(miny2,maxy2,miny2,maxy2),cex=1,col="light blue",xlim=xlim,ylim=ylim)
xy<-lotkaVolterra2(a=1,0.001,minx2[10],miny2[10],10000)
par(new=TRUE)
plot(xy$x,xy$y,xlim=xlim,ylim=ylim,cex=0.1)