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://myzitong.com/article/dodcpdo.html