使用R實現一個簡單的連續系統模擬

連續系統就是指狀態隨著時間連續變化的系統。我們通過計算機模擬對連續系統得到的結果只是近似的,但如果只要這種近似達到了一定的精度,也就可以滿足要求。

連續系統模擬的一般方法就是首先建立系統的連續模型,然後轉換為一個離散模型,並對該模型進行模擬。下面是一個追逐問題。

在一個正方形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=" ")#畫出四個點 n#cex控制圓點的大小 ntext(0,1,labels="A",adj=c(0.5,1.3)) ntext(1,1,labels="B",adj=c(1.5,0.5)) ntext(1,0,labels="C",adj=c(0.3,-0.8)) ntext(0,0,labels="D",adj=c(-0.5,0.1)) n#繪製中心點 npoints(0.5,0.5,pch=21,cex=1.2) ntext(0.5,0.5,,labels="O",adj=c(-1.0,0.3)) n#計算出來的個點位置存入矩陣X,y中 ndelta_t<-0.01; nn<-220 nx<-matrix(0,nrow=5,ncol=n); nx[,1]<-c(0,1,1,0,0) ny<-matrix(0,nrow=5,ncol=n); ny[,1]<-c(1,1,0,0,1) nd<-c(0,0,0,0) nfor(j in 1:(n-1)) n { n for(i in 1:4) n { n d[i]<-sqrt((x[i+1,j]-x[i,j])^2+(y[i+1,j]-y[i,j])^2) n x[i,j+1]<-x[i,j]+delta_t*(x[i+1,j]-x[i,j])/d[i] n y[i,j+1]<-y[i,j]+delta_t*(y[i+1,j]-y[i,j])/d[i] n } n #x[5,j+i]=x[1,j+1],y[5,j+1]=y[1,j+i] n x[5,j+1]<-x[1,j+1]; n y[5,j+1]<-y[1,j+1]; n } n#畫出相應的曲線 nfor(i in 1:4) n lines(x[i,],y[i,],lwd=2,col=i+1) n

軌跡圖如下:

在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 指定字元放大倍數。

----------------------------------------------

作者:王亨

出處:王亨的博客專欄

公眾號:跟著菜鳥一起學R語言

大家也可以加小編微信:tswenqu,進R語言中文社區 交流群,可以跟各位老師互相交流

推薦閱讀:

數據學習之路—每周好文分享(第三期)
」數據咖「的自我修鍊
機器學習之前,讓「大熊貓」先嘗一嘗數據的味道
數據分析的魅力和坑
數據化管理在餐飲業中的應用

TAG:R编程语言 | 数据分析 | 数据挖掘 |