欢迎光临散文网 会员登陆 & 注册

第四章MATLAB程序流程控制(本章小节和课后习题)

2023-09-21 14:31 作者:数学建模学习交流  | 我要投稿

本章小节

(1)条件语句是编程中的重要工具,用于根据不同的条件执行不同的命令。我们介绍了两种条件语句:

  •   if-elseif-else-end 语句:用于多个条件判断,根据条件的不同执行不同的代码块。

  •  switch-case-otherwise-end 语句:适用于多个条件的情况,根据不同的条件选择执行相应的分支。

(2)循环语句是用于重复执行某些操作的重要工具,它能提高代码的复用性和效率。我们介绍了两种循环语句:

  •   for-end 语句:用于已知循环次数的情况。

  •   while-end 语句:适用于未知循环次数的情况,根据条件判断是否继续执行循环。

此外,我们介绍了break 和 continue的用法,它们可以更加灵活地控制循环过程的执行。其中break语句用于终止执行 for 或 while 循环;continue语句用于跳过循环的当前迭代,然后继续下一次迭代。

(3)在编写 MATLAB 程序时,异常处理是关键的,因为程序可能会面临不可避免的错误或异常情况。try-catch 语句允许我们在程序中捕获和处理异常,而不会导致程序崩溃。

(4)除了条件语句、循环语句和异常处理,MATLAB 还提供了其他常用指令,用于控制程序的流程。这些指令包括:

  •   tic 和 toc:用于测量代码块的执行时间,帮助评估程序性能。

  •   pause:用于暂停程序的执行,可以指定暂停的时间长度。

  •   input:用于用户输入数据。

  •   warning:用于在程序运行时生成警告信息。

  •   error:用于终止程序并生成错误信息。

 

课后习题

基础篇



Q2. 下面这段判断正负数的代码有问题吗?应该如何修改?


Q4. 给定一个包含3个元素的行向量a,使用if语句对向量a中的元素按照从小到大的顺序排序,并将排序后的向量保存到sort_a中。例如原来a=[3,8,5],那么sort_a=[3,5,8]。

 

Q5. 在本章介绍break和continue的小节中,有一道判断n是否是质数的例题。当时的思路是遍历从2到n-1的所有整数,检查它们是否能够整除n。如果找到任何一个能够整除n的整数,那么n就不是质数;否则,n就是质数。事实上我们可以缩小循环遍历的范围来提高效率。一般来说,只需要检查从2到n的平方根(sqrt(n))之间的整数,因为如果n有一个大于sqrt(n)的因子,那么它必定有一个小于sqrt(n)的因子。请解决下面两个问题:(1)优化遍历的范围,对于n=10000000991,比较优化前后的代码的运行时间;(2)自然数2至10000中有多少个质数。


Q6. 下面这两段代码输出的结果分别是什么?

Q7. 一个五位正整数各位数字的立方和等于该数本身则称该数为五角星数,请找出所有的五角星数并将其保存到向量S中。

 

Q8. 生成一个8行5列的矩阵,矩阵中每一个元素都是在区间[1,10]上取值的随机整数。接下来请循环每一行,若发现同一行的五个元素中各不相同,则保留该行。

 

Q9. 在本章介绍break和continue的小节中,有一道和斗地主相关的例题。请使用蒙特卡罗模拟计算你作为农民首次出现炸弹所需的轮数的期望值。

 


提高篇

Q1. 一张100元的人民币要换成10元、5元和1元面值的零钱,要求以上零钱的总张数为20张,且要求每张面值不少于一张,用一个矩阵表示所有可能的组合,矩阵中每一行的三个元素分别表示三种面值人民币的张数。

 

Q2. 假设自然界中有一种动物,它每天被天敌捕食的概率均为0.02,且每天是否被天敌捕食这个事件是独立的。请使用蒙特卡罗模拟得到这种动物能存活的天数的期望值。

 

Q3. 一个班上30个同学,请使用蒙特卡罗模拟计算至少有两人是同一天生日的概率。


Q4. 每隔0.5秒在界面上随机的输出0或1,当连续出现三次1时,停止输出。

 

Q5. 扔一枚正常的硬币,若要扔出连续的3个正面,所需扔骰子的期望次数是多少?请使用蒙特卡罗模拟进行计算,精确的数学答案是14。

 


