连续系统模拟的一般方法就是首先建立系统的连续模型,然后转换为一个离散模型,并对该模型进行模拟。下面是一个追逐问题。
在一个正方形ABCD的4个顶点处各站一个人。在某一个时刻,4个人同时出发,均以匀速v走向顺时针的下一个人,假设他们每一个人的方向始终保持对准对方,则最终将按螺旋状曲线汇合在中心点O,试求出来这种情况下每个人的行走轨迹。
对于这个问题,我们可以建立一个平面坐标系,以时间间隔为 进行采样,在每一个时刻t 计算每个人在下一个时间t+时的坐标。假设甲追赶乙,甲的坐标为,乙的坐标为,那么甲在t+ 的坐标为,其中
如果我们选取足够小的 ,模拟到甲乙的距离小于v 为止。我们假设正方形ABCD的四个顶点分别为A(0,1),B(1,1),C(1,0),D(0,0)。R语言代码如下
plot(c(0,1,1,0),c(1,1,0,0),cex=1.5,pch=19,col=1:4,xlab=" ",ylab=" ")#画出四个点
#cex控制圆点的大小
text(0,1,labels="A",adj=c(0.5,1.3))
text(1,1,labels="B",adj=c(1.5,0.5))
text(1,0,labels="C",adj=c(0.3,-0.8))
text(0,0,labels="D",adj=c(-0.5,0.1))
#绘制中心点
points(0.5,0.5,pch=21,cex=1.2)
text(0.5,0.5,,labels="O",adj=c(-1.0,0.3))
#计算出来的个点位置存入矩阵X,y中
delta_t<-0.01;
n<-220
x<-matrix(0,nrow=5,ncol=n);
x[,1]<-c(0,1,1,0,0)
y<-matrix(0,nrow=5,ncol=n);
y[,1]<-c(1,1,0,0,1)
d<-c(0,0,0,0)
for(j in 1:(n-1))
{
for(i in 1:4)
{
d[i]<-sqrt((x[i+1,j]-x[i,j])^2+(y[i+1,j]-y[i,j])^2)
x[i,j+1]<-x[i,j]+delta_t*(x[i+1,j]-x[i,j])/d[i]
y[i,j+1]<-y[i,j]+delta_t*(y[i+1,j]-y[i,j])/d[i]
}
#x[5,j+i]=x[1,j+1],y[5,j+1]=y[1,j+i]
x[5,j+1]<-x[1,j+1];
y[5,j+1]<-y[1,j+1];
}
#画出相应的曲线
for(i in 1:4)
lines(x[i,],y[i,],lwd=2,col=i+1)
轨迹图如下:
在plot()函数中的一些参数代表的意义如下:
pch 指定用于绘制散点的符号。绘制的点往往略高于或低于指定的坐标位置,仅pch=“.”无这个问题。
lty 指定画线用的线型。缺省值lty=1是实线。从2开始是各种虚线。
lwd 指定线粗细,以标准线粗细为单位。这个参数影响数据曲线的线宽以及坐标轴的线宽。
col 指定颜色,可应用于绘点、线、文本、填充区域、图象。颜色值也可以用象”red”,”blue” 这样的颜色名指定。
font 用来指定字体的整数。一般font=1是正体,2是 黑体,3是 斜体,4是 黑斜体。
font.axisfont.labfont.mainfont.sub 分别用来指定坐标刻度、坐标轴标签、标题、小标题所用的字体。
adj 指定文本相对于给定坐标的对齐方式。取0表示左对齐,取1表示右对齐,取0.5表示居中。此参数的值实际代表的是出现在给 定坐标左边的文本的比例,比如adj=-0.1的效果是文本出现在给定坐标位置的右边并空出相当于文本10%长度的距离。
cex 指定字符放大倍数。