【 MATLAB 】通过案例学会编写一个 matlab 函数(小猫掉进山洞问题)

举报
李锐博恩 发表于 2021/07/15 08:19:15 2021/07/15
【摘要】 这是关于matlab学习的第一篇博文,我是不愿意承认自己不会MATLAB的,因为这东西大一的时候就学过,如果白驹过隙,都不好意思说自己研几了,科研的过程中MATLAB是必须要会的,于是得系统的看一下了。自己什么**水平自己又不是不清楚。 问题提出: 一只失明的小猫掉进山洞里,山洞有三个门,其中一个门进去后走2h后可以回到地面,第二个门进去后走4h又回到原始出发点,...

这是关于matlab学习的第一篇博文,我是不愿意承认自己不会MATLAB的,因为这东西大一的时候就学过,如果白驹过隙,都不好意思说自己研几了,科研的过程中MATLAB是必须要会的,于是得系统的看一下了。自己什么**水平自己又不是不清楚。


问题提出:

一只失明的小猫掉进山洞里,山洞有三个门,其中一个门进去后走2h后可以回到地面,第二个门进去后走4h又回到原始出发点,第三个门进去后走6h还是回到原始出发点。猫是随机选择的,求小猫走出山洞的期望时间?

解题的思路如下:

设小猫走出山洞的期望时间为t,如果小猫不幸进了第二个或第三个门,那么它过4h或6h后又和进门之前面临的状况一样了,只不过这两种不幸的情况发生的概率都是1/3。而万幸一次性走出去的概率也是1/3。于是可以得到如下的方程:

t = 2 times(1/3) + (t + 4) times (1/3) + (t + 6) times (1/3)

解得: t = 12。

验证结果的正确性:

下面使用MATLAB编写模拟小猫 n 次出洞时间的函数,该函数返回的结果T为n次出洞时间组成的数组,代码如下:


  
  1. function T = cat_in_holl(n)
  2. T = zeros(1,n);
  3. for k = 1:n
  4. c = unidrnd(3,1);
  5. while c ~= 1
  6. if c == 2
  7. T(k) = T(k) + 4;
  8. else
  9. T(k) = T(k) + 6;
  10. end
  11. c = unidrnd(3,1);
  12. end
  13. T(k) = T(k) + 2;
  14. 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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。