Q7. 随机生成一个各行各列和均为1的5阶方阵,且该方阵的元素仅为0或1。例如下面这个矩阵就符合要求。(大家也可以尝试不使用循环语句得到这个随机的方阵)


Q8. 将一根长度为1米的木棍随机的折成三段,请用蒙特卡洛模拟分别计算以下两个概率:(1)每段长度都不大于0.45的概率;(2)这三段能构成一个三角形的概率。

 

Q9. 蜗牛从10米深的井底爬,白天爬一米,晚上下落x米,其中x为[0,2]米的均匀分布的随机数,那么爬上去的期望天数是多少?这个题目选自知乎,精确答案约为277天。

 

Q10. 给定一个1到1亿之间的整数,请判断这个整数是否为回文数(如:1,121,1221都是回文数)。

 

Q11. 二分搜索法不仅可以用于求函数的零点,还可以用于寻找向量中的特定值。给定一个长度为100且递增排列的向量x和一个要查找的目标值t,使用二分搜索法确定向量x中是否存在目标值t,若存在则返回其下标,不存在则返回0。请回答下面两个问题:(1)为了方便,你可以使用下面两句代码随机生成x和t:x = sort(randi(200,1,100));  t = 88; 若x中存在多个t,只需要返回任意一个t的下标。(2)假设我们令x = sort(randi(50,1,200));  t = 5,那么x中出现多个t的次数将大大增加。请在上一问代码的基础上进行调整,使得代码能够输出t所在的所有下标。(你可以和find函数找到的结果进行比较:find(x == t),看看结果是否一致)

 

Q12. 一个人扔一枚均匀的六面骰子,数值1到6,从起点开始,扔到几就向前走几格,可以无限次扔骰子,问他恰好走过第100格的概率是多少? 这个题目选自知乎,精确答案约为2/7。


Q13. 编写一个猜数游戏的代码,规则如下:程序随机生成1~100内的整数,让用户去猜,用户每猜一次程序都会做出相应的提示。若用户输入所猜的数字小于电脑随机生成的数字,则提示“你猜小了!”;若大于,则提示“你猜大了!”;若相等,则提示“恭喜你赢了!”,游戏结束。如果用户猜的次数超过了六次,则提示“最多猜六次,你失败了。”,此时游戏结束。

 

Q14. 知乎上有这样一个问题:

请使用蒙特卡罗模拟验证这个答案是否可行(假设有30个人玩这个游戏)。


Q15. 下面这题来自2022年阿里巴巴全球数学竞赛,请大家求解该题。

挑战篇

Q1. 排序算法是一类经典的算法,它们能将一个无序的向量变成有序的向量。请大家在网上搜索插入排序、选择排序和冒泡排序的视频或者资料,并使用MATLAB复现。为了测试方便,你可以令x=randi(100,1,20),将x中的元素按照从小到大进行排序。若你的代码返回的结果和sort(x)的结果相同,则说明你做对了。

 

Q2. parfor(Parallel for)是MATLAB中的一种并行编程工具,用于在多个处理核心上并行执行循环迭代。它类似于常规的 for 循环,但是可以在多个工作进程上同时执行循环的迭代,从而加速代码的执行,特别是对于需要重复计算或处理大数据集的任务。请大家在MATLAB官网搜索parfor相关的内容,并尝试将你之前代码中的for改成parfor,查看代码能否正常运行,若能运行则比较for循环和parfor循环的运行时间。

 

Q3. 某游戏中有一把武器,该武器的初始等级为1级,在游戏开始时玩家可以免费领取。在游戏中,玩家可可以花费金币对该武器进行升级,每次升级需要花费10000金币,且该武器最多能被升至5级。各等级升级的成功率如下表所示:

以第一行和第三行为例,表格中各元素的解释如下:

  • 1级武器升级时,有20%的概率升到2级,10%概率升到3级,5%的概率升到4级,65%的概率不变。

  •  3级武器升级时,10%概率跌到1级,20%概率跌到2级,20%概率升到4级,10%概率升到 5 级,40%的概率不变。

请使用蒙特卡罗模拟,计算打造一把5级的武器平均需要花费多少金币。

 

