- こちらで常微分方程式を0からやってみている
- 常微分方程式があって、変数t(時間のようなもの)があるときにという関数があって、そのr階の導関数をとしたときに、と表されるとしよう
- この常微分方程式の関数にはtが入っていない。これは、t(時間)については、「平等な世界」を仮定していることに相当する
- はたった一つの方程式であるが、という関係式がn-1個あって、定義から前提としていることを忘れない
- さて、今、はの関数であるから、にそれぞれ軸を与えた空間を考えて、その空間上の点にの値を与えるスカラー関数を考えよう
- このn次元空間はというベクトルが与えられたベクトル場と考えることもできる
- n次元のベクトル場の空間なので、任意の点から軌道が生じる
- この軌道が発散しないようにしたい
- 一つの方法として、原点から点の位置への位置ベクトルとこの点の運動ベクトルとが必ず直交するようなベクトル場であれば、原点に落ち込むこともない代わりに、発散もしないだろう
- そのような条件は
- これはだろう
- Rで書けば以下のようになるが、これって、なんだろう???
- この話は、こちらとこちらに続く
n<-3
Niter<-10000
dx<-1/1000
Ys<-matrix(0,Niter,n+1)
loop<-TRUE
while(loop){
Ys[1,]<-c(rnorm(n),0)*0.001
if(sum(Ys[1,1:(n-2)]*Ys[1,2:(n-1)])<0)loop<-FALSE
}
shogen<-sign(Ys[1,])
TmpFx<-function(ys,Equal=FALSE,a=0.1){
tmp<-0
ret<-0
for(i in 1:(length(ys)-1)){
tmp<-tmp+ys[i]*ys[i+1]
}
ret<--tmp/ys[length(ys)]
if(!Equal){
ret<-ret+sign(ys[length(ys)])*a
}
ret
}
Ys[1,n+1]<-TmpFx(Ys[1,1:n])
alpha<-0.01
for(i in 2:Niter){
V<-c(Ys[i-1,2:(n+1)],0)
Vnorm<-sqrt(sum(V^2))
Ys[i,]<-Ys[i-1,]+dx/max(c(Vnorm))*V
Ys[i,n+1]<-TmpFx(Ys[i,1:n],Equal=TRUE)
zeroq<-sum(Ys[i-1,2:(n+1)]*Ys[i-1,1:n])
if(abs(zeroq)>0.0001)print(zeroq)
tmpshogen<-sign(Ys[i,])
}
matplot(Ys[,1:n],type="l")
plot(as.data.frame(Ys))
library(rgl)
plot3d(Ys[,1:3],col=rainbow(1000),xlim=range(Ys[,1:3]),ylim=range(Ys[,1:3]),zlim=range(Ys[,1:3]))