使用R实现一个简单的连续系统模拟

26 篇文章 88 订阅
13 篇文章 5 订阅
        连续系统就是指状态随着时间连续变化的系统。我们通过计算机模拟对连续系统得到的结果只是近似的,但如果只要这种近似达到了一定的精度,也就可以满足要求。
连续系统模拟的一般方法就是首先建立系统的连续模型,然后转换为一个离散模型,并对该模型进行模拟。下面是一个追逐问题。
            在一个正方形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 指定字符放大倍数。

以下是一个使用Kalman滤波器对线性连续系统进行滤波的程序示例(使用MATLAB语言): % 定义状态空间模型 A = [1 0.5; 0 1]; % 系统矩阵 B = [1; 0]; % 输入矩阵 C = [1 0]; % 观测矩阵 Q = [0.1 0; 0 0.1]; % 系统噪声协方差矩阵 R = 1; % 观测噪声协方差 % 初始化状态向量和协方差矩阵 x0 = [0; 0]; % 初始状态向量 P0 = [1 0; 0 1]; % 初始协方差矩阵 % 生成模拟输入信号和观测信号,加入噪声 N = 100; % 仿真时间长度 u = sin(linspace(0, 2*pi, N)); y = C * lsim(A,B,u) + sqrt(R) * randn(N,1); % 实现Kalman滤波器 xhat = zeros(2,N); % 存储估计状态向量 Phat = zeros(2,2,N); % 存储估计协方差矩阵 xhat(:,1) = x0; Phat(:,:,1) = P0; for k = 2:N % 预测步骤 xhat(:,k) = A*xhat(:,k-1) + B*u(k-1); Phat(:,:,k) = A*Phat(:,:,k-1)*A' + Q; % 更新步骤 K = Phat(:,:,k)*C'/(C*Phat(:,:,k)*C'+R); % 计算Kalman增益 xhat(:,k) = xhat(:,k) + K*(y(k) - C*xhat(:,k)); Phat(:,:,k) = (eye(2) - K*C)*Phat(:,:,k); end % 绘图显示结果 t = linspace(0, 2*pi, N); subplot(211); plot(t, u, t, y); axis([0 2*pi -1.5 1.5]); legend('输入信号', '观测信号'); subplot(212); plot(t, xhat(1,:), t, xhat(2,:)); axis([0 2*pi -1.5 1.5]); legend('状态1估计', '状态2估计'); 注意:此程序只是一个简单的示例,实际应用中需要进一步考虑各种因素,如模型的精确度、噪声的分布、状态的可观测性等。另外,Kalman滤波器在大多数情况下都需要根据具体应用进行优化和调整,以获得更好的性能和效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值