【matlab】狼追击兔子问题的建模

实验案例 狼追击兔子的问题

1.1 狼追击兔子问题的建模

1.1.1 问题重述与分析

狼追击兔子问题是欧洲文艺复兴时代的著名人物达.芬奇提出的一个数学问题。当一个兔子正在它的洞穴南面60码处觅食时,一只恶狼出现在兔子正东的100码处。当两只动物同时发现对方以后,兔子奔向自己的洞穴,狼以快于兔子一倍的速度紧追兔子不放。狼在追赶过程中所形成的轨迹就是追击曲线。狼是否会在兔子跑回洞穴之前追赶上兔子?
为了研究狼是否能够追上兔子,可以先考虑求出狼追兔子形成的追击曲线,然后根据曲线来确定狼是否能够追上兔子。

【matlab】狼追击兔子问题的建模_第1张图片

1.1.2 变量说明

【matlab】狼追击兔子问题的建模_第2张图片

1.1.3 模型假设

1、 狼在追击过程中始终朝向兔子;
2、 狼追击兔子的轨迹看作是一条光滑的曲线,即将动点P(x,y) 的轨迹看作一条曲线,曲线方程表示为 。

1.1.4 模型建立

(一)建模准备
以t=0时,兔子的位置作为直角坐标原点,兔子朝向狼的方向为x轴正向;
则显然有兔子位置的横坐标 。
对狼来说,当x=100,y=0,即
在t=0刚开始追击时,狼的奔跑方向朝向兔子,此时即x轴负方向,
则有
在这里插入图片描述

(二)建立模型
【matlab】狼追击兔子问题的建模_第3张图片

3、是否追上的判断

要判定狼是否追上兔子,可以通过(7)式判定。
对(7)式,
当x=0,如果计算求解得到 ,则视为没有追上;
当x=0,如果计算求解得到 ,则视为兔子被追上;
1.1.5 模型求解
由微分方程得到其Matlab函数
function yy=odefunlt(x,y) %以狼在追击过程中的横坐标为自变量
yy(1,1)=y(2);
yy(2,1)=sqrt(1+y(2).^2)./(2.*x);

主程序:

tspan=100:-0.1:0.1; %以狼的x坐标为自变量
y0=[0 0];
%下面只知道狼是否追上兔子,但是不易推得兔子刚刚到达窝边时,狼与兔之间的距离
[T,Y] = ode45(‘odefunlt’,tspan,y0);
n=size(Y,1);
disp(‘狼的坐标(x=0.1)’)
disp(Y(n,1)) %通过追击曲线计算当狼的横坐标为0.1(即tspan=0.1)时,狼的纵坐标

1.1.6 模型结果与分析
运行结果:

狼的坐标(x=0.1)
62.1932

通过上面运行结果可知,狼并没有追上兔子。

1.1.7 思考题
通过上面的结果已经知道狼并没有追上兔子。那么兔子跑回窝边时,狼与兔子之间的距离是多少?上面的程序不能解决此问题,那么用什么办法解决呢?

(一)解决思路
可以对狼与兔子的追击过程通过计算机进行模拟,然后从模拟结果获取。
模拟程序如下,程序文件名sim_langtu.m

function sim_langtu
%《狼兔追击问题》
%(离散模拟)
%这里没有具体考虑狼、兔的具体速度
%主要通过二者的速度倍速关系及方向向量奔跑过程

Q=[0 0];%兔子坐标
P=[100 0];%狼坐标
PQ=Q-P;%狼兔方向向量  

step =1;%模拟步长:兔子奔跑的距离,step越小就越精确

count = 60/step;%以兔子的奔跑距离划分

PQ=PQ/norm(PQ)*step;%归一化,单位向量

trackP=P;
trackQ=Q;
for k=1:count;   
   P = P + 2*PQ;%2倍速度
   Q = Q + step*[0 1];%[0 1]为兔子奔跑方向的单位方向向量
   PQ = Q - P;
   trackP(1+k,:)=P;
   trackQ(1+k,:)=Q;
   PQ=PQ/norm(PQ)*step;%归一化,单位向量   
   dis=  sqrt(sum((P-Q).^2));
   plot(trackP(:,1),trackP(:,2),'*',Q(1),Q(2),'rp',0,60,'r+');
   pause(0.5)
end%for
dis%兔子到达窝边时,狼兔之间的距离
P  %兔子到达窝边时,狼的坐标
Q  %兔子到达窝边时,兔子的坐标

(二)模拟程序运行结果

dis =
7.0619

P =
1.6805   53.1410

Q =
     0    60

注:如果修改程序中的step赋值,则结果稍有不同。
程序结束后,输出狼兔的位置图如下。通过下图可以直观的看到,当兔子回到窝边时,狼还与兔子有一段距离,这表示兔子成功逃脱。

你可能感兴趣的:(matlab)