讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。
MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili
节选自第4章:MATLAB程序流程控制
下面我们来看几道典型例题。
(1)质数(Prime number),又称素数,指在大于1的自然数中,除了1和该数自身外,无法被其他自然数整除的数(也可定义为只有1与该数本身两个正因数的数)。给定任意一个大于100的自然数n(例如n=135389),请判断n是否为质数。
思路:我们可以遍历从2到n-1的所有整数,检查它们是否能够整除n。如果找到任何一个能够整除n的整数,那么n就不是质数;否则,n就是质数。
n = 135389; %要判断的数n
is_prime = true; % 初始化标志变量is_prime为true,此时代表n是质数
for ii = 2:n-1 % 思考:如何缩小循环遍历的范围来提高代码运行的效率,留作本章课后习题% 检查ii是否能够整除nif mod(n, ii) == 0% 如果能整除,则n不是质数,将标志变量is_prime重新赋值为falseis_prime = false;break; % 跳出循环end
end
disp(is_prime)
(2)一副扑克牌有54张牌(桃杏梅方四种花色的A 2 3 4 5 6 7 8 9 10 J Q K加双王),假设三名玩家玩斗地主,其中地主有20张牌,两个农民各17张牌。若你是其中一名玩家,且你每次都选择当农民。,请编程模拟以下场景:先玩第一把,若这把手上有炸弹则这把玩完后下场换其他人玩;若手上没有炸弹则继续玩第二把,直到玩到第k把时手上有炸弹,此时玩完这一把后下场换其他人玩。请输出你模拟的k。注意:假设每把牌都洗的足够的混乱,确保为无序;有炸弹是指手上有双王或者有四张相同的牌例如4张3。(这里的k表示你作为农民首次出现炸弹的轮数,由于发牌过程是随机的,那么k肯定也是一个随机的变量,即每次模拟的k可能都不相同。比如运气好可能第一把就出现了炸弹,此时k等于1,运气不好可能需要好多把才会出现炸弹,此时k较大)。
思路:由于循环的次数不定,因此我们可以使用while循环来不断模拟游戏的进行,直到满足退出的条件。在每一轮中,我们作为农民会随机抽取17张牌,并检查是否有双王或者普通的炸弹。如果有任何一种炸弹,就会退出循环,否则会增加游戏的轮数,继续下一轮。最后,我们可以输出模拟的k值,表示玩到第k把时手上有炸弹。
% 用1至13分别代替A 2 3 ... J Q K, 重复4次表示四种花色;用14和15分别代表大小王
poke = [repmat(1:13,1,4),14,15]; % 生成一副扑克牌
k = 1; % 玩了多少把游戏
while 1% 从1:54中随机抽取17个数,表示17张牌对应的下标idx = randperm(54,17); % randperm函数的用法:《第3章:课后习题讲解中拓展的函数》% 发牌并排序(排序后牌面看起来更清楚一点,事实上不排序也不影响下面的代码)p = sort(poke(idx));% 检查是否有大小王v1 = all(ismember([14,15],p)); % v1为true表示有双王,为false表示没有双王% 检查是否有普通的炸弹v2 = false; % v2表示是否有普通的炸弹,先假设没有,因此初始化为falsefor ii = 1:13if sum(p == ii) == 4 % 如果有四张一样的牌v2 = true; % % 将v2赋值为ture,表示有普通的炸弹break % 只要有一个普通的炸弹就可以退出for循环了endendif v1 || v2 % 如果有王炸或者普通炸弹就可以退出while循环break % 跳出while循环elsek = k + 1; % 没有炸弹就再玩一把end
end
disp(k) % 输出首次出现炸弹时玩的轮数
在本题中,既用到了while循环又用到了for循环,且出现了两个不同用途的break,大家课后一定要认真消化,并尝试自己求解这个例题(当然,判断是否存在普通的炸可以不用循环语句,我们在第三章的课后习题中有讲解,详情请看第三章课后习题挑战篇的Q5)。
MATLAB课程第3章课后习题讲解——数学建模清风老师_哔哩哔哩_bilibili
另外,本题还能继续扩展下去,例如重复上面的模拟过程N次(N可以设置得大一点,例如N等于10万),得到这N次模拟结果的k,并计算这N次k的平均值,这个平均值就能表示你作为农民首次出现炸弹所需的期望轮数。这个拓展的问题将留作本章最后的课后习题,我们下一道题也会介绍类似的思想。
(3)一只失明的小猫掉进山洞里,山洞有三个门,其中进入第一个门后走2h后可以回到地面,进入第二个门后走4h会回到原始的出发点,进入第三个门后走6h还是回到原始的出发点。假设小猫每次都随机地选择这三个门中的一个进入,求小猫走出山洞的期望时间?
思路:在上一章的课后习题中,我们见到过类似的题目,当时我们介绍过蒙特卡罗模拟这种方法,蒙特卡罗模拟将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样来获得问题的近似解。我们可以模拟这个过程N次(N一般要设置的大一点,例如让N等于10万),每次模拟中我们都让一只猫走出山洞,并记录下这只猫所需的时间。接下来我们只需要对这N次模拟结果得到的时间计算平均值,就能估计小猫走出山洞的期望时间。
N = 100000; % 设置模拟的次数
T = zeros(N,1); % T用来存储每次模拟得到的时间
for ii = 1:N % 开始进行 N 次模拟t = 0; % 初始化时间while 1 % 开始模拟小猫走出山洞的过程choose = randi(3); % 随机选择第几个门if choose == 1 % 选择第1个门t = t + 2; % 走2小时回到地面break % 小猫成功走出山洞,结束模拟elseif choose == 2 % 选择第2个门t = t + 4; % 走4小时回到原始出发点else % 选择第3个门t = t + 6; % 走6小时回到原始出发点endendT(ii) = t; % 记录每次模拟得到的时间
end
mean(T) % 计算所有模拟结果的平均值,即小猫走出山洞的期望时间的估计