猎狗追兔子问题仿真实验报告.docx
《猎狗追兔子问题仿真实验报告.docx》由会员分享,可在线阅读,更多相关《猎狗追兔子问题仿真实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
猎狗追兔子问题仿真实验报告
1.有一只猎狗在B点位置发现了一只兔子在正东北方距离它200米的地方O处,此时兔子开始以8米/秒的速度向正西北方距离为120米的洞口A全速跑去,假设猎狗在追赶兔子的时候始终朝着兔子的方向全速奔跑,用计算机仿真法等多种方法完成下面的实验:
(1)问猎狗能追上兔子的最小速度是多少?
(2)在猎狗能追上兔子的情况下,猎狗跑过的路程是多少?
(3)画出猎狗追赶兔子奔跑的曲线图。
(4)假设在追赶过程中,当猎狗与兔
子之间的距离为30米时,兔子由于害怕,
奔跑的速度每秒减半,而猎狗却由于兴
奋奔跑的速度每秒增加0.1倍,在这种情
况下,再按前面的
(1)—(3)完成实验任务。
Ø问题分析:
(1)以O点为原点,OA为y轴正方向建立平面直角坐标系。
用T(X,Y),G(x,y)分别表示兔子和狗的位置。
用e来表示猎狗速度方向的单位向量。
则
。
则有
,
。
由于兔子的速度是8m/s,狗要追上兔子,速度一定大于8m/s。
我们根据常识估算狗的速度不会超过100m/s。
不妨建立一个for循环,逐个尝试从8开始的速度。
直到得到一个可以使追击到时,T的纵坐标小于等于120的速度。
(2)由于狗是匀速运动,路程s即
(1)中得到的v和t的积。
(3)根据
(1)中的思路,以dt=0.1为时间步长我们可以算得每个时间点T与G的坐标。
这里为了方便描点,不再用向量表示,而是直接用坐标x,y,X,Y表示。
(4)只需要在前面的基础上加上:
①一个if条件,当距离d≤30时,狗的速度vk+1=vk·1.1^dt,兔子的速度uk+1=uk·0.5^dt;②s的计算改为sk+1=sk+vdt。
Ø程序设计:
(1)~
(2)问:
流程图:
否否
是
是
输出v
程序代码:
G=[-200,0];
T=[0,0];%用向量G,T分别表示狗和兔子的坐标
d=0.1;
t=0;dt=0.01;
forv=8:
0.05:
100
G=[-200,0];
T=[0,0];
t=0;
while(norm(G-T)>d&&norm(T)<120)
t=t+dt;
e=T-G;
D=norm(T-G);
e=e/D;
G=G+v*dt*e;
T
(2)=8*t;
end
ifT
(2)<=120
break
end
end
fprintf('狗的最小速度是:
%.2f',v)
s=v*t;
fprintf('狗跑过的距离是:
%.2f',s)
第(3)问:
流程图:
程序代码:
c=-200;
u=8;
v=17.1;
xb=[];yb=[];Xb=[];Yb=[];
d=1;
dt=0.1;
t=0;
x=c;y=0;X=0;Y=0;
holdon
axis([-200,0,0,150])
title('猎狗追兔子')
text(0,120,'A')
text(-200,0,'B')
text(0,0,'O')
while(sqrt((x-X)^2+(y-Y)^2)>d)
t=t+dt;
x=x-v*dt*x/sqrt(x^2+(u*t-y)^2);
xb=[xb,x];
y=y+v*dt*(u*t-y)/sqrt(x^2+(u*t-y)^2);
yb=[yb,y];
Y=u*t;
Yb=[Yb,Y];
end
xb;
yb;
Yb;
Xb=zeros(length(Yb));
plot(xb,yb,'m*',Xb,Yb,'c*')
gtext('猎狗')
gtext('兔子')
第(4)问:
1最小速度:
流程图:
在
(1)的高亮部分后方加上:
是否
程序代码:
u=8;
G=[-200,0];
T=[0,0];%用向量G,T分别表示狗和兔子的坐标
d=0.1;
t=0;dt=0.01;
forv=8:
0.05:
100
G=[-200,0];
T=[0,0];
t=0;
c=v;
u=8;
while(norm(G-T)>d&&norm(T)<120)
if(norm(G-T)<=30)
v=v*1.1^dt;
u=u*0.5^dt;
end
t=t+dt;
e=T-G;
D=norm(T-G);
e=e/D;
G=G+v*dt*e;
T
(2)=T
(2)+u*dt;
end
ifT
(2)<=120
v=c;
break
end
end
fprintf('狗的最小速度是:
%.2f',v)
2模拟及跑过的距离:
流程图:
同上
程序代码:
u=8;
v=15.45;
dt=0.1;
t=0;
s=0;
D=30;
d=1;
m=0;
x=-200;y=0;X=0;Y=0;
holdon
axis([-200,0,0,150])
title('猎狗追兔子')
text(0,120,'A')
text(-200,0,'B')
text(0,0,'O')
while(sqrt((x-X)^2+(y-Y)^2)>d)
if(sqrt((x-X)^2+(y-Y)^2)>D)
t=t+dt;
x=x-v*dt*x/sqrt(x^2+(u*t-y)^2);
y=y+v*dt*(u*t-y)/sqrt(x^2+(u*t-y)^2);
Y=Y+u*dt;
plot(x,y,'r*',X,Y,'b*')
pause(0.1)
else
t=t+dt;
if(m==0||m==1)
u=u/2;
v=1.1*v;
m=0;
end
m=m+dt;
x=x-v*dt*x/sqrt(x^2+(Y+u*dt-y)^2);
y=y+v*dt*(Y+u*dt-y)/sqrt(x^2+(Y+u*dt-y)^2);
Y=Y+u*dt;
plot(x,y,'r+',X,Y,'b+')
pause(0.1)
end
s=s+v*dt;
end
gtext('猎狗')
gtext('兔子')
x,y,X,Y,t,s
Ø结果分析和结论:
(1)~
(2)问
第(3)问:
第(4)问:
1
2
Ø总结和体会:
本题其实整体上采取的一个模拟的思想。
通过一次一次迭代模拟追捕过程。
从本题速度和仿真时,我们可以发现,在单纯的计算时,直接用向量计算可以简化很多步骤。
但是在仿真时,直接描述各个坐标会更为方便。
我们要根据自己的需求选择表示方法。
2.使用计算机仿真方法求解下述问题:
在正方形的四个顶点上各有一人,如下图所示,在某一时刻,四人同时出发以匀速按顺时针方向追赶下一个人,如果他们始终保持对准目标,试确定每个人的行进路线。
问题分析:
以左边为y轴,下边为x轴建立平面直角坐标系。
可以得到四个人的点坐标为O(0,0),A(200,0),B(,200,200),C(0,200)。
以点O为例:
设t时刻,点O,C的坐标分别为
,点O的速度沿单位向量:
,从而得出
。
其他四个点也用类似的方法,即可得到所有点在每个时间点的坐标。
Ø程序设计:
流程图:
否
是
程序代码:
holdon
axis([0,200,0,200])
O=[0,0];
A=[200,0];
B=[200,200];
C=[0,200];
d1=norm(C-O);
d2=norm(O-A);
d3=norm(A-B);
d4=norm(B-C);
v=10;
t=0.1;
whiled1>2
plot(O
(1),O
(2),'r+');
plot(A
(1),A
(2),'b*');
plot(B
(1),B
(2),'gp');
plot(C
(1),C
(2),'yo');
e1=C-O;d1=norm(e1);
e2=O-A;d2=norm(e2);
e3=A-B;d3=norm(e3);
e4=B-C;d4=norm(e4);
e1=e1/d1;%表示点O的方向,下同
e2=e2/d2;
e3=e3/d3;
e4=e4/d4;
O=O+v*t*e1;
A=A+v*t*e2;
B=B+v*t*e3;
C=C+v*t*e4;
pause(0.1)
end
Ø结果分析和结论:
Ø总结和体会:
由于题中并没有给出具体数据,在设计程序时,许多标准都要自己考虑。
因为本题我们给正方形设定的边长为200,因此为了缩短模拟时间,速度设定为10,同时,由于边长较大,如果按照上题,判别精度d设为1的话,将会进入死循环。
因此,我们在设计时应当注意模拟的精度的选择。