ローレンツ方程式とは,カオス的振る舞いを示す非線形方程式の1つである. \[\begin{align*} \dfrac{dx}{dt}=&-px+py\\ \dfrac{dy}{dt}=&-xz+rx-y\\ \dfrac{dz}{dt}=&xy-bz \end{align*}\] ローレンツ(Lorentz)の1963年の論文の中で, \(p=10, r=28, b=8/3\)という設定が紹介されている.
以下ではこのローレンツ方程式のシミュレーションを行う. 単純のためライブラリを使うが,レポートではできる限りライブラリを使わず,アルゴリズムの勉強をしてほしい.
必要なライブラリを読み込む.
library(deSolve)
##
## Attaching package: 'deSolve'
##
## 以下のオブジェクトは 'package:graphics' からマスクされています:
##
## matplot
library(rgl)
パラメーターを設定する.
parameters <- c(s=10, b=8/3, r=28)
initial <- c(x=0, y=0.1, z=0)
times <- seq(0, 20, 0.1)
ローレンツ方程式を解いて,その結果をoutに出力する.
Lorentz <- function(t, state, parameters) {
with(as.list(c(state, parameters)), {
dx <- s * (y-x)
dy <- r * x - y - x * z
dz <- -b * z + x * y
list(c(dx,dy,dz))
})
}
out <- ode(y = initial, times = times, func = Lorentz, parms = parameters)
その結果をcx,cy,czにコピーしながら動画として再生する.
imax <- nrow(out)
cx <- rep(NA,imax)
cy <- rep(NA,imax)
cz <- rep(NA,imax)
library(scatterplot3d)
xlim <- c(min(out[,"x"]),max(out[,"x"]))
ylim <- c(min(out[,"y"]),max(out[,"y"]))
zlim <- c(min(out[,"z"]),max(out[,"z"]))
for(i in 1:imax){
cx[i] <- out[i,"x"]
cy[i] <- out[i,"y"]
cz[i] <- out[i,"z"]
scatterplot3d(cx,cy,cz,xlim=xlim,ylim=ylim,zlim=zlim,type="l")
}