【 MATLAB 】通过案例学会编写一个 matlab 函数(小猫掉进山洞问题)
这是关于matlab学习的第一篇博文,我是不愿意承认自己不会MATLAB的,因为这东西大一的时候就学过,如果白驹过隙,都不好意思说自己研几了,科研的过程中MATLAB是必须要会的,于是得系统的看一下了。自己什么**水平自己又不是不清楚。
问题提出:
一只失明的小猫掉进山洞里,山洞有三个门,其中一个门进去后走2h后可以回到地面,第二个门进去后走4h又回到原始出发点,第三个门进去后走6h还是回到原始出发点。猫是随机选择的,求小猫走出山洞的期望时间?
解题的思路如下:
设小猫走出山洞的期望时间为t,如果小猫不幸进了第二个或第三个门,那么它过4h或6h后又和进门之前面临的状况一样了,只不过这两种不幸的情况发生的概率都是1/3。而万幸一次性走出去的概率也是1/3。于是可以得到如下的方程:
解得: t = 12。
验证结果的正确性:
下面使用MATLAB编写模拟小猫 n 次出洞时间的函数,该函数返回的结果T为n次出洞时间组成的数组,代码如下:
-
function T = cat_in_holl(n)
-
T = zeros(1,n);
-
for k = 1:n
-
c = unidrnd(3,1);
-
while c ~= 1
-
if c == 2
-
T(k) = T(k) + 4;
-
else
-
T(k) = T(k) + 6;
-
end
-
c = unidrnd(3,1);
-
end
-
T(k) = T(k) + 2;
-
end
-
在MATLAB命令窗口输入edit命令,进入编辑器,将上述代码粘贴进去,保存文件为 cat_in_holl.m文件,并使之在MATLAB搜索路径上,之后在命令窗口输入: Z = cat_in_holl(10000);来观察模拟小猫 10 000次出洞的时间。
之后运行mean(Z)就可以观察平均时间,随着n的增大,mean(Z)也就越来越接近期望值12。
如下:
mean(Z)
ans =
11.8698
>> Z = cat_in_holl_function(100000);
>> mean(Z)ans =
12.0135
其实,说到这里,单纯这个问题已经解决了,可是我的目的并非仅有这些,重点在于对于程序的理解,上述程序没有一个注释,当然不好理解,下面来解释这个程序:
上述程序是一个函数,程序的第一行是函数的声明,函数体必须另起一行开始写。
第一行:function 是函数声明符,其后定义了函数的输出变量T,函数名cat_in_holl,以及输入变量n。
下面进入函数体部分,T = zeros(1,n);表示生成一个一行n列的全零行向量,这步主要就是预分配内存,因为最后得到的T是n次小猫出洞的时间组成的一个数组,数组长度事先已知。给T预分配内存是基本的MATLAB高效编程准则之一。
接下来是一个for循环体(k从1循环到n),for循环体内部还有一个while循环体(当c不等于1时,运行while循环体内部的代码),while循环体内还有一个if——else选择分支结构。这些循环以及选择分支的意义和其他语言都类似,不同的就是格式,每一个循环体或者选择分支结构结束时,以end结尾。
unidrnd是MATLAB自带的函数,unidrnd(3,1)表示在1,2,3中等概率的生成一个数字。
在命令窗口输入
help unidrnd
得到如下介绍:
unidrnd - Discrete uniform random numbers
This MATLAB function generates random numbers for the discrete uniform
distribution with maximum N.
R = unidrnd(N)
R = unidrnd(N,m,n,...)
R = unidrnd(N,[m,n,...])
其他的都很好理解,这篇博文到此为止。本文参考资料为:《MATLAB高效编程技巧与应用》
文章来源: reborn.blog.csdn.net,作者:李锐博恩,版权归原作者所有,如需转载,请联系作者。
原文链接:reborn.blog.csdn.net/article/details/82830904
- 点赞
- 收藏
- 关注作者
评论(0)