ケィオスの時系列解析メモランダム

時系列解析,生体情報学,数学・物理などの解説です.

【Rで数値解析】カオスアトラクター (Lorenz attractor)の描画

今回は,Rを使った微分方程式数値計算についての説明というよりも,数値計算結果を3次元プロットする方法の紹介です.私が以下で使っている方法は,ベストではないかもしれませんが,とりあえず,3次元空間内の軌道を立体的に描くことができます.結果はこんな感じです.

ローレンツアトラクターの描画例

使ったスクリプトは以下です.事前にdeSolveパッケージをRにインストールしてください.

# 数値計算にdeSolveパッケージを使いました
#install.packages("deSolve")
require(deSolve)
### ローレンツモデルの定義 ###################
Lorenz.eq <- function(t,state,parameters) {
 with(as.list(c(state, parameters)), {
  dxdt <- sigma*(y-x)
  dydt <- rho*x-y-x*z
  dzdt <- -beta*z+x*y
  list(c(dxdt, dydt, dzdt))
 })
}
# よく使われている制御変数の値を使用
control.parms <- c(rho=28,sigma=10,beta=8/3)
# 初期条件はトランジェントを捨てずにすませるためアトラクタに近い点をとった.
ini.cond <- c(x=-2.292091, y=0.09829925, z=24.50526)
# 時間ステップの設定
time.step <- seq(0, 100, 0.01)
#######################################
# deSolveを使って数値計算
PROF <- ode(y=ini.cond,times=time.step,func=Lorenz.eq,parms=control.parms)
###
# グラフの描画
x.range <- 25
x <- y <- c(-x.range, x.range)
z <- matrix(rep(0,4), nrow=2)
###
par(mfrow=c(3,1))
plt1 <- persp(x,y,z,theta=30,xlim=c(-x.range,x.range),ylim=c(-x.range,x.range),zlim=c(0,2*x.range), phi=10,expand=1,cex.lab=1.4)
lines(trans3d(PROF[,"x"],PROF[,"y"],rep(0,length(PROF[,"z"])), pmat=plt1), col = 8)
lines(trans3d(PROF[,"x"],PROF[,"y"],PROF[,"z"], pmat=plt1), col = 2)
#
plt1 <- persp(x,y,z,theta=25,xlim=c(-x.range,x.range),ylim=c(-x.range,x.range),zlim=c(0,2*x.range), phi=45,expand=1,cex.lab=1.4)
lines(trans3d(PROF[,"x"],PROF[,"y"],rep(0,length(PROF[,"z"])), pmat=plt1), col = 8)
lines(trans3d(PROF[,"x"],PROF[,"y"],PROF[,"z"], pmat=plt1), col = 2)
#
plt1 <- persp(x,y,z,theta=20,xlim=c(-x.range,x.range),ylim=c(-x.range,x.range),zlim=c(0,2*x.range), phi=90,expand=1,cex.lab=1.4)
lines(trans3d(PROF[,"x"],PROF[,"y"],rep(0,length(PROF[,"z"])), pmat=plt1), col = 8)
lines(trans3d(PROF[,"x"],PROF[,"y"],PROF[,"z"], pmat=plt1), col = 2)