算法分析与设计狼找兔子
- 格式:ppt
- 大小:425.00 KB
- 文档页数:20
饿狼追兔问题数学建模数学建模饿狼追兔问题摘要本文研究饿狼追兔问题,是在给定狼兔相对位置,以及兔子巢穴位置的情况下求解的,狼的速度是兔子速度两倍,在不考虑其他任何因素的情况下研究狼能否追上兔子的问题。
首先,我们对问题进行了适当的分析,然后根据已知条件建立了狼的运动轨迹微分模型。
其次,根据建好的模型,运用MATLAB编程,然后仿真画出了饿狼和野兔的运动轨迹图。
再次,用解析方法将建立的模型求解,并给出该问题的结论,准确的回答题目。
最后,用数值方法求解,将所求与前面所求进行对比,也给出结论,回答题目。
并将两种方法做相应比较。
结论:野兔可以安全回巢关键词:算法高阶常微分方程§1.1问题的提出在自然界中,各种生物都有它的生活规律,它们钩心斗角,各项神通,在饿狼追野兔的工程中,饿狼的速度是野兔的二倍,但是野兔有自己的洞穴,野兔在跑到自己洞穴之前被狼捉住,野兔就将会成为饿狼的囊中之物;如果野兔在饿狼捉住自己之前跑回到自己的洞穴,那么野兔就保住小命,得以生还。
图1-1-1为饿狼追野兔的两条曲线,其中绿线表示野兔,图中的箭头表示的是野兔的奔跑方向,野兔从远点开始沿y轴正方向运动,其洞穴在坐标为(0,60)的位置;红线为饿狼的运动轨迹,,图中的剪头表示饿狼追逐野兔的方向,饿狼从坐标为(100,0)的方向追逐野兔,饿狼的速度是野兔速度的二倍。
建立数学模型需研究一下几个问题:(1)设野兔的速度我v0,饿狼的速度为v1,野兔的奔跑方向是沿y轴正方向奔跑,而饿狼的方向是一直指向野兔的方向,即饿狼的运动的轨迹某一时候的切线指向同一时刻的野兔的位置。
建立饿狼追野兔的运动轨迹微分模型。
(2)根据建立的饿狼运动轨迹得微分模型,作出饿狼与野兔的运动轨迹图形。
(3)用解析方法求解,即根据第二步作出的饿狼渔业突地运动轨迹图形,分析兔子能否安全回到巢穴,即野兔的运动曲线与饿狼的运动曲线的交点是在点(0,60)-野兔巢穴的上面还是下面。
C语言狼追兔子问题一只兔子躲进了10 个环形分布的洞的某一个,狼在第一个洞没有找到兔子,就隔一个洞,到第三个洞去找,也没有找到,就隔两个洞,到第六个洞去找,以后每次多隔一个洞去找兔子……这样下去,结果一直找不到兔子,请问:兔子可能躲在哪个洞中?算法思想对于本实例中提到的问题,虽然是“兔子可能躲在哪个洞中”,但是在考虑算法时,需要知道的是狼会去哪个洞找兔子,狼第一次去的洞是第一个(表示为pos1),第二次去的是第三个(pos3),把它去的洞的代码用数字表示出来,可以推导出狼去的洞的代码是:pos(i+1)=pos(i)+i+1。
由题目可知,狼没有找到兔子,因此该算法会一直持续下去。
除此之外,还需要注意的是,在10 个洞之后,比如狼去找第十五个洞,但第十五个洞是不存在的,因此我们用15 对10 求余,得到的数字才是洞的标示。
程序代码1.#include<stdio.h>2.int main()3.{4.int i;5.bool pos[10]={0};6.int lang=0;7.for(i=0;i<100;i++)8.{9. pos[lang]=true;10. lang++;11. lang+=i;12. lang=lang%10;13.}14.for(i=0;i<10;i++)15.if(!pos[i])16.printf("兔子可能在第%d洞中\n",i+1);17.return0;18.}调试运行结果通过上面的算法分析,狼在找兔子的过程中,为了达到找到兔子的目的,同时为了设计需要,增加了循环次数,最终程序的结果如下所示:。
数学模型--狼追击兔子的问题一、问题重述与分析(一)问题描述神秘的大自然里,处处暗藏杀机,捕猎和逃生对动物的生存起着至关重要的作用,而奔跑速度和路线是能否追上和逃生的关键因素。
狼追击兔子问题是欧洲文艺复兴时代的著名人物达•芬奇提出的一个数学问题。
当一个兔子正在它的洞穴南面60码处觅食时,一只恶狼出现在兔子正东的100码处。
当两只动物同时发现对方以后,兔子奔向自己的洞穴,狼以快于兔子一倍的速度紧追兔子不放。
狼在追赶过程中所形成的轨迹就是追击曲线。
狼是否会在兔子跑回洞穴之前追赶上兔子?为了研究狼是否能够追上兔子,可以先考虑求出狼追兔子形成的追击曲线,然后根据曲线来确定狼是否能够追上兔子。
(二)问题分析1、本题目是在限定条件下求极值的问题,可以通过建立有约束条件的微分方程加以模拟。
2、通过运用欧拉公式及改进欧拉公式的原理,结合高等数学的有关知识,对微分方程进行求解。
3、将数学求解用Matlab程序语言进行实现得出方程的近似解。
4、最后解方程的解结合实际问题转化为具体问题的实际结果。
二、变量说明V1 :兔子的速度(单位:码/秒)r :狼与兔子速度的倍数;V2:狼的速度(单位:码/秒),显然有v rv it:狼追击兔子的时刻(t=0时,表示狼开始追兔子的时刻)◎:在时刻t,兔子跑过的路程(单位:码),$ s(t)S2 :在时刻t,狼跑过的路程(单位:码),S2 S2(t)Q(x i,yj :表示在时刻t时,兔子的坐标P(x,y):表示在时刻t时,狼子的坐标三、模型假设1、狼在追击过程中始终朝向兔子;2、狼追击兔子的轨迹看作是一条光滑的曲线,即将动点P(x, y)的轨迹看作一条曲线,曲线方程表示为y y(x)。
3、当猎狗与兔子之间的距离相当小时认为猎狗已经追上了兔子。
四、模型建立(一)建模准备以t = 0时,兔子的位置作为直角坐标原点,兔子朝向狼的方向为x轴正向;则显然有兔子位置的横坐标x i 0。
对狼来说,当x = 100 , y= 0,即y x 1000在t = 0刚开始追击时,狼的奔跑方向朝向兔子,此时即x轴负方向, 则有y xi00 0(二)建立模型1、追击方向的讨论由于狼始终朝向兔子,则在狼所在位置P(x,y)点过狼的轨迹处的切线方向在y轴上的截距为y i。
题目二:狼追兔子:
需求分析:将问题循序渐进地变成程序,需要用到数组求余法
问题提出:本人需要用到一维数组,for循环结构求余求算该问题所涉及的知识点:一维数组,FOR循环
接替方法:将问题循序渐进地变成程序。
1、画图分析。
(在草稿本上进行)
2、确定解题思路;(在草稿本上进行)
1)用一个数组a[11],对应的元素a[1],a[2],a[3]……对应表示10个洞,初值均置1。
2)找兔子,题意是一直找不到,不可能找无限次,但找的次数肯定很多,设找1000次,用一循环按规则找。
但要注意,洞只有10个,找的过程中,第n次查找对应第n%10个洞,由于在第n%10个洞中没有找到兔子,因此将a[n%10]置0值。
3)循环完成后,检查a数组各元素(各个洞)的值,若其值仍为1,则兔子可能藏身该洞中。
3、写出算法或画出流程图(或N-S图)。
(在草稿本上进行)
编码、调试。
(先在草稿本上写程序草稿,再上机调试通过,然后将正确的程序记录在本子上)
编译过程:
#include<stdio.h>
void main()
int a=0,i=0,x=0;
int b[11];
for(i=0;i<11;i++)
b[i]=1;
for(i=0;i<1000;i++)
a+=(i+1);
x=a%10;
b[x]=0;
for(i=0;i<10;i++)
if(b[i])
printf("可能在第%d个洞\n",i);。
高阶常微分方程模型—饿狼追兔问题第一章摘要概述本文以狼追击兔子这一现实情况为背景,并合理的加以数学假设,着重实际与模型的结合,现有一只兔子和一匹狼,兔子位于狼的正西100米处,假设当狼发现兔子时,兔子同时也发现了狼,这时二者一起起跑,兔子往正北60米处的巢穴跑,狼朝同样的方向在追兔子。
已知兔子、狼是匀速跑且狼的速度是兔子的两倍。
建立狼的运动轨迹微分模型。
通过画出的兔子与狼的运动轨迹图形,用解析方法及数值方法求解,兔子能否安全回到巢穴?经过分析与求解,得知兔子无危险.在自然科学和技术科学中往往遇到大量的微分方程问题。
通过对高阶微分方程的分析,我们对题目里提出的问题建立了符合实际的数学模型,在模型的求解过程中应用数学软件MATLAB等计算工具,编写相应的程序,解决实际问题。
论文最后对模型的优缺点进行了分析和评价,并提出了模型的改进方向和思路。
关键字微分方程饿狼追兔数学建模第二章模型的背景问题描述随着课改的深入开展,实际情景问题应运而生,并迅速发展成为命题的亮点、热点。
实际情景问题是复杂多变的,它贴近生活,为学生所熟悉,且以一定的知识为依托。
恶狼追兔的问题属于实际的情景问题,具有一定的时代气息.数学模型一般是实际事物的一种数学简化。
它常常是以某种意义上接近实际事物的抽象形式存在的,但它和真实的事物有着本质的区别。
是研究现实世界数量关系和空间形式的科学,建立教学模型的过程,是把错综复杂的实际问题简化、抽象为合理的数学结构的过程。
有助于我们提高用数学理论和方法去分析和解决问题的全过程,提高我们分析问题和解决问题的能力,提高我们学习数学的兴趣和应用数学的意识与能力,使我们在今后的工作中能经常性地想到用数学去解决问题,提高我们尽量利用计算机软件及当代高新科技成果的意识,能将数学、计算机有机地结合起来去解决实际问题。
利用高阶常微分方程模型—饿狼追兔问题现有一只兔子、一匹狼,兔子位于狼的正西100米处,假设兔子与狼同时发现对方并一起起跑,兔子往正北60米处的巢穴跑,而狼在追兔子。
找兔子教案推荐5篇出色的教案使教师在教学中突出核心知识,确保学生掌握关键内容,教案的设计有助于教师结合学生反馈,本店铺今天就为您带来了找兔子教案推荐5篇,相信一定会对你有所帮助。
找兔子教案篇1活动目标:1、幼儿了解每个人都有自己的独特性。
2、幼儿观察故事画面,理解故事内容。
讲述故事情节。
3、幼儿懂得接纳自己、接纳别人,用乐观的态度去面对。
活动准备:耷拉着耳朵的兔子物偶一个,故事中出现的各种情节画面图片若干。
活动过程:1、导入:出示物偶,引起幼儿兴趣,引出课题。
师:小朋友们,你们看看这只小兔子和我们平时看见的有什么不同?(幼回答,)这只小兔子有点特别,他的一只耳朵总是搭拉着,怎么也竖不起来。
他想去找朋友玩,可是发生了很多事。
你们想不想知道发生了哪些事吗?2、展开:结合图片,分段欣赏故事,理解故事内容。
a、讲述第一段,提问:布布去找小伙伴们玩,小伙伴们是怎么对它的?要是你,你会怎么做呢?(幼回答)。
那我们看看布布是怎么做的?b、讲述第二段:后来布布想竖起自己的耳朵,那小朋友们知道,布布用了哪些方法吗?(幼回答,师出示图片)。
那小朋友知道布布成功了吗?(幼回答)小朋友们布布接下来会怎么办呢?如果是你们,你们又要怎么做呢?c、讲述第三段:布布听了医生的话,想到耳朵为什么要一样大呢?又想到爸爸妈妈爷爷奶奶的耳朵也都不一样。
那小朋友们,你们有没有想到自己有什么是和别人不一样的?d、讲述结尾:小朋友们,布布又一次找伙伴们玩,伙伴们又怎么对它的呀?(幼回答)那最后小伙伴们喜欢布布吗?布布为什么笑得最开心?3、完整地讲述一遍师:布布有一只耷拉着的耳朵伙伴们应不应该取笑它?(幼回答)其实每个人都有自己的特别之处,我们小朋友也有特别的地方,比如有的小朋友胖,有的小朋友矮。
但只要多运动,不挑食,身体就会健健康康的。
我们看到一些特别的小朋友,也不应该笑话他们。
活动延伸:分角色表演故事内容。
故事内容:世界上有各种各样的兔子,雄的、雌的、胖的、瘦的、高的。
个人资料整理仅限学习使用青岛大学软件技术学院游戏算法实践报告姓名曹宁专业数字媒体艺术班级10级4班指导教师刘春秋2018年1 月 16 日目录个人资料整理仅限学习使用1问题定义与描述 31.1问题定义 31.2问题描述 32关键技术 33数据的组织 33.1数据类型定义 33.2数据存储结构 44总体设计 44.1系统模块图 44.2栈的基本操作 44.3顺序表的基本操作 45详细设计 55.1顺序存储的线性表 56测试结果及分析 77心得体会 8附录:程序代码91问题定义与描述1.1问题定义现实中很多利用顺序表,栈解决一些数学模型问题1.2问题描述围绕着山顶有10 个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但必须找到我,我就藏身于这十个洞中,你可以先到 1 号洞找我,第二次隔一个洞<即 3 号洞)找,第三次隔两个洞 <即 6 号洞)找,以后如此类推,次数不限。
”但狐狸从早到晚进进出出1000 次,但仍没有找到兔子,问兔子究竟藏身于哪个洞里2.关键技术顺序表一次申请多个空间,包括结构体定义的。
N 为整数,这样得到的就是N 个连续的空间。
顺序表可以利用类似于数组的形式访问,即通过下标访问。
当然定义的变量类型必须是指针类型的,很方便,当然也可以通过像链表一样的访问。
单链表只是将空间分散开了,这样的优点就是动态申请,需要多少就申请多少,一般一次申请一个空间结点,即 N=1。
3数据的组织3.1 数据类型定义数据结构,顺序表,栈,单链表,数组。
在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来。
这些按序排列的同类数据元素的集合称为数组。
在 C 语言中,数组属于构造数据类型。
一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或是构造类型。
因此按数组元素的类型不同,数组又可分为数值数组、字符数组、指针数组、结构数组等各种类别。
3.2 数据存储结构栈以顺序结构实现,队列以链表结构实现。
一只狼追逐一只兔子,狼追兔问题解读及练习题简介一只狼追逐一只兔子是一个常见的问题,用于解释追及一点的概念。
该问题基于以下背景:一只兔子以恒定速度向前跑动,而一只狼以更快的速度开始追逐兔子。
问题是,狼是否能追上兔子,并且若能追上,则需要多长时间。
解读该问题可以用简单的数学模型来解决。
假设兔子的速度为v1,狼的速度为v2,并且兔子与狼的初始距离为d。
根据这些条件,可以得出以下结论:- 如果v2大于v1,则狼能追上兔子并且需要的时间为d / (v2 - v1)。
- 如果v2小于或等于v1,则狼永远无法追上兔子。
练题下面是一些练题,帮助你巩固对狼追兔问题的理解。
问题一一只兔子以10 m/s的速度向前跑动,而一只狼以15 m/s的速度开始追逐兔子。
兔子与狼的初始距离为1000米。
狼需要多长时间才能追上兔子?解答一根据公式,狼需要的时间为1000米 / (15 m/s - 10 m/s) = 200秒。
问题二一只兔子以20 km/h的速度向前跑动,而一只狼以18 km/h的速度开始追逐兔子。
兔子与狼的初始距离为5公里。
狼能否追上兔子?解答二根据公式,狼需要的时间为5公里 / (18 km/h - 20 km/h) = -5公里 / 2 km/h = -2.5小时。
由于时间为负值,狼无法追上兔子。
总结一只狼追逐一只兔子是一个简单而有趣的问题,通过数学模型可以确定是否狼能追上兔子以及需要的时间。
记住,狼只有在速度比兔子快时才能追及兔子,否则狼将永远无法追上。
习题11. 图论诞生于七桥问题。
出生于瑞士的伟大数学家欧拉(Leonhard Euler ,1707—1783)提出并解决了该问题。
七桥问题是这样描述的:一个人是否能在一次步行中穿越哥尼斯堡(现在叫加里宁格勒,在波罗的海南岸)城中全部的七座桥后回到起点,且每座桥只经过一次,图 1.7是这条河以及河上的两个岛和七座桥的草图。
请将该问题的数据模型抽象出来,并判断此问题是否有解。
七桥问题属于一笔画问题。
输入:一个起点输出:相同的点1, 一次步行2, 经过七座桥,且每次只经历过一次3, 回到起点该问题无解:能一笔画的图形只有两类:一类是所有的点都是偶点。
另一类是只有二个奇点的图形。
2.在欧几里德提出的欧几里德算法中(即最初的欧几里德算法)用的不是除法而是减法。
请用伪代码描述这个版本的欧几里德算法1.r=m-n2.循环直到r=02.1 m=n2.2 n=r2.3 r=m-n3 输出m3.设计算法求数组中相差最小的两个元素(称为最接近数)的差。
要求分别给出伪代码和C ++描述。
//采用分治法//对数组先进行快速排序//在依次比较相邻的差#include <iostream>using namespace std;int partions(int b[],int low,int high) {图1.7 七桥问题int prvotkey=b[low];b[0]=b[low];while (low<high){while (low<high&&b[high]>=prvotkey)--high;b[low]=b[high];while (low<high&&b[low]<=prvotkey)++low;b[high]=b[low];}b[low]=b[0];return low;}void qsort(int l[],int low,int high){int prvotloc;if(low<high){prvotloc=partions(l,low,high); //将第一次排序的结果作为枢轴 qsort(l,low,prvotloc-1); //递归调用排序由low 到prvotloc-1qsort(l,prvotloc+1,high); //递归调用排序由 prvotloc+1到 high}}void quicksort(int l[],int n){qsort(l,1,n); //第一个作为枢轴,从第一个排到第n个}int main(){int a[11]={0,2,32,43,23,45,36,57,14,27,39};int value=0;//将最小差的值赋值给valuefor (int b=1;b<11;b++)cout<<a[b]<<' ';cout<<endl;quicksort(a,11);for(int i=0;i!=9;++i){if( (a[i+1]-a[i])<=(a[i+2]-a[i+1]) )value=a[i+1]-a[i];elsevalue=a[i+2]-a[i+1];}cout<<value<<endl;return 0;}4.设数组a[n]中的元素均不相等,设计算法找出a[n]中一个既不是最大也不是最小的元素,并说明最坏情况下的比较次数。
2、#include<stdio.h〉void main(){int a[6][6],b[6],i,j;printf("请输入6个整数:”);for(i=0;i<6;i++){scanf(”%d",&b[i]);}for(i=0;i〈6;i++){a[0][i]=b[i];}for(i=1;i〈=5;i++)a[i][0]=b[6-i];for(i=1;i〈=5;i++)for(j=1;j<=5;j++){a[i][j]=a[i-1][j-1];}for(i=0;i<=5;i++){for(j=0;j<=5;j++)printf(”%d ",a[i][j]);printf(”\n");}}3、#include〈stdio.h〉void main(){int i,j,count,n;int a[100][100];printf("请输入矩阵的阶n=”);scanf("%d",&n);count=1;for(i=1;i〈=n/2;i++){for(j=i;j<=n—i+1;j++)//上侧{a[i][j]=count;count++;}for(j=i+1;j〈=n—i;j++)//右侧{a[j][n—i+1]=count;count++;}for(j=n-i+1;j〉=i+1;j-—)//下侧{a[n—i+1][j]=count;count++;}for(j=n-i+1;j〉=i+1;j-—)//左侧{a[j][i]=count;count++;}}if(n%2==1){i=(n+1)/2;a[i][i]=n*n;}for(i=1;i<=n;i++){for(j=1;j〈=n;j++)printf("%2d ”,a[i][j]);printf(”\n");}}4、#include<stdio.h>void main(){int i,j,n,a[100][100],count=1;printf(”请输入方阵的阶n:”);scanf("%d”,&n);for(i=1;i<=n;i++)for(j=1;j<=i;j++){a[i—j+1][j]=count;count++;}for(i=1;i〈=n;i++){for(j=1;j〈=n—i+1;j++)printf("%4d",a[i][j]);printf(”\n");}}5、#include〈stdio。