饿狼追兔模型研究

更新时间:2024-02-01 00:32:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

数学建模

辽宁工程技术大学

数 学 建 模 课 程 成 绩 评 定 表

学 期 姓 名 专 业 班 级 课程名称 数学建模 论文题目 高阶常微分方程模型—饿狼追兔问题 评定指标 分值 得分 知识创新性 20 理论正确性 20 内容难易性 15 评 结合实际性 10 知识掌握程度 15 定 书写规范性 10 标 工作量 10 准总成绩 100 评语: 任课教师 时 间 09年 月 日 备 注 - 1 -

年珊珊:饿狼追兔问题

饿狼追兔模型研究

摘要:本文建立狼的运动轨迹微分模型;在各种假设的情况下,通过数形结合的直观形象

的画出兔子与狼的运动轨迹图形;采用解析方法和数值方法,研究兔子与狼的运行轨迹,编写matlab程序建立追击问题的数值模型。

关键词:饿狼追兔 数值解析 微分方程 求解

1 问题的背景

1.1 问题的背景

狼追兔子问题是欧洲文艺复兴时代的著名人物达.芬奇提出的一个数学问题。现有一只兔子、一匹狼,兔子位于狼的正西100米处,假设兔子与狼同时发现对方并一起起跑,兔子往正北60米处的巢穴跑,而狼在追兔子。已知兔子、狼是匀速跑且狼的速度是兔子的两倍。建立狼的运动轨迹微分模型。画出兔子与狼的运动轨迹图形。用解析方法求解,问兔子能否安全回到巢穴,用数值方法求解,问兔子能否安全回到巢穴。狼在追赶过程中所形成的轨迹就是追击曲线。狼是否会在兔子跑回洞穴之前追赶上兔子呢?为了研究狼是否能够追上兔子,可以先考虑求出狼追兔子形成的追击曲线,然后根据曲线来确定狼是否能够追上兔子。

2 模型的假设

2.1将问题转化为图形如下

- 2 -

数学建模

2.1.1图形说明

建立直角坐标系:兔子初始位置向东为x轴,兔子的正北方方向为y轴,设点A为狼的初始位置,点O为兔子的初始位置,点B为兔子巢穴的位置,参照图(1)。

2.2 主要假设

2.2.1 假设狼始终以兔子为目标,将二者看做两个运动的点。 2.2.2 假设外界条件对饿狼和兔子的运行轨迹没有任何影响。

3 符号说明

S0 狼初始位置距离兔子巢穴的位置

B 兔子t时间后运行的位置 S B点距离O点距离 T 运行经历的时间 v 兔子的运行速度 V 狼的运行速度

r 兔子与狼的速度比

4 分析、建立模型及模型求解

4.1 模拟方法:通过已假设的条件,可知狼始终对准兔子,用参数方程

x=x(t);y=y(t) t>=0

来描述饿狼的运动轨迹,兔子做匀速直线运动,在t时刻兔子的位置是O点距B点距离s=v*t,因此当饿狼追击到点D的位置时,其速度指向点B,由几何关系有

dy/dt=tan(θ)=—(s-y)/x=—(v*t-y)/x, (1)

这并不是一个常量微分方程,为了进行数值模拟,还需做进一步的变形。

4.1.1 将速度分解为沿x方向和沿 y方向的两个分速度:

dx/dt=2*v*cos(θ),dy/dt=2*v*sin(θ), (1.a) 其中

cos(θ)=(v*t-y)/sqrt((v*t-y)^2+(x)^2),sin(θ)=-(v*t-y)/sqrt((v*t-y)^2+(x)^2).(1b)

4.2 对此问题的解析解分析

4.2.1 此类问题可化为一个常微分方程,并可得到解析解。由于兔子的运动过程S=v*t,

由(4.1)式

dy/dx=-(v*t-y)/x, (4.2.1a)

上式中含有变量t,必须设法消去,注意(4.1)意味着 (dy/dx)^2+(dy/dt)^2=(2*v)^2, (4.2.1b)

将上述两个方程联立可消去t。位计算简单起见,把y作为自变量将(4.2.1a)写成 -y*dx/dy=v*t-y, (4.2.1a*) 所以求导后的方程为

- 3 -

年珊珊:饿狼追兔问题

-dy/dx-y*d^2x/dy^2=v*dt/dy-dx/dy,

4.2.2 另一方面,从方程(4.2.1b)容易解出(dt/dy)^2=(1+(x’)^2)/v^2,带入前式消去

