接線場
微分方程式の解の振る舞いをみるために接線場を描いてみる。
以下で与えられるロジスティック方程式を考える。
接線場は t-x平面の各点に傾き の小さな線分を描いたものである。
logis <-function(t,x,a=1){ a*x*(1-x)}#点(t1,x1)を通り, 傾きが slope の直線 TheLine <-function(t1,x1,slope,t){ slope(t1,x1)*(t-t1)+x1 } tv <- xv <- seq(-1.5,1.5,by=0.1) slopefield <-function(tv,xv,f){ tx <-expand.grid(x=tv,y=xv)data.frame(t=tx[,1], x=tx[,2], t2=tx[,1]+0.05, x2=TheLine(tx[,1],tx[,2],f,tx[,1]+0.05))} out <- slopefield(tv,xv,logis)library(ggplot2)library(cowplot) ggplot(out,aes(x=t,y=x))+ geom_segment(aes(xend=t2,yend=x2))
このグラフから なる解は 1 に近づくこと、なる解は tが大きくなるとき無限大に発散することがわかる。
また x=0 と x=1 で傾きが 0、解は定数関数になることがわかる。
とはいえロジスティック方程式は解析的に解けるので接線場のありがたみが少ない。
今度は、
の接線場を描いてみる。
こんな風だ。
f <-function(t,x,a=1,h=1){ a*x*(1-x)+h*(1+sin(2*pi*t))} out <- slopefield(tv,xv,f)library(ggplot2)library(cowplot) ggplot(out,aes(x=t,y=x))+ geom_segment(aes(xend=t2,yend=x2))
方向場
を考える。
接線場と同じように各点 において x成分が y、y成分が -xのベクトルを考えることで、解曲線の動きを把握できる。
ただし、ベクトルをそのまま図示すると互いに重なって見づらくなるので、ベクトルの向きを保ったまま適当に縮小して、方向場を描く。
f <-function(x,y){ c(y,-x)} xv <- yv <- seq(-1,1,by=0.1) vectorfield <-function(f,xv,yv){ xy <-expand.grid(x=xv,y=yv) xy2 <-mapply(f,xy[,1],xy[,2])data.frame(x=xy[,1],y=xy[,2],x2=xy2[1,],y2=xy2[2,])} out <-vectorfield(f,xv,yv)library(ggplot2) ggplot(out,aes(x=x,y=y))+ geom_segment(aes(xend=x+x2/10,yend=y+y2/10),arrow = arrow(length = unit(0.3,"cm")))
参考文献
Hirsch・Smale・Devaney 力学系入門―微分方程式からカオスまで
- 作者: Morris W.Hirsch,S. Smale,R. L. Devaney,桐木紳,三波篤郎,谷川清隆,辻井正人
- 出版社/メーカー:共立出版
- 発売日: 2007/08
- メディア:単行本
- クリック: 10回
- この商品を含むブログ (6件) を見る
expand.grid関数・outer関数を使って2重forループを美しく書く - My Life as a Mock Quant
そういえば接線場という言葉はあまり見かけない。slope field に他の訳語があるのだろうか。