饿狼追兔问题数学建模
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
饿狼追兔问题
摘要
本文研究饿狼追兔问题,是在给定狼兔相对位置,以及兔子巢穴位置的情况下求解的,狼的速度是兔子速度两倍,在不考虑其他任何因素的情况下研究狼能否追上兔子的问题。
首先,我们对问题进行了适当的分析,然后根据已知条件建立了狼的运动轨迹微分模型。
其次,根据建好的模型,运用MATLAB编程,然后仿真画出了饿狼和野兔的运动轨迹图。
再次,用解析方法将建立的模型求解,并给出该问题的结论,准确的回答题目。
最后,用数值方法求解,将所求与前面所求进行对比,也给出结论,回答题目。并将两种方法做相应比较。
结论:野兔可以安全回巢
关键词:算法高阶常微分方程
§1.1问题的提出
在自然界中,各种生物都有它的生活规律,它们钩心斗角,各项神通,在饿狼追野兔的工程中,饿狼的速度是野兔的二倍,但是野兔有自己的洞穴,野兔在跑到自己洞穴之前被狼捉住,野兔就将会成为饿狼的囊中之物;如果野兔在饿狼捉住自己之前跑回到自己的洞穴,那么野兔就保住小命,得以生还。
图1-1-1为饿狼追野兔的两条曲线,其中绿线表示野兔,图中的箭头表示的是野兔的奔跑方向,野兔从远点开始沿y轴正方向运动,其洞穴在坐标为(0,60)的位置;红线为饿狼的运动轨迹,,图中的剪头表示饿狼追逐野兔的方向,饿狼从坐标为(100,0)的方向追逐野兔,饿狼的速度是野兔速度的二倍。建立数学模型需研究一下几个问题:(1)设野兔的速度我v0,饿狼的速度为v1,野兔的奔跑方向是沿y轴正方向奔跑,而饿狼的方向是一直指向野兔的方向,即饿狼的运动的轨迹某一时候的切线指向同一时刻的野兔的位置。建立饿狼追野兔的运动轨迹微分模型。
(2)根据建立的饿狼运动轨迹得微分模型,作出饿狼与野兔的运动轨迹图形。
(3)用解析方法求解,即根据第二步作出的饿狼渔业突地运动轨迹图形,分析兔子能否安全回到巢穴,即野兔的运动曲线与饿狼的运动曲线的交点是在点(0,60)-野兔巢穴的上面还是下面。
(4)用数值方法求解。根据第一步建立的关于二郎追野兔的运动轨迹微分模型,进行数学运算,讨论兔子能否安全回到巢穴,即所求交点的y值大于60还是小于60.
§1.2问题的分析
(1)分析饿狼追野兔的运动模型。在1.1中已经说了,饿狼追野兔过程中,野兔的目的是要在饿狼捉住自己之前跑到自己的巢穴,假如恶狼知道野兔巢穴的具体位置,根据题目所给,饿狼完全可以先兔子跑到其巢穴,然后在那里守株待兔,野兔则难逃饿狼之口。那样饿狼的轨迹就是一条直线,只需简单的数学计算就可以完成。
(2)但这是一个理想化的实际问题,在这个问题中由于饿狼不可能知道兔子巢穴的具体位置,因此它的速度的方向永远是朝着兔子的,兔子一直向北跑,相对于饿狼来说兔的角度在时刻的变化,所以最终饿狼的轨迹是一条曲线。而兔子能否活下来,还是一个需要经过具体较复杂计算的问题。
§1.3数值方法求解
初始时刻(t=0)兔子位于原点(0,0),饿狼位于(100,0);兔子以常速度v0沿y轴跑,饿狼在t时刻的位置为(x,y),其速度为v1=2v0;饿狼在追兔子过程中一直向着兔子的方向,则:
饿狼在t时刻其追赶曲线的切线方程为
Y-y=(dy/dx)*(X-x)=[(dy/dt)/(dx/dt)]*(X-x)
其中(X,Y)为切线上动点。
又饿狼在追兔子过程中一直向着兔子的方向,则t时刻兔子(0,v0t)在切线上,所以
v0t-y=[(dy/dt)/(dx/dt)]*(0-x)
从而饿狼追赶轨迹由下方程组确定
(dx/dt)*( v0t-y)= (dy/dt)*(-x) (1)
(dx/dt)2+(dy/dt)2=v12 (2)
由(1)有(dy/dx)*(-x)= v0t-y,两边对t求导并化简
(d2y/dx2)* (dx/dt) *(-x)= v0 (3)
由(2)有(dx/dt)2{1+[(dy/dt)/(dx/dt)]2}=v12
即dx/dt=-v1/[1+(dy/dx)2]1/2 (注这里去负号,是由这个追赶曲线——上图,决定的) 代入(3),并把v1=2v0代入并化简得
(d2y/dx2)*x=[1+(dy/dx)2]1/2/2 (4)
这是一个二阶微分方程,它满足初始条件y(100)=0
令p= dy/dx,这dp/dx= d2y/dx2,这(4)化为
(dp/dx)*x=[1+p2]1/2/2,可分离变量求得
ln{p+[1+p2]1/2/2}=0.5*lnx+c
又p(100)=0,所以c=-ln10,从而
p+[1+p2]1/2/2=x1/2/10
这p=( x1/2/10-10/x1/2)/2
即dy/dx=( x1/2/10-10/x1/2)/2,从而
y=(x-300)*x1/2/30+c,又y(100)=0
则
y=(x-300)*x1/2/30+200/3
令x=0,得
y(0)=200/3>60
故兔子没有有危险
§1.4解析方法求解(matlab创新求解)在本题题目中给出了参考的matlab的方程式
【注】常微分方程高阶初值问题的MATLAB库函数为:ode45。
语法为:[t,Y] =ode45(odefun,tspan,y0)
例如函数:function dy = rigid(t,y)
dy = zeros(3,1); % a column vector
dy(1) = y(2) * y(3);
dy(2) = -y(1) * y(3);
dy(3) = -0.51 * y(1) * y(2);
设置选项:
options = odeset('RelTol',1e-4,'AbsTol',[1e-4 1e-4 1e-5]);
求解得:
[t,Y] = ode45(@rigid,[0 12],[0 1 1],options);
画出解函数曲线图形:
plot(T,Y(:,1),'-',T,Y(:,2),'-.',T,Y(:,3),'.')
但是我们决定不用题目中给的函数,而是采用另一个函数:
r = dsolve('eq1,eq2,...', 'cond1,cond2,...', 'v'),这个函数的作用是把常微分方程(无论是一阶还是高阶)转化成不带有求导的一般性方程,但是一般情况下经过这种函数转化之后,得到的方程式比较复杂,但是如果把已知条件也带进dsolve函数中,得到的函数就会比较简单。
另外还要注意的一点就是在matlab中的Dy,D2y都默认为是对t的求导,所以在用desolve函数的时候,要把所有的x换成t,然后还要借助y=subs(y,t,’x’)函数,把求得的函数式的自变量改为x。下面开始分析问题模型。
由§1.3中的(4)方程(d2y/dx2)*x=[1+(dy/dx)2]1/2/2,并且有已知条件:
y(100)=0;
dy/dx(100)=0。