c语言狼追兔子用函数 c语言狐狸找兔子问题
狼追兔子问题 用C语言编程
#include stdio.h
创新互联建站主营象山网站建设的网络公司,主营网站建设方案,成都App定制开发,象山h5微信小程序搭建,象山网站营销推广欢迎象山等地区企业咨询
void main()
{
bool dong[10]={0};
int lang=0;
for(int i=0;i100;i++)
{
dong[lang]=true;
lang++;
lang+=i;
lang=lang%10;
}
for(int i=0;i10;i++)
if(!dong[i]) printf("兔子可能在第%d洞中\n",i+1);
}
狼追兔子的c语言实现
其实不用循环1000次的,我有个思路
按照兔子给出的算法,把得出的结果存到一个单链表或者数组中(用来检索重复),
然后定义一个数据结构存储每一个过程,还要定义一个单链表或者数组来存储每一个过程,如果发现某一个过程,和以前的出现过的某个过程重复就可以退出循环了,因为一个过程总是可以由它的前一个过程推算出来的。
最后,结果集合中不包含的洞数就是结果了。
说具体点就是
1+2 是 第一个过程 3 是第一个结果
3+3 是 第二个过程 6 是第二个结果
6+4 是 第三个过程 10 是第三个结果
0+5 是 第4个过程 5 是第4个结果
5+6 是 第5个过程 1 是第5个结果
1+7 是 第6个过程 8 是第6个结果
8+8 是 第7个过程 6 是第7个结果
6+9 是 第8个过程 5 是第8个结果
5+0 是 第9个过程 5 是第9个结果
5+1 是 第10个过程 6 是第10个结果
以此类推
由上可知,用来存储过程的结构体只需要包含一个加数成员
和一个被加数成员,如果两个过程的加数成员和被加数成员都是相同的,就可以退出循环了,这样最多循环10×10次就可以得到结果,实际上只需要20次,就会退出循环。
过程中加数成员和被加数成员以及结果一旦超过或者等于10,就减去10,这是因为按照兔子的算法,11+12和1+2根本就是一样的。
利用高阶常微分方程模型—饿狼追兔问题
基于高阶常微分方程模型饿狼追兔问题分析
;type=1
- 1 -
基于高阶常微分方程模型饿狼追兔问题分析
朱云龙1,赵娜2,孙利杰1,王勃1,程明1,白海滔1,
王建1,李开1,赵福兴1,王铁柱1
1 辽宁工程技术大学采矿工程系,辽宁阜新(123000)
2 辽宁工程技术大学生物工程(食品科学)系,辽宁阜新(123000)
E-mail:zyl275887234@163.com
摘要:利用高阶常微分模型饿狼是否能追上兔子。首先,建立狼和兔子的运动轨迹模型,
兔子是向正北方向的洞穴直线跑去,狼沿曲线追去。接着,利用matlab 画出狼和兔子的运
动轨迹图形。然后,利用解析方法求解x=0时y 的值,依次来判断狼是否能够追上兔子。最
后,再用数值微分方法求解x=0时y 的值判断狼是否能够在兔子进洞之前将其擒获,美餐一
顿。常微分方程在很多学科领域内有着重要的应用,自动控制、各种电子学装置的设计、弹
道的计算、飞机和导弹飞行的稳定性的研究、化学反应过程稳定性的研究等。这些问题都可
以化为求常微分方程的解。
关键词:高阶常微分;数值微分;数学模型
中图分类号:O172.1
1 引言
在我们现实生活中,有很多追击问题,如赛车比赛,田径比赛,鹰抓兔子等等追击现象。
那么这些问题是否成立,是否能成功呢?再次将要论述与验证狼和兔子的模型,看看是否能
追的上,并通过MATLAB 画出狼和兔子曲线[1]。在我们实现实生活中有很多地方要用到这
些追击模型。虽然狼无暇顾及兔子的洞穴所在,并计算怎样才能追上兔子,可它丢掉的仅仅
是一顿美餐而已,再寻其它猎物即可。可是我们人类就不同了,如在军事上,跟中导弹追击
敌机问题,恰与饿狼追兔问题模型相似。根据追击者和被追击者相差距离和被追击者得逃亡
范围,通过计算,适当调整速度,即可追上。倘若不假思索的追击,后果将不堪设想,失去
的将不仅仅时一顿每餐那么简单。所以,通过本模型分析将要得到清晰的MATLAB 曲线,
使结果明确的显现在计算机上,一目了然,希望此模型能用到我们现实生活中,得到一定用
处,提高国民经济和科学技术的应用。
2 问题的提出
神秘的大自然里,处处暗藏杀机,捕猎和逃生对动物的生存起着至关重要的作用,而奔
跑速度和路线是能否追上和逃生的关键因素。这里就讨论一对老冤家的追逃问题,快速奔跑
的狼能否追上不远处有洞穴的兔子。
有一只兔子、一匹狼,兔子位于狼的正西100 米处,假设兔子与狼同时发现对方并一起
起跑,兔子往正北60 米处的巢穴跑,而狼在追兔子。已知兔子、狼是匀速跑且狼的速度是
兔子的两倍。试建立数学模型[2]研究以下问题:
(1)根据已知条件,建立狼的运动轨迹微分模型。
(2)画出兔子与狼的运动轨迹图形。
(3)用解析方法求解,判断兔子能否安全回到巢穴。
(4)用数值方法求解,判断兔子能否安全回到巢穴。
3 模型建设
假设狼不知道兔子远处是否有洞穴,故狼的速度方向应该始终是朝向兔子,而兔子是不
中国科技论文在线
- 2 -
断奔跑的,所以狼的速度方向不断的改变,运动轨迹应该是一条光滑的曲线。设兔子的速度
为v,以t=0 时刻兔子的位置为原点,兔子朝向狼的方向为x 轴,逆时针旋转90 度的方向
为y 轴方向建立平面直角坐标系,t 时刻狼的坐标为(x,y),兔子的坐标为(0,vt),狼的速
度方向与x 轴负半轴的夹角为θ。
3.1 问题的分析与模型建立
3.3.1 建立狼的运动轨迹微分模型
作出狼的运动轨迹草图如下:
图1 狼的运动轨迹草图
Figure 1 the trajectories of a wolf plan
t 时刻y 对x 求导等于曲线在点(x,y)处的切线斜率,即
Y= − tanθ (1)
又由于狼的运动方向指向兔子,所以,
x
vt − y
tanθ = = − tanθ
dx
dy
(2)
由(1)和(2)得,
x
y vt
dx
dy −
=
(3)
将狼的速度分解成为沿x 轴和y 轴方向,即x v =
dx
dt ,
y
v dy
dt
=
,所以,
2
2 2
(2v)
dt
dx
dt
dy = ⎟⎠
⎞
⎜⎝
+ ⎛ ⎟⎠
⎞
⎜⎝
⎛
(4)
由(3)式可得,
y = x dx
dy
+ vt (5)
两边对t 求导得,
中国科技论文在线
- 3 -
v
dt
dx
dx
x d y
dx
dy
dt
dx
dx
dy = ∗ + ∗ + 2
2
(6)
整理,得
dt
dx
dx
x d y ∗ 2
2
= −v (7)
将(4)式左右两边同乘以
2 dt
dx
⎛ ⎞
⎜ ⎟
⎝ ⎠
,得
2 dy
dx
⎛ ⎞
⎜ ⎟
⎝ ⎠
+1=
2
2 4 ⎟⎠
⎞
⎜⎝
⎛
dx
v dt (8)
由(7)、(8)两式得
2
2
dx
d y
v
x
dx
dt = −
(9)
(9)式即为狼的运动轨迹微分模型。
3.3.2 画出兔子与狼的运动轨迹图形
根据上述微分方程,利用 matlab 软件中的ode45 函数即可求出二阶微分方程(9)中x
值对应的y 值,再利用绘图函数plot 即可画出狼的运动轨迹图像[3]。程序如下:
先建立matlab 函数:
function f=odefun(x,y)
f(1,1)=y(2);
f(2,1)=sqrt(1+y(2).^2)./(2.*x);
再在主程序中输入下列程序:
t=100:-0.1:0.1;
y0=[0 0];
[T,Y] = ode45('odefun',t,y0);
plot(T,Y(:,1),'-')
即可得到如下曲线,即为狼的运动轨迹图形。
中国科技论文在线
- 4 -
图2 狼的运动轨迹图形
Figure 2 the trajectories of a wolf graphics
兔子的运动轨迹是一条从(0,0)点到其洞穴(0,60)的直线,所以,再在主程序中
输入以下程序即可将兔子和狼的运动轨迹绘制出来。
x1=[0 0];
y1=[0 60];
plot(T,Y(:,1),'-',x1,y1,’r’)
绘制出来的图像如下图:
(其中蓝色代表狼的运动轨迹,红色代表兔子的运动轨迹)
中国科技论文在线
- 5 -
图3 狼和兔子的运动轨迹图形
Figure 3 wolves and rabbits trajectories graphics
4 模型求解
4.1 用解析法求解兔子能否安全回到巢穴
判断狼是否能追上兔子,可先假设没有洞穴,看看狼再什么位置可以追上兔子,若追上
时兔子运动的距离已经超过60 米,那就是说再狼追上兔子之前,兔子已经安全的逃回洞穴
之中。用解析法判断狼是否能追上兔子的具体过程[4]如下:
可假设
p dx
dy
= ,则
2
2
dp d y
dx dx
= ,那么(9)式可变为
2
2 2 4 1 ⎟⎠
⎞
⎜⎝
+ = ⎛− ∗
dx
dp
v
p v x (10)
整理得
2
2 2 4 1 ⎟⎠
⎞
⎜⎝
+ = ⎛
dx
p v dp (11)
dx
p2 +1 = 2x dp (12)
x
dx
p
dp
2 1 2
=
+
(13)
再对等式两边积分,得
( ) '
1 ln p + p2 +1 = ln x + C (14)
也即
中国科技论文在线
- 6 -
p + p2 +1 =C x 1 (15)
因为x=100 时,狼的速度方向沿y 轴负向,所以此时p=0,可求得1 C =
1
10
(15)式可变为
p + p2 +1 = x
10
1
(16)
两边平方
100
2 p2 +1+ 2 p p2 +1 = x (17)
移项
2 p p2 +1 = (2 1)
100
x − p2 +
(18)
再次平方
(2 1)
100
4 4 1 2
10000
4 4 4 2 2
2
p4 + p2 = x + p + p + − x p + (19)
整理
( ) 1 0
100
4 2
10000
2
2
x − p + x + =
(20)
求p
2
2
2 10
10
100 2
100
2
100
1
4 10000 ⎟ ⎟
⎠
⎞
⎜ ⎜
⎝
⎛
− = + − = −
+
=
x
x
x
x
x
x
p
(21)
x
p x 5
20
= − (22)
因为
p dx
dy
= ,所以(22)式可变为
x
x
dx
dy 5
20
= − (23)
两边积分即可得到y 与x 的函数关系式
3 1
2 2
2
1 10
30
y = x − x +C (24)
因为x=100 时,y=0,所以
3 1
2 2
2
0 1 100 10 100
30
= ∗ − ∗ +C
解得
2 C =
200
3
=66.67
中国科技论文在线
- 7 -
故(24)式可变为
3 1
1 2 10 2 200
30 3
y = x − x + (25)
令x=0,可求得y=
200
3
=66.67
因为y=66.6760,所以在狼追上兔子之前,兔子已经安全逃回到洞穴之中,饿狼只能
干瞪眼了。
4.2 用数值方法求解兔子能否安全回到巢中
前面已经用解析法判断出狼并没有追上兔子,那么我们现在再用数值微分法求出(9)
式中x=0 时y 的值,再将y 值与60 比较,若y 大于60,则也说明在兔子安全逃回洞穴之前,
狼没有追上兔子,下面就是用数值微分法并借助matlab 软件判断狼是否能够追上兔子的方
法:
利用matlab 软件中的ode45 函数求出二阶常微分方程的初值,并求出x=100 时y 的值
即可判断出狼是否能够追上兔子[5]。具体matlab 程序如下:
先建立odefun 函数:
function f=odefun(x,y)
f(1,1)=y(2);
f(2,1)=sqrt(1+y(2).^2)./(2.*x);
再在主程序中输入如下程序:
t=100:-0.1:0.1;
y0=[0 0];
[T,Y] = ode45('odefun',t,y0);
n=size(Y,1);
Y(n,1)
即可输出结果:
ans =63.5007
x=0.1 时,y=63.500760,而当x=0 时y63.5007 当然也大于60,所以狼在兔子进洞之前
并没有能够追上兔子,一顿美餐就这样从它眼前没了。
5 结果分析
从图 2 可以粗略的看出x=0 时y 的值大于60,用数学解析法也算出y 值等于66.67 大于
60,用数值微分法算出来的y 值也大于60。所以,从种种计算方法表明,在兔子就如洞穴
之前,狼时无法将其擒获的。
如果换个角度考虑,假设狼知道兔子的洞穴所在,直接跑向其洞穴处守洞待兔。那么根
据勾股定理[6],狼运动的距离s= 6 0 2 + 1 0 0 2 =116.6m,此时兔子运动距离为s/2=58.360。
也就是说兔子还没有逃进洞里,而狼已经再其洞口等待,那么兔子就不敢进洞,只要兔子没
法进洞,狼的速度是兔子的2 倍,狼就可将其擒获。可惜,饥饿而又贪婪的狼只想着怎么样
快速的追上兔子美餐一顿,哪里有时间而且也不会进行这么复杂的计算,并且很多情况下狼
是不知道兔子的洞穴所在,所以,狼只能在快要追到兔子的时候看着兔子溜掉而干瞪眼了
当前文章:c语言狼追兔子用函数 c语言狐狸找兔子问题
文章来源:http://scyanting.com/article/dodcpdo.html