Q4. 某设备上安装有四只型号规格完全相同的电子管,已知电子管寿命(假设为整数)在1000至2000小时之间均匀分布。当电子管损坏时有两种维修方案,一是每次更换损坏的那一只;二是当其中一只损坏时四只同时更换。已知更换时间为换一只时需要1小时,4只同时更换需要2小时。若更换时机器因停止运转导致每小时的损失为200元,若每只电子管价格100元,试用蒙特卡罗模拟决定选择哪一个维修方案更省钱(为了方便,你可以设置总的模拟时长为10万小时,比较该设备运行10万小时后,哪种方案花费更小)?

 

Q5. 三门问题(Monty Hall problem)又称蒙提霍尔问题或蒙提霍尔悖论,它是一道非常有趣的概率问题,该问题的答案违反大家的直觉。请大家自己搜索三门问题的相关资料,并使用MATLAB验证三门问题的答案。


Q6. 莱斯利矩阵是英国生态学家Leslie于1945年提出的一种数学方法,该方法能利用某一初始时刻种群的年龄结构现状,动态地预测种群年龄结构及数量随时间的演变过程。请大家查阅相关资料学习该模型的建模过程,并解决下面这个问题。

已知某动物最长寿命为10岁,且初始状态下该动物各年龄组的数据如下表所示:

假设该动物的繁衍过程满足以下条件:

  • 该动物在各个年龄段的雌雄比例都是2:1;

  • 新出生的该动物的雌雄比例也是2:1;

  • 各年龄段内该动物的死亡率都相同。

请回答以下问题:

(1)预测该动物未来30年各年龄段的数量以及占比;

(2)若该动物的天敌在第30年后开始出现,这将导致从下一年开始各年龄段的死亡率均增加到原来的3倍。请问该动物从遭遇天敌开始,需要多少年该动物的数量会下降到1000只内。


 

Q7. 本题来自2023年阿里巴巴全球数学竞赛,题目如下:A与B二人进行“抽鬼牌”游戏。游戏开始时,A手中有n张两两不同的牌。B手上有n+1张牌,其中n张牌与A手中的牌相同,另一张为“鬼牌”,鬼牌与其他所有牌都不同。游戏规则为:

(1)    双方交替从对方手中抽取一张牌,A 先从B手中抽取。

(2)    若某位玩家抽到对方的牌与自己手中的某张牌一致,则将两张牌丢弃。

(3)    最后剩一张牌(鬼牌)时,持有鬼牌的玩家为输家。

假设每一次抽牌从对方手上抽到任一张牌的概率都相同,请用蒙特卡罗模拟n分别为31和32时,A 获胜的概率。(参考答案:n=31时为17/33,n=32时为9/17)。

 

Q8. 下面我们来看一道排队论的题目。假设某银行工作时间只有一个服务窗口,工作人员只能逐个接待客户。当来的顾客较多时,一部分客户就需要排队等待。若假设下面四个条件成立:(1)从银行开始营业起,客户到来的间隔时长(单位为分钟)服从参数为0.1的指数分布;(2)每位客户的服务时长服从均值为10,方差为4的正态分布(单位为分钟,若服务时长小于1分钟,则按1分钟计算);(3)排队按先到先服务的规则,且不限制队伍的长度;(4)银行每天工作时长为8小时,若客户开始服务的时间比银行下班的时间晚,银行不提供服务。请模拟100个工作日,计算出平均每天接待客户的人数以及每天客户的平均等待时长。

 

Q9. 在上一题的基础上,解决下面两个进阶的问题:(1)若顾客抱怨等待时间太长,银行准备开设第二个服务窗口,请计算有两个服务窗口的情况下,这100个工作日内银行平均每天接待客户的人数以及每天客户的平均等待时长。为了简化模拟,我们可以假设:顾客会选择当前没有在服务的窗口;若两个窗口都有服务,他们选择结束时间较早的那个窗口(这和现实中的先取号再叫号的策略一样)。(2)若银行新开设的第二个窗口每天仅在前四个小时提供服务,请重新计算第一问的结果(若客户的到达时间超出了前四个小时,则客户只能去第一个窗口接受服务)。


第四章MATLAB程序流程控制(本章小节和课后习题)的评论 (共 条)

分享到微博请遵守国家法律