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语言狐狸找兔子问题
标题链接:https://www.cdcxhl.com/article10/dodcpdo.html

成都网站建设公司_创新互联,为您提供网站改版微信公众号网站设计定制开发网站维护企业网站制作

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设