狗追兔子问题
亲爱英文-中秋节资料
实验三
实验问题:
如图所示,有一个猎狗在B点位置发现了一只
兔子正东北方距
离它200米的地方O处,此时兔子开始一8米秒的速度正西北方距
离位120
米的洞口A全速跑去,假设猎狗在追逐兔子的时候始终朝着
兔子的方向全速奔跑,,按要求完成下面的实
验:
(1) 问猎狗能追上兔子的最小速度是多少?
(2)
在猎狗能追上兔子的情况下,猎狗跑过的路程是多少?
(3)
画出猎狗追赶兔子奔跑的曲线图。
(4)
假设在追赶过程中,当猎狗与兔子之间的距离为30米
时,兔子由于害怕, 奔跑的速度每秒减半,而猎
狗却由于兴奋奔跑的
速度每秒增加0.1倍,在这种情况下,再按前面的(1)—(3)完成
实
验任务。
问题分析:
此题是以缉私船追赶走私船为背景的一道数学追击问题。
理论基础:
(x
设t时刻狗的位置:
(
xk
,
y
k
)
追赶方向
k
,y
k
)
,
兔子的位置是:
可用方向余弦表示为:
cos
k
xk
x
k
(
x
k
x
k
)(yk
y
k
)
22
sin
k
y
k
y
k
(
x
k
x
k<
br>)(y
k
y
k
)
22
取时间步长为△t,则在t+△t时,狗的位置
(
x
k1
,y
k<
br>1
)
,可表示为:
x
k1
x
k<
br>x
k
btcos
k
,y
k1
y
k
y
k
btsin
k
之后比较追击点的纵坐标与兔子洞的纵坐标,以判断是否可以追
上。
在第一问中,利用狗的速
度的循环,以是否能在规定范围内追击
到为限制条件,找出能追击到的最小速度,作为狗的最小速度。在
循
环的过程中,避免超出界限而造成无限循环。
运用了if语句,对是否可以追击到进行了选择,以达到预期的
筛选目标。
程序设计流程图:
⑴
.建立狗与兔子的横纵坐标的数组对兔子和狗的坐标赋初值并
赋
值变量按照狗速度的可能值设定循环范围循环的条件(即追击住
的条件)按照数学理论
基础编写循环内容判断是否能在入洞追击
住①是,则退出循环,此时的速度即为狗的最小速度②否
,速度
递加,再次进行循环输出狗的最小速度
⑵
输入狗的速度对坐标以及一些重
要的变量进行初始化赋值进
入循环,循环的条件是是否追击上兔子并且循环中追击的纵坐标不超
过兔子洞的纵坐标按照数学理论基础编写循环内容循环结束
if语句判断追击情况①追击过程
中追击的纵坐标超过兔子洞的
纵坐标,说明在规定距离没有追上,则输出速度太小②追击点的纵
坐标不超过兔子洞的纵坐标,说明在规定距离内兔子被追到了,则输
出追击时间与兔子
的逃跑路程
⑶
根据上面运算时的得到的四个数组,可以画出追击图来
程序内容:
第一问:
a=8;
dogxa=[];cabbitxa=[];dogya=[];cabbitya=[];
d=1;
dogx=-100*sqrt(2);dogy=-100*sqrt(2);c
abbitx=0;cabbity
=0;
t=0;
dt=0.01;
for b=10:0.5:40
dogx=-100*sqrt(2);do
gy=-100*sqrt(2);cabbitx=0;cabbity
=0;
t=0;
while(sqrt((dogx-cabbitx)^2+(dogy-
cabbity)^2)>d&cabbi
ty<200)
t=t+dt;
dogx=dogx+b*dt*(cabbitx-dogx)sqrt((dogx-
cabbitx
)^2+(dogy-cabbity)^2);
dogy=dogy+b*dt*(cabbity-dogy)sqrt((dogx-
cabbitx
)^2+(dogy-cabbity)^2);
cabbitx=-a*cos(pi4)*t;
cabbity=a*sin(pi4)*t;
end
if
cabbity<=60*sqrt(2)
break
end
end
fprintf('the minspeed of dog
id:%2f',b);
第二问:
a=8;
b=17;
d=0.1;
dogxb=[];cabbitxb=[];dogyb=[];cabbityb=[];
dogx=-100*sqrt(2);dogy=-100*sqrt(2);cabbit
x=0;cabbity
=0;
t=0;
dt=0.01;
s=0;
while(sqrt((dogx-cabbitx)^2+(dogy-
cabbity)^2)>d)
t=t+dt;
dogx0=dogx;
dogy0=dogy;
dogx=dogx+b*dt*(cabbitx-dogx)sqrt((cabbitx-
dogx)^2+(
cabbity-dogy)^2);
dogxb=[dogxb,dogx];
dogy=dogy+b*dt*(cabbity-dogy)sqrt((cabbitx-
dogx)^2+(
cabbity-dogy)^2);
dogyb=[dogyb,dogy];
cabbitx=-a*cos(pi4)*t;
cabbity=a*sin(pi4)*t;
cabbitxb=[cabbitxb,cabbitx];
cabbityb=[cabbityb,cabbity];
s=s+sqrt((dogx0-dogx)^2+(dogy0-dogy)^2);
end
fprintf('the length dog run is:%.1f',s);
第三问:
plot(dogxb,dogyb,cabbitxb,cabbityb,'*')
第四问:
①
a=8;
dogxa=[];cabbitxa=[];dogya=[];cabbitya=[];
d=1;
dogx=-100*sqrt(2);dogy=-100*sqrt(2);c
abbitx=0;cabbity
=0;
t=0;
dt=0.01;
for b=8:0.5:40
dogx=-100*sqr
t(2);dogy=-100*sqrt(2);cabbitx=0;cabbity
=0;
t=0;
c=b;
a=8;
while(sqrt((dogx-cabbitx)^2+(dogy-
cabbity)^2)>d&cabbi
ty<60*sqrt(2))
if(sqrt((dogx-cabbitx)^2+(dogy-cabbity)^2)<=30)
b=b*1.1^dt;
a=a*0.5^dt;
end
t=t+dt;
dogx=dogx+b*dt*(cabbitx-
dogx)sqrt((dogx-cabbitx)^2+(
dogy-cabbity)^2);
dogy=dogy+b*dt*(cabbity-
dogy)sqrt((dogx-cabbitx)^2+(
dogy-cabbity)^2);
cabbitx=cabbitx-a*dt*cos(pi4);
cabbity=cabbity+a*sin(pi4)*dt;;
end
if (cabbity<=60*sqrt(2))
b=c;
break
end
end
fprintf('the minspeed of dog is:%2f',b);
②
a=8;
b=15.5;
dogxb=[];cabbitxb=[];dogyb=[];cabbityb=[];
dogx=-100*sqrt(2);dogy=-100*sqrt(2);cabbitx=0;cab
bity
=0;
t=0;
dt=0.01;
s=0;
while(sqrt((dogx-cabbitx)^2+(dogy-
cabbity)^2)>d)
t=t+dt;
if(sqrt((dogx-cabbitx)^2+(dogy-
cabbity)^2)<=30)
b=b*1.1^dt;
a=a*0.5^dt
end
dogx0=dogx;
dogy0=dogy;
dogx=dogx+b*dt*(cabbitx-dogx)sqrt((cabbitx-
dogx)^2+(
cabbity-dogy)^2);
dogxb=[dogxb,dogx];
dogy=dogy+b*dt*(cabbity-dogy)sqrt((cabbitx-
dogx)^2+(
cabbity-dogy)^2);
dogyb=[dogyb,dogy];
cabbitx=cabbitx-a*dt*cos(pi4);
cabbity=cabbity+a*sin(pi4)*dt;
cabbitxb=[cabbitxb,cabbitx];
cabbityb=[cabbityb,cabbity];
s=s+sqrt((dogx0-dogx)^2+(dogy0-dogy)^2);
end
fprintf('the length dog run is:%.1f',s);
③
plot(dogxb,dogyb,cabbitxb,cabbityb,'*')
结果:
第一问:
第二问:
第三问:
第四问:
结果分析与结论:
狗的最小速度为17米秒,路程为110.5m。
当狗受到激励时,狗的最小速度为15.5米秒,路程为250.4。
总结与体会:
1. 许多数学公式的符号十分难输入,致使数学理论表述十分困
难。
2. 需要输入的数据太多,容易出现输入错误,特别是容易遗漏标
点符号.
3.
从编程过程中一开始盲目的套用公式,不仔细理解公式的内
涵,导致公式简单套用,结果与事实不符,经
编程后,认识
到了理解与运用的重要性。
4. 在设立循环条件的时候,没有考虑条件可达到
的精确度范围,
致使循环总是出现无限循环的情况,经检查后改正。
收获:
1.可
以更加熟练的运用Matlab解决一些问题,对用Matlab编程
有了更加深刻的了解。
2.懂得了使用数学软件求解极限,积分等问题的方法.
3.对于追击问题的数学模型有了一定的了解,并能简单的运用。
4.对遇到的一些编程问题有了切身的解决办法,提高了自己的编
程能力。
5.学会并提升了把实际问题转换成数学模型的数学建模的能力。
6.学会了
图像的绘制,数组的建立与扩充的办法,可以自己独立
绘图或建立数组。
while())