中间变量t,得方程

d^2x/dy^2=-r*sqrt[(1+(dx/dy)^2)/y], (4.2.2a)

其中r为兔子与饿狼的速度之比,其值为1/2 ,而初始条件为 x=0,x’(sqrt( S0^2-S^2)=S1/sqrt(S0^2-S^2), (4.2.2b) 下面采用Matlab的符号求微分方程的运算命令解这一方程。

4.2.3 求解符号微分方程指令dsolve:格式为

r=dsolve(‘eq1,eq2,……’,’cond1,cond2,……’,’v’) 其中’eq1,eq2,……’为相应的微分方程(组),’cond1,cond2,……’为初始条件,’v’为自变量。

在下面的程序中,D为求导算符,Dn代表求n阶导数。取参数S=60,S0=100,程序如下:

syms y d r

xs=simplify(dsolve('D2x=-r*sqrt(1+Dx^2)/y','x(60)=0','Dx(60)=0','y'))

{xs=[1/2*(y^(1+r)*r*60^(-r)+y^(1-r)*r*60^r-40*r-y^(1+r)*60^(-r)+y^(1-r)*60^r)/(-1+r^2)] }

[-1/2*(y*exp(-2*r*(-log(y)+2*log(2)+log(5)))*r+y*r-40*r*

exp(-r*(-log(y)+2*log(2)+log(5)))-y*exp(-2*r*(-log(y)+2*log(2) +log(5)))+y)/(-1+r^2)*exp(r*(-log(y)+2*log(2)+log(5)))] 可见xs有两个解,第一个解经整理得

x=1/1-r^2*(-40*r+60^(-r)*(r-1)*y^(1+r)+20^r*(r+1)*y^(1-r), 第二个解不合理舍去,取r=0.5画追线轨迹。 r=0.5;y=60:-0.01:100;

x=1/2*(y.^(1+r)*r*60^(-r)+y.^(1-r)*r*60^r-40*r-y.^(1+r)*60^(-r)+y.^(1-r)*20^r)/(-1+r^2); shg,comet(x,y)

运行后图形如下所示:

- 4 -

数学建模

4.3对此问题的数值模拟

4.3.1 进行数值模拟时,可采用时间步长法:按照时间流逝的顺序一步一步对恶狼和兔

子的活动进行模拟。由(4.1.1)式出发,类似于Eular方法,分别计算它们在每一时刻的x坐标和y坐标,从而可递推的计算它们的位置坐标,在整个模拟过程中,时间步长是固定不变的,按下面的算法计算: 算法

(1)选取参数,B与C之间的距离为60m,B与A之间的距离是100m,兔子速度v=5m/s,恶狼速度10m/s,根据这些数据画出兔子了恶狼的初始位置如图(2-1)所示。

(2)选取时间区间[0,T],将其n等分,时间步长为dt,恶狼的初始坐标为(x0,y0); (3)根据(4.1.1)式,递推计算X(k+1)=X(k)+v*cos(θk)dt,Y(k+1)=Y(k)+v*sin(θk)dt, 并设定停止规则:如果两个质点的距离小于某个容许值,如0.1m,就可认为两者相遇,并停止计算。

4.3.2 由微分方程得到其Matlab函数

具体分析如下在t时刻,兔子跑过的路程为

s1?y1?v1t (4.3.2.1)

设狼的速度是兔子的r倍,则狼跑的路程为

s2?rs1?ry1100x (4.3.2.2)

狼跑过的路程可以用对弧长的曲线积分知识得到,如下:

s2??1?y?dx2 (4.3.2.3)

联立上述方程得

?100x2?1?ydx?ry1?r(y?y?x) (4.3.2.4)

对上式两边求对x的导数,化简得

y???1?y?rx2 (4.3.2.5)

上述微分方程的初始条件有:

- 5 -

年珊珊:饿狼追兔问题

yx?100?0y?x?100?0

4.3.3是否追上的判断

要判定狼是否追上兔子,可以通过(4.3.2.5)式判定。 对(4.3.2.5)式,

当x=0,如果计算求解得到y>=60,则视为没有追上; 当x=0,如果计算求解得到y<60,则视为兔子被追上;

4.3.4 常微分方程高阶初值问题的MATLAB库函数为:ode45。

语法为:[t,y] =ode45(‘odefun’,tspan,z0) 式中输入参数:

odefun 为描述一阶微分方程的函数文件名; tspan 为积分区间,即tspan=[ta,tb];

z0 为积分初值,即当t=t0时的z0=[zo(1),z0(2),…,zo(n)]; t 为积分中的自变量(为向量); z 为积分后求得的函数(为矩阵)。

4.3.4.1

(1)转化原方程为以解方程组

y???1?y?2先解出

rx

再令 x=t,y=z1,y’=z2,r=2 则有z1’=z2

z2’=sqrt(1+z2^2)/2*t

(2)建立描述上面微分方程的的函数文件,并设文件名为odefun.m 在编辑窗口键入 function dz=f(t,z) dz(1)=z(2);

dz(2)=sqrt(1+z(2).^2)/(2*t); dz=[dz(1);dz(2)]

(3)调用求解,在命令窗口键入 tspan=[100,0.1];z0=[0;0]

[t,z]=ode45(‘odefun’,tspan,z0) plot(t,z(:,1),'-',t,y(:,2),'-.') 运行后求得图形如下:

- 6 -

数学建模

图行分析如下:

在时间相同的情况下,狼的运行轨迹没有到达兔子巢穴的所在位置,因此可以看出,狼可以追到兔子。

5 模型总结

通过狼追兔的而数学模型,我们可以更形象的体会数值方法和解析解发的区别,基于Matlab的数学模型,更加形象的描述了问题。两种方法的思想不用,但是模型运行的结果却是大同小异的。一个模型是一道题的另一种体现,又是一道题的精髓体现。

对狼追兔问题的实际研究,我对数学模型的建立有了更深入的研究,研究一个实际问题,重要的不仅是结果,我认为更为重要的是得到一个结果的实际过程,只有深入的了解到如何得到一个模型,才会对其有进一步的应用,研究一个问题的数学模型,我们不仅可以学到如何用一个模型对问题进行描述,还可以从模型中更进一步的了解到问题的含义,形象化了问题,是我们对问题有了形象化的理解。

6 模型的推广与应用

此类数学模型可以推广到很多的应用领域,比如说导弹追踪目标,可以类比狼追兔子数学模型进行分析,这些看似复杂的问题在正确的数学模型下可以得到很好的解释和解答。

7 参考文献

[1]理工院应用数学系,《数学模型简介及基于MATLAB的实现》,辽宁工程技术大学理学院应用数学系,2008年8月 [2]周晓阳,《数学实验与Matlab》,武汉:华中科技大学出版社,2002年1月

[3]阳明盛、熊西文、林建华,《MATLAB基础及数学软件》,大连:大连理工出版社,2003年8月

- 7 -

年珊珊:饿狼追兔问题

8 附录

附录A 微分方程ode45函数程序

function dz=f(t,z) dz(1)=z(2);

dz(2)=sqrt(1+z(2).^2)/(2*t); dz=[dz(1);dz(2)]

tspan=[100,0.1];z0=[0;0]

[t,z]=ode45(‘odefun’,tspan,z0) plot(t,z(:,1),'-',t,y(:,2),'-.')

附录B Matlab的符号求微分方程

syms y d r

xs=simplify(dsolve('D2x=-r*sqrt(1+Dx^2)/y','x(60)=0','Dx(60)=0','y'))

{ xs=[1/2*(y^(1+r)*r*60^(-r)+y^(1-r)*r*60^r-40*r-y^(1+r)*60^(-r)+y^(1-r)*60^r)/(-1+r^2)] [-1/2*(y*exp(-2*r*(-log(y)+2*log(2)+log(5)))*r+y*r-40*r* exp(-r*(-log(y)+2*log(2)+log(5)))-y*exp(-2*r*(-log(y)+2*log(2) +log(5)))+y)/(-1+r^2)*exp(r*(-log(y)+2*log(2)+log(5)))] 具体程序如下

syms y v 2*v s

x=sym('x(y)');t=sym('t(y)'); f_left=-y*diff(x,y);f_right=v*t-y; r_left=diff(f_left,y),r_right=diff(f_right,y) {r_left=-diff(x(y),y)-diff(x(y),'$'(y,2)) r_right=v*diff(t(y),y)-diff(x(y),y)} 具体取值如下

r=0.5;y=60:-0.01:100;

x=1/2*(y.^(1+r)*r*60^(-r)+y.^(1-r)*r*60^r-40*r-y.^(1+r)*60^(-r)+y.^(1-r)*20^r)/(-1+r^2); shg,comet(x,y) [引自书籍《数学实验与Matlab》]

- 8 -

本文来源:https://www.bwwdw.com/article/2ihw.html

Top