Python-教程-chapter9

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

模拟与设计模拟与设计用计算机解决本专业或本领域的问题如:物理、化学、生物现象等考虑:如何表示问题–抽象、数据结构如何用计算机算法来实现解决问题的方法–算法分析执行结果,然后映射到原领域–模拟和分析模拟与设计举例大学生数学建模竞赛人狼羊问题量杯问题本章与前比,编程解决更实质性的问题444模拟我们已经掌握的工具足以让我们编程解决有意思的问题–“有意思”是指:如果不设计实现计算机算法,该问题是很难或不可能解决的55模拟模拟:用计算机为实际问题建模,从而提供非如此不能获得的信息–这是解决实际问题的强大技术,每天都在应用:天气预报设计飞机制作电影特效......一个模拟问题:Racquetball问题:为什么球技只比对手略差,却输掉绝大多数的比赛?–一种可能是心理上的你头脑中自以为比对手只是略差,实际情况是你差很多–另一种可能这是壁球运动本身的特性,能力上的细微差距却导致压倒性的胜负6一个模拟问题:Racquetball解决方法:编程模拟壁球,通过模拟不同水平球员之间的数千场比赛来发现原因788美式壁球基本知识球,球拍,场地一人发球开始比赛然后两人交替击球(称为一个rally)当一人未能击出合法球,则输掉本rally;–发球方输则交换发球权;–发球方赢则得1分.先得15分者赢1局程序规格球技水平–用球员作为发球方的获胜概率来模拟–不能精确模拟,而只能大概模拟,主要受到计算机表达能力的限制程序规格输入:两个球员的水平,模拟比赛局数输出:两球员各自的获胜局数及比例9随机数模拟的是不确定性事件:rally的输赢是随机的.–这类模拟也称为MonteCarlo算法–其他实例:扔硬币,掷骰子10随机数如何用确定性的计算机模拟非确定性?–确定性的计算机:底层执行的是确定的指令序列(if语句中有条件,但也是确定的,是分支)–用函数生成随机数(实际上是伪随机数)从种子值开始,计算出一个“随机”数;如果还需要,就用上一个随机数反馈给生成函数,生成下一个随机数种子值和随机数产生器决定了所产生的随机数的数值11随机数如何用确定性的计算机模拟非确定性?–用函数生成随机数(实际上是伪随机数)–Python库random提供了一些伪随机数生成函数:库被加载时的日期和时间用以导出种子值;所以,程序每次运行时种子值都是不同的randrange():生成指定范围(类似range)内的一个整数(在足够多的尝试下,可以看到每个数出现的频率是相当的,即均匀分布)random():生成[0,1)间的一个浮点数12确定实现随机投飞镖x=randrange(0,10)[0,10]010.7用random模拟输赢设发球人获胜概率是prob(在[0,1]区间)程序中显然需要这样的代码:if发球者胜了本回合:score=score+1–并且要使该条件为真的情况为概率prob–用random函数模拟:ifrandom()prob:#用”“是因为随机数产生器可以产生0,但无法产生1score=score+114自顶向下设计对复杂问题常采用自顶向下设计:–将对一般问题的解决方案用若干个较小问题来表达–再对较小问题用同样的方法分解–直至小问题很容易求解–将所有小问题的解合并,就得到大问题的解例如:把大象放到冰箱里15顶层设计基本算法:介绍程序功能取得输入:probA,probB,n利用probA和probB模拟n局比赛输出结果报告16顶层设计基本程序(一个函数(大问题)内有很多函数(小问题))defmain():printIntro()probA,probB,n=getInputs()winsA,winsB=simNGames(n,probA,probB)printSummary(winsA,winsB)17分离关注SeparationofConcerns(SoC):将计算机程序分解成不同部分,各部分功能重叠越少越好.–一个关注是指程序中的一个兴趣点或焦点18分离关注好处:–允许多人独立开发系统的不同部分–便于重用(画柱体)–确保系统可维护性(生日歌)–易于增加新功能(作业中房子的问题)–使系统易理解(投资收益)–......19结构图模拟壁球问题的程序被分成了四个关注:–为每个关注定义了函数的接口(interface)或称特征(signature).即函数名,参数,返回值的信息–高层设计时只须关心函数的接口,而非函数的实现20结构图模拟壁球问题的程序被分成了四个关注用结构图(或称模块层次图)表示21抽象在设计的每一层,接口指明了需要下一层的哪些细节;其他可暂时忽略.抽象:确定某事物的重要特性并忽略其他细节的过程–列方程解应用题根据问题需要而保留重要的特征例如:人的特征,一般不会关心头发多少根;身高、体重对于学籍管理系统是不需要的22抽象抽象是基本的设计工具自顶向下设计的整个过程可视为发现有用的抽象的系统化方法–要靠实践来积累23程序设计方法自顶向下、逐步求精其他方法–结构化(搭积木)–模块化(收益程序)–快速原型–面向对象第二层设计(逐步求精)第一个简单函数defprintIntro():printThisprogramsimulatesagameofracquetballprint’betweentwoplayerscalledAandB.’printTheabilitiesofeachplayerisindicatedbyaprintprobability(anumberbetween0and1)thatprinttheplayerwinsthepointwhenserving.PlayerAprintalwayshasthefirstserve.“25第二层设计(逐步求精)第二个简单函数defgetInputs():#注意接口顺序要正确#RETURNSthreesimulationparametersprobA,probBandna=input(Whatistheprob.playerAwinsaserve?)b=input(Whatistheprob.playerBwinsaserve?)n=input(Howmanygamestosimulate?)returna,b,n26第二层设计(续)设计simNGames()winsA和winsB初始化为0循环n次模拟一局ifplayerA胜:winsA加1else:winsB加127第二层设计(续)Python程序实现defsimNGames(n,probA,probB):winsA=winsB=0foriinrange(n):scoreA,scoreB=simOneGame(probA,probB)ifscoreAscoreB:winsA=winsA+1else:winsB=winsB+1returnwinsA,winsB28第三层设计simOneGame:整个模拟程序的关键–是个不确定循环:不断进行回合较量,直至一局结束–需要两个累积器:记分–需要一个二值累积器:记录发球方29第三层设计simOneGame:整个模拟程序的关键得分初始化为0发球方置为A当本局未结束就循环:模拟一次发球修改比赛状态返回比分30第三层设计(续)结束条件用函数gameOver31第三层设计(续)结束条件用函数gameOverdefsimOneGame(probA,probB):scoreA=0scoreB=0serving=AwhilenotgameOver(scoreA,scoreB):ifserving==A:ifrandom()probA:scoreA=scoreA+1else:serving=Belse:ifrandom()probB:scoreB=scoreB+1else:serving=AreturnscoreA,scoreB32第三层设计(续)函数gameOverdefgameOver(a,b):#aandbrepresentscoresfor#aracquetballgame#RETURNStrueifthegameisover,false#otherwise.returna==15orb==15第三层设计(续)函数printSummarydefprintSummary(winsA,winsB):#Printsasummaryofwinsforeachplayer.n=winsA+winsBprint\nGamessimulated:,nprintWinsforA:%d(%0.1f%%)%(winsA,float(winsA)/n*100)printWinsforB:%d(%0.1f%%)%(winsB,float(winsB)/n*100)第三层设计(续)完整程序:rball.py–运行之,看看技术的小差距是否导致大胜负差?0.65vs.0.6–试一试:修改成模拟多局制比赛.设计过程小结自顶向下,逐步求精–将算法表达为一系列较小问题–为每个小问题设计一个(函数)接口–用各小问题的接口细化算法–对各小问题重复此过程自底向上实现编写代码时,从结构图的底层开始实现,逐级向上–代码逐渐增加每完成一个模块,进行单元测试–注意边界值–这也是分离关注,使debug更容易单元测试举例gameOver–(0,0)–(5,10)–(15,3)–(3,15)其他设计技术原型技术(prototyping):从程序的一个简单版本开始,逐步增加功能,直至完全满足程序规格–初始的简单版本称为原型(prototype)其他设计技术原型技术导致螺旋式开发过程:原型的设计,实现,测试新功能的设计,实现,测试……适合情况:对程序功能不熟悉;难以按自顶向下设计方法给出完整设计例:壁球模拟程序的原型simOneGame()–固定水平五五开–固定比赛30个rallyfromrandomimportrandomdefsimOneGame():scoreA=0scoreB=0serving=Aforiinrange(30):ifserving==A:ifrandom().5:scoreA=scoreA+1else:serving=Belse:ifrandom().5:scoreB=scoreB+1else:serving=AprintscoreA,scoreB#监视比赛过程例:对原型的扩展增加两个参数:选手的技术水平改成完成一局比赛(一方先得15分)完成多局比赛,统计各人获胜局数增加交互式输入,格式化输出设计的艺术螺旋式开发与自顶向下设计是互补的方法.–如:原型可使用自顶向下设计程序设计是一种创作,一门科学好的软件设计者会使用多种设计技术通过实践学习软件设计作业EX.9.614习题讲解7.6.5题(成绩)做的都挺好,使用基本的if–elif–else结构就可以习题讲解7.6.9题(保姆)–将时间段按0-66-2121-24小时分段,计算每一段时间的报酬,并加起来–分段:可以将时间转换成从零点开始的分钟数,比如6:30分就是6*60+30=390秒习题讲解7.6.17题(射箭)先画图,然后使用计数器统计每次获得的分数习题讲解8.6.2题(布尔)a,c,d真值表没什么大问题习题讲解8.6.7题(Syracuse)很容易用迭代或者递归求解习题讲解8.6.15题(回归线)–先画图–使用若干计数器统计sum_xsum_ysum_x*ysum_x*x的值–再最后求出直线的斜率–题目要求最终画的回归线充满整个屏幕,而Line只能画线段,所以先求出回归线和window上下边缘的交点,然后使用这两个交点画回归线也可以用回归线和window左右边缘的交点画回归线5151End

1 / 51
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功