基于Matlab语言的MonteCarlo入门教程精品资料.doc
前言与说明一、Monte Carlo方法是一门简单而复杂的学问Monte Carlo方法往小的方面说很简单,就是生成一堆随机数,然后以某函数规则计算出一堆数值,最后求这些数值的平均值就得到了结果;往大的方面说却很复杂,要将蒙特卡洛做好需要考虑的问题很多,例如:1. 需要解决的问题是否收敛倘若不收敛,Monte Carlo方法就不能用,不然计算出来的结果有何意义,只有老天才知道;2. 所选用的具体方法收敛速度如何虽然几乎所有Monte Carlo收敛阶数为1/2,但不同的方法收敛阶数前面的系数不同;3. 所得解的误差是多少Monte Carlo方法从来得不到精确值,而是一个近似的随机变量,因此,任何时候,报告Monte Carlo解时,需要同时报告该解的方差;4. 如何选择具体算法,以加快速度Monte Carlo模拟需要较长时间,所以速度很重要。尤其是你使用Monte Carlo方法实时计算金融产品价格时,时间就是金钱。加快Monte Carlo速度有很多或大或小的技巧,而且这些技巧还要依据不同问题而定。5. 伪随机数问题计算机生成的随机数都是伪随机数,很多Monte Carlo书中都大书特书伪随机数的危害以及如何生成尽可能“真”的伪随机数。有此告诫在,我们自然不能对伪随机数问题视而不见,但是我们是否就要因这一问题惶惶不可终日呢?6. 模型与现实模型是我们的理想,但是现实中的市场却是残酷的。如果有人仅仅拿着书本就冲进市场,那他必然还要交高昂的学费,最终鲜血淋漓地出来。同理,Monte Carlo方法(以及其他几乎所有方法),任何时候都只能给我们作参考。然而,我们却可以以科学的态度和方法使用Monte Carlo方法,以使其结果更加贴近现实,参考价值更大。二、本课程将解决的问题作为一门针对非学术人士的入门性质的课程,本课程最注重的是基础的应用性知识。在接下来,我会详细讲述Monte Carlo方法本身,且为了确保大家看懂,我会精选一些例子,从这些例子的数学推导,到算法描述,到程序设计,到误差分析,这些基础过程都将涉及。尤其考虑到我见过的不少人(尤其是论坛上的不少网友),编程基础比较薄弱,所以在讲解程序时我会逐句分析,至少确保你能看懂这个程序的每个步骤。另一方面,入门课程还肩负为大家未来学习奠定基础的重要使命,故课程中要覆盖各个方面的内容,例如上一节所提到的都或多或少有所覆盖。但是,正是因为这是一个入门性质的课程,很多的内容无法涉及,同时很多有所涉及的内容也无法充分展开。具体在下文中涉及到相关内容时我会尽量提供进一步学习的方向、方法等延伸性问题。这里值得一提的是上文所提及的模型与现实的问题。本课程中的例子基本都是理论化的例子,这样的例子好处在于它简化了很多复杂的现实状况,对于初学者而言容易上手,也便于教授Monte Carlo方法如何使用,同时它还是解决现实问题的基础。所以,要特别注意,我在课程中讲的那些金融工具定价的例子都是理论化的例子,千万不要以为学会那些之后就已经学会了现实中的金融产品的定价,套用一句广告词:“才刚刚开始呢”。三、章节设置常见的Monte Carlo书籍包含如下内容:随机数的生成、特定分布抽样、优化(降低方差)技巧、随机过程模拟、Monte Carlo方法实际应用、以及扩展(主要是Quasi-Monte Carlo,即拟蒙特卡洛方法)本教程覆盖随机数生成、特定抽样分布、随机过程模拟和应用实例。但和那些书籍不同在于如下这些方面:不详细讲伪随机数问题我们用Matlab内附带的随机数生成器,将伪随机数问题留给Mathworks的专家吧不讲降低方差技巧降低方差技术讲的是怎样更快地作Monte Carlo,而这是入门教程,目的在教会你怎样做Monte Carlo,如果你还不会做就去学怎样可以做得更快那没有意义。所以,先学会基本使用方法最重要,优化的问题在熟练后再讲述就水到渠成了。特定分布抽样会讲很多有用的技巧,例如Reject Method、条件分布方法、协方差阵、Copula等方法生成联合分布随机变量,但是如果讲述太深,每个内容都可以写一本书了,所以不会讲太深,只讲用的最多的那很少一部分内容。并行Monte Carlo很多入门的书上不会讲这个,但是这个课程里面会专门用一章讲,更详细介绍见本章倒数第三小节。四、课程的教授模式本课程中每个知识点基本按照如下步骤展开:(一)理论基础主要介绍与知识点息息相关的基础知识,例如公式的数学推导、概念的含义、Matlab语句基础、计算机相关知识等等。这样做最大的作用是帮助大家回忆这些内容,以便与主体内容展开相衔接。由于这并非主旨所在,所以不会在其上花费过多笔墨。若你从未接触过这些基础知识,你要是看一遍课程中的简介就懂了自然最好,若不懂,则建议翻阅相应的参考书籍。我会在课程讲义最后附上我写作本课程讲义所用到的所有参考书目。(由于我习惯看英文原版书,所以此教程的参考书目大多数是英文书籍)(二)主体内容不必多言,就是知识点的展开。(三)相关例子每个知识点后面我会附上一些与其有关的简单的例子。(四)注意事项任何知识、方法都有它自身的局限,所以仅仅知道方法怎么做还不够,还需要明白这些方法何时何地能用。从另一个角度来看,本课程主要包含如下资料:(一)讲义就是你当前看到的这份资料。此资料覆盖所有便于书写的内容。而且,购买了视频教程的网友将收到PDF版本的讲义;同时这份讲义还会以HTML网页的形式挂在我的个人主页(由于我的个人主页是商业空间,需要大量的流量才能产生足以支持空间运营的广告收入,所以请购买了视频教程的网友不要在未经我个人允许前提下将PDF讲义等资料公布在网络上,对此我保留追究法律责任的权力。特别需要指出一点:由于时间紧迫,写作讲义时文字不经细细斟酌,虽然意思基本表达清楚,但中文语法错误在所难免。今后有时间会逐句修改,也欢迎大家帮忙校订,具体做法是:保存当前网页为html,用word打开网页,另存为doc,之后再修订文档。(二)PPTPPT主要覆盖一些公式性推导和一些我并不拥有完全版权的内容有些比较独特的知识、例子来自于我在北京大学的金融工程等课程,将其以电子版发布在网络上会冒犯到为这些知识、例子付出很多心血的老师故PPT不会分发(无论是否购买视频教程),但是会显示在视频中。观众通过暂停视频的方式阅读这些内容。(三)代码Monte Carlo的代码不是很复杂,但要写出高质量的代码却不容易,所以对于大多数例子我会写至少两个版本代码,一个是基础版本,采用大家最熟悉的最基础的Matlab语句来写;另一个是优化后的版本,这一版本将充分考虑Matlab特点进行优化,但是它可能不那么容易读懂。对于购买了视频的网友,我会将PDF和代码文件放在一个压缩包中发送至你的邮箱,只要将此附件解压缩即可得到代码文件。(四)视频教程视频教程文件太大,我不可能找到足够的免费空间来存放这些视频文件,免费提供给大家观看。故视频教程将借助其他网站的空间。在我当前与人大经济论坛的合同结束前,此视频教程由人大经济论坛独家提供。具体的网址见:http:/baoming.pinggu.org/Default.aspx?id=11五、基础知识要求虽然我会在每章开始部分很简略地复习部分基础概念,但是要顺利完成此课程,请确保自己牢固掌握了如下知识。(一)数学基础学习Monte Carlo必备基础的概率论知识。随机变量、PDF(随机变量的概率分布)、CDF(随机变量的累积分布)、联合分布、条件分布、边缘分布、COPULA、随机微分方程(SDE)等等。而且不仅仅是知道这些概念是什么含义,还要会用、会算。不过也不用被这些吓到,虽然我在相关章节讲的内容比较深,这些知识都全要用到,但是里面最重要的知识只有一个,那就是正态分布。你只要会熟练学习正态分布,就可以解决不少金融产品理论定价的问题。话说回来,必须指出,本教程里面涉及的数学相对于真正难的知识还只是入门,要做现实市场中的产品定价这些知识远远不够。补充说明,大多数理论定价模型,例如Black Scholes模型,Black模型,为了推导简便起见(当前也限于这些论文写作时的计算机技术等外界因素),都只考虑正态分布;但是,在真实市场中,很多经济变量(例如股票收益率),可能符合白噪声假设,但是一般不符合正态分布假设及独立假设。总之,只掌握正态分布,理论模型基本不会有问题,却不足以做真实市场的分析。(二)Matlab基础本教程的某章中,我会简略讲讲编程入门知识。但是Matlab的基本操作需要你自己去看。要求掌握程度可以参考我写得Matlab简明教程(三)金融工程知识虽然这个教程没有明确表明专门讲金融产品定价,但是这里用了不少金融产品理论定价的例子来解说Monte Carlo方法,如果你对金融工程比较熟悉,那么看这些部分相对会更顺利。即使不熟悉也没关系,每个例子的开始部分,我会简要解释相关背景知识。(四)计算机基本知识由于需要讲述Matlab实际操作,所以你应该熟悉Matlab软件启动退出,磁盘目录概念;另外会讲述并行Monte Carlo计算,所以你应该明白双核概念,内存CPU等等基本知识总要懂一点的。其他的不要求。六、Monte Carlo并行计算这里还特别提一下并行计算。现在双核机器基本普及,还有不少网友的机器是三核甚至四核,如果能够同时使用多个核心做计算,运算速度可以有显著提升。幸运的是, 方法的特点使得它特别适合并行计算。所以,在这个教程中,我将用独立的一章特别讲述如何使用Matlab并行计算工具箱(Parallel Computing Toolbox)做Monte Carlo模拟。我会先介绍并行计算的基础知识(例如两种主要的并行模式),以及会更详细介绍Matlab并行计算工具箱的工作原理Matlab的并行计算并非标准的并行计算,必须了解其特点才能发挥并行计算优势,否则速度可能更慢。介绍完基础知识,我将通过将此前各章的Monte Carlo例子改写为并行计算代码这种形式来讲述Monte Carlo并行算法。之后,还将特别列出用Matlab做并行Monte Carlo的一些注意事项,并给出一些用以确保效率的简要规则。七、关于回答疑问不论是否购买了视频教程都可以通过邮件形式联系我,我的Email地址在主()页上及视频教程中已标明。我很乐意就本课程相关的任何问题与大家交流。不过有几点还请大家理解:1. 由于我邮箱中垃圾邮件很多,所以你写信时的书写方式和内容尽量确保不要被Gmail当成垃圾邮件处理掉2. 我事情比较忙,所以可能不能及时回信,还请见谅。3. 有疑问可以通过邮件联系我,也可以直接在论坛上相关板块发帖咨询。(我收邮件频率一般高于上论坛频率)4. 在询问我之前强烈建议你在讲义、我主页的FAQ栏目中查询是否已有类似问题。5. 提问一定要详细具体,并附上详尽的背景材料,那些飘渺无踪影的问题实在令人无从下手!6. 我回答问题的方式可能是直接给出代码等解答,也可能是告知你从何处寻找相关信息以自己解决即授人以鱼和授人以渔这两种方式我都有可能选择。7. 如果所提问题有很好的代表性,我将略去或更换你提问中涉及你个人情况的信息、数据,然后将此问题的解答方法放置在课程主页上,以便其它网友参考。8. 我保证会很认真对待每位网友每个有意义的问题并会尽力去寻找答案,但我无法保证每个问题我都能回答。八、关于后续课程这个课程只讲基础。主要作用有两个,一个是为更深课程提供一个入门途径,这样将来我要是讲更深课程时就不必浪费时间讲基础知识了;另一个是投石问路,我的时间一直很紧张,此课程也是第一次和人大经济论坛合作,因此我需要看看市场反应再决定是否有必要花费大量时间准备延伸课程。如果结果显示有足够数量的网友对这方面的知识很感兴趣(这个主要体现在视频购买上哈哈),那么我可能考虑推出关于金融产品Monte Carlo定价的课程。在那个课程中,理论模型不再是主要内容,我会从现实出发,从如何分析市场历史数据以得到重要参数,到如何建立各种模型,再到现实中各项应用等等。九、版权申明未经本作者书面授权许可,本课程任何资料不得用于商业或盈利性用途。讲义的PDF版本仅仅提供给购买了视频教程的最终用户,此讲义可以复印,也可打印后分发,但未经作者本人书面许可,任何人不得散发讲义PDF电子版。网页版本的讲义可下载,且在保证网页文件未被认为修改情况下可以公开传播,但考虑到我会时常更新网页版本内容,强烈建议直接访问课程网站。除上述两种情况外,任何材料不得在未经作者本人书面授权许可情况下散发。第一章:Monte Carlo方法概述讲课人:Xaero Chang | 课程主页: 本章主要概述Monte Carlo的一些基础知识,另外包括一个最简单的用Monte Carlo方法计算数值积分的例子。一、Monte Carlo历史渊源Monte Carlo方法的实质是通过大量随机试验,利用概率论解决问题的一种数值方法,基本思想是基于概率和体积间的相似性。它和Simulation有细微区别。单独的Simulation只是模拟一些随机的运动,其结果是不确定的;Monte Carlo在计算的中间过程中出现的数是随机的,但是它要解决的问题的结果却是确定的。历史上有记载的Monte Carlo试验始于十八世纪末期(约1777年),当时布丰(Buffon)为了计算圆周率,设计了一个“投针试验”。(后文会给出一个更加简单的计算圆周率的例子)。虽然方法已经存在了200多年,此方法命名为Monte Carlo则是在二十世纪四十年,美国原子弹计划的一个子项目需要使用Monte Carlo方法模拟中子对某种特殊材料的穿透作用。出于保密缘故,每个项目都要一个代号,传闻命名代号时,项目负责人之一von Neumann灵犀一点选择摩洛哥著名赌城蒙特卡洛作为该项目名称,自此这种方法也就被命名为Monte Carlo方法广为流传。十一、Monte Carlo方法适用用途(一)数值积分计算一个定积分,如,如果我们能够得到f(x)的原函数F(x),那么直接由表达式: F(x1)-F(x0)可以得到该定积分的值。但是,很多情况下,由于f(x)太复杂,我们无法计算得到原函数F(x)的显示解,这时我们就只能用数值积分的办法。如下是一个简单的数值积分的例子。数值积分简单示例如图,数值积分的基本原理是在自变量x的区间上取多个离散的点,用单个点的值来代替该小段上函数f(x)值。常规的数值积分方法是在分段之后,将所有的柱子(粉红色方块)的面积全部加起来,用这个面积来近似函数f(x)(蓝色曲线)与x轴围成的面积。这样做当然是不精确的,但是随着分段数量增加,误差将减小,近似面积将逐渐逼近真实的面积。Monte Carlo数值积分方法和上述类似。差别在于,Monte Carlo方法中,我们不需要将所有方柱的面积相加,而只需要随机地抽取一些函数值,将他们的面积累加后计算平均值就够了。通过相关数学知识可以证明,随着抽取点增加,近似面积也将逼近真实面积。在金融产品定价中,我们接触到的大多数求基于某个随机变量的函数的期望值。考虑一个欧式期权,假定我们已经知道在期权行权日的股票服从某种分布(理论模型中一般是正态分布),那么用期权收益在这种分布上做积分求期望即可。(五)随机最优化Monte Carlo在随机最优化中的应用包括:模拟退火(Simulated Annealing)、进化策略(Evolution strategy)等等。一个最简单的例子是,已知某函数,我们要求此函数的最大值,那么我们可以不断地在该函数定义域上随机取点,然后用得到的最大的点作为此函数的最大值。这个例子实质也是随机数值积分,它等价于求此函数的无穷阶范数(-Norm)在定义域上的积分。由于在金融产品定价中,这部分内容用的相对较不常见,所以此课程就不介绍随机最优化方法了。十二、Monte Carlo形式与一般步骤(一)积分形式做Monte Carlo时,求解积分的一般形式是:X为自变量,它应该是随机的,定义域为(x0, x1),f(x)为被积函数,(x)是x的概率密度。在计算欧式期权例子中,x为期权到期日股票价格,由于我们计算期权价格的时候该期权还没有到期,所以此时x是不确定的(是一随机变量),我们按照相应的理论,假设x的概率密度为(x)、最高可能股价为x1(可以是正无穷)、最低可能股价为x0(可以是0),另外,期权收益是到期日股票价格x和期权行权价格的函数,我们用f(x)来表示期权收益。(二)一般步骤我将Monte Carlo分为三加一个步骤:1依据概率分布(x)不断生成随机数x, 并计算f(x)由于随机数性质,每次生成的x的值都是不确定的,为区分起见,我们可以给生成的x赋予下标。如xi表示生成的第i个x。生成了多少个x,就可以计算出多少个f(x)的值2将这些f(x)的值累加,并求平均值例如我们共生成了N个x,这个步骤用数学式子表达就是3到达停止条件后退出常用的停止条件有两种,一种是设定最多生成N个x,数量达到后即退出,另一种是检测计算结果与真实结果之间的误差,当这一误差小到某个范围之内时退出。有趣的类比:积分表达式中的积分符合类比为上式中累加符号,dx类比为1/N(数学知识告诉我们积分实质是极限意义下的累加;f(x)还是它自己,积分中的(x)可类比为依据(x)生成随机数4误差分析Monte Carlo方法得到的结果是随机变量,因此,在给出点估计后,还需要给出此估计值的波动程度及区间估计。严格的误差分析首先要从证明收敛性出发,再计算理论方差,最后用样本方差来替代理论方差。在本课程中我们假定此方法收敛,同时得到的结果服从正态分布,因此可以直接用样本方差作区间估计。详细过程在例子中解释。这个步骤的理论意义很重要,但在实际应用中,它的重要性有所淡化,倘若你的老板不太懂这些知识,你报告计算结果时可以只告诉他点估计即可。注意,前两大步骤还可以继续细分,例如某些教科书上的五大步骤就是将此处的前两步细分成四步。十三、最简单的例子举个例子:计算从函数从0到2的定积分值。数学方法:我们已知的原函数是,那么定积分值就是:=6.38905609893065 。计算这个数值可以在Matlab中输入代码:exp(2)-exp(0)上面得到的值是此不定积分的真实值。常规数值积分:在区间内取N个点,计算各个点上的函数值,然后用函数值乘以每个区间宽度,最后相加。Matlab代码:N=100;x=linspace(0,2,N);sum(exp(x).*2/N)试着调大N的值,你会发现,最后的结果将更接近真实值。Monte Carlo数值积分法:在内随机取N个点,计算各个点上的函数值,最后求这些函数值的平均值再乘以2(为何要乘以2在后面小节详细讲)。看Matlab代码:N=100;x=unifrnd(0,2,N,1);mean(2*exp(x)同样的,通过增大N,这种方法得到的结果也将越来越接近真实值。解释这个例子要求的积分形式是:, 还不完全是形式,我们先做变换,这里是f(x);1/2是(x),它表示,在取值范围(0,2)区间内,x服从均匀分布。前一例子共三条语句,逐句解释如下:N=100;设定停止条件,共做N次Monte Carlo模拟。x=unifrnd(0,2,N,1);按照(0,2)区间均匀分布概率密度对x随机抽样,共抽取N个xi。此句相当于第一个步骤中的前半部分。mean(2*exp(x)2*exp(x)作用是对每个xi计算f(xi)的值,共可得到N个值,这个相当于第一个步骤后半部分;Mean()函数的作用是将所有的f(xi)加起来取平均值,相当于第二个步骤。这段代码中的停止条件隐含于N值设定中,它一次性生成N个x值,完成此次计算后整个程序就结束了。十四、Monte Carlo方法的优点对比前面常规数值积分和Monte Carlo数值积分代码,同样数量的N值也就意味这几乎相同的计算量常规数值积分结果的精确度要高于Monte Carlo数值积分的结果。那么,我们为何还需要用Monte Carlo来算数值积分呢?答案的关键在于,常规数值积分的精度直接取决于每个维度上取点数量,维度增加了,但是每个维度上要取的点却不能减少。在多重积分中,随着被积函数维度增加,需要计算的函数值数量以指数速度递增。例如在一重积分中,只要沿着x轴取N个点;要达到相同大小的精确度,在s重积分中,仍然需要在每个维度上取N个点,s个纬度的坐标相组合,共需要计算Ns个坐标对应的f()函数值。取点越多,会占用计算机大量内存,也需要更长运算时间,最终导致这种计算方法不可行! Monte Carlo方法却不同,不管是积分有多少重,取N个点计算的结果精确度都差不多。因此,即使在一重积分的情形下,Monte Carlo方法的效率比不过常规数值积分,但随着积分维度增加,常规数值积分的速度呈指数下降,Monte Carlo方法的效率却基本不变。经验表明,当积分重数达到4重积分甚至更高时,Monte Carlo方法将远远优于常规数值积分方法。现在回到金融产品定价,欧式期权理论定价公式只需要一重积分,此时Monte Carlo方法的效果不明显,但是如果我们考虑一个亚式期权:期限为1年期,期权价格基于此1年内每天某个时点时的价格,全年共252个交易日,这样此亚式期权理论定价公式是一个252重积分。常规的数值积分方法,需要取N252个点,这个数有多大,你自己去计算一下就知道了(注意:N取值要远远大于2),常规数值积分方法不可行,只能用Monte Carlo。综上,如果计算高维度多重积分,如路径依赖的exotic options(奇异期权)等金融产品定价,我们一般用的方法都是Monte Carlo。十五、Monte Carlo方法原理(选读)Monte Carlo方法计算的结果收敛的理论依据来自于大数定律,且结果渐进地(Asymptotically)服从正态分布的理论依据是中心极限定理。以上两个属性都是渐进性质,要进行很多次抽样,此属性才会比较好地显示出来,如果Monte Carlo计算结果的某些高阶距存在,即使抽样数量不太多,这些渐进属性也可以很快地达到。这些原理在理论上意义重大,但由于我们一般遇上的Monte Carlo问题都是收敛的、结果也都是渐进正态分布,所以工作中使用时可以不加考虑。详细推导见相关书籍。第二章:随机数的生成讲课人:Xaero Chang | 课程主页: 本章第一节会简要复习随机变量的一些概念,但学习本章最好要有一定的数学基础。第二节主要介绍如何生成一维概率分布的随机数,第三节介绍如何生成高维分布的随机数。最后略提及伪随机数问题的应对策略。由前文可知,Monte Carlo积分解决的问题形如,f(x)值只需由x值决定,因此此处最重要的就是如何生成服从(x)概率分布的随机数。可以说,正确生成随机数,Monte Carlo方法就做完了一半。一、随机变量基本概念(一)随机变量现实世界中有很多可以用数字来衡量的事物,站在当前时间点来看,它们在未来时刻的值是不确定的。例如,我们掷一骰子,在它停稳前,我们不可能知道掷出多少点(传说中的赌王除外,哈哈);例如某只股票在明天的股价,没有人能准确知晓第二天股票的价格(不然他就发惨了!)。但是,我们却可以描述这些事物未来各种值的可能性。(二)离散型随机变量离散型随机变量最重要的是分布律,即每个取值的概率是多少。例如掷骰子,我们认为扔出任何一个点的概率都是1/6。那么掷骰子得到的点数的分布律如下表:骰子点数123456概率1/61/61/61/61/61/6(三)连续性随机变量连续型随机变量有两个重要的概念。概率密度函数(PDF)和累积概率分布函数(CDF),具体定义见数学书籍。PDF函数本身不是概率,只有对x的某段区间中的PDF积分得到的数值才有概率的含义。CDF是概率的意思,点x上CDF的值表示该随机变量可能取值小于x的概率的大小。如图是正态分布的PDF和CDF(四)多元分布在这个课程里面,我不将多维的随机变量拆分成多个一维的随机变量来表述,而是将各个维度组合成一个随机变量向量。多元随机变量分布需要掌握联合分布、边缘分布和条件分布。联合分布和单变量PDF类似,如果将其对随机变量某个取值范围做积分就可以得到随机变量最终取值落在该区间内的概率。边缘分布是只考虑多维随机变量中的某一维,其他维度不考虑情况下的PDF条件分布是固定随机变量在其他维度的取值,再考虑剩余那个维度上的PDF。如图是一个二维正态分布(两个维度间相关系数为0.3)的示意图。两个小图分别是第一和第二维度的边缘分布PDF图(都是标准正态分布PDF)。右上角的大图是依据此二维正态联合分布生成的随机数。从随机数的疏密程度可以看出联合分布PDF函数在该区域的大小。研究这些分布不是我们的目的,只是达到目的的手段。我们所需要做的事情是生成符合各种分布的随机数。由分布的不同类型连续型和离散型,常规型(Matlab中有内置函数)和特殊型(Matlab中无内置函数),一维分布和多维分布我们接下来就各种情况分别讲述如何在Matlab中生成各种各样的随机数。十六、一维随机数两个注意事项:1生成随机数有两种选择,可以每次只生成一个随机数,直接用此数计算f(x),然后循环重复此过程,最后求平均值;另一种方法是每次生成全部循环所需的随机数,利用Matlab矩阵运算语法计算f(x),不需要写循环,直接即可求平均值。前一种方法代码简单,但速度慢;后一种方法代码相对更难写。此处一定要掌握如何生成随机数组成的向量和矩阵(单个随机数就是一个1*1的矩阵),在后面章节的例子里面一般会有两个版本的代码分别讲述这两种生成方法。2生成了一维的随机数后,可以用hist()函数查看这些数服从的大致分布情况。(一)Matlab内部函数a. 基本随机数Matlab中有两个最基本生成随机数的函数。1rand()生成(0,1)区间上均匀分布的随机变量。基本语法:rand(M,N,P .)生成排列成M*N*P. 多维向量的随机数。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:rand(5,1) %生成5个随机数排列的列向量,一般用这种格式rand(5) %生成5行5列的随机数矩阵rand(5,4) %生成一个5行4列的随机数矩阵生成的随机数大致的分布。x=rand(100000,1);hist(x,30);由此可以看到生成的随机数很符合均匀分布。(视频教程会略提及hist()函数的作用)2randn()生成服从标准正态分布(均值为0,方差为1)的随机数。基本语法和rand()类似。randn(M,N,P .)生成排列成M*N*P. 多维向量的随机数。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:randn(5,1) %生成5个随机数排列的列向量,一般用这种格式randn(5) %生成5行5列的随机数矩阵randn(5,4) %生成一个5行4列的随机数矩阵生成的随机数大致的分布。x=randn(100000,1);hist(x,50);由图可以看到生成的随机数很符合标准正态分布。b. 连续型分布随机数如果你安装了统计工具箱(Statistic Toolbox),除了这两种基本分布外,还可以用Matlab内部函数生成符合下面这些分布的随机数。3unifrnd()和rand()类似,这个函数生成某个区间内均匀分布的随机数。基本语法unifrnd(a,b,M,N,P,.)生成的随机数区间在(a,b)内,排列成M*N*P. 多维向量。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:unifrnd(-2,3,5,1) %生成5个随机数排列的列向量,一般用这种格式unifrnd(-2,3,5) %生成5行5列的随机数矩阵unifrnd(-2,3,5,4) %生成一个5行4列的随机数矩阵%注:上述语句生成的随机数都在(-2,3)区间内.生成的随机数大致的分布。x=unifrnd(-2,3,100000,1);hist(x,50);由图可以看到生成的随机数很符合区间(-2,3)上面的均匀分布。4normrnd()和randn()类似,此函数生成指定均值、标准差的正态分布的随机数。基本语法normrnd(mu,sigma,M,N,P,.)生成的随机数服从均值为mu,标准差为sigma(注意标准差是正数)正态分布,这些随机数排列成M*N*P. 多维向量。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:normrnd(2,3,5,1) %生成5个随机数排列的列向量,一般用这种格式normrnd(2,3,5) %生成5行5列的随机数矩阵normrnd(2,3,5,4) %生成一个5行4列的随机数矩阵%注:上述语句生成的随机数所服从的正态分布都是均值为2,标准差为3.生成的随机数大致的分布。x=normrnd(2,3,100000,1);hist(x,50);如图,上半部分是由上一行语句生成的均值为2,标准差为3的10万个随机数的大致分布,下半部分是用小节“randn()”中最后那段语句生成10万个标准正态分布随机数的大致分布。注意到上半个图像的对称轴向正方向偏移(准确说移动到x=2处),这是由于均值为2的结果。而且,由于标准差是3,比标准正态分布的标准差(1)要高,所以上半部分图形更胖(注意x轴刻度的不同)。5chi2rnd()此函数生成服从卡方(Chi-square)分布的随机数。卡方分布只有一个参数:自由度v。基本语法chi2rnd(v,M,N,P,.)生成的随机数服从自由度为v的卡方分布,这些随机数排列成M*N*P. 多维向量。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:chi2rnd(5,5,1) %生成5个随机数排列的列向量,一般用这种格式chi2rnd(5,5) %生成5行5列的随机数矩阵chi2rnd(5,5,4) %生成一个5行4列的随机数矩阵%注:上述语句生成的随机数所服从的卡方分布的自由度都是5生成的随机数大致的分布。x=chi2rnd(5,100000,1);hist(x,50);6frnd()此函数生成服从F分布的随机数。F分布有2个参数:v1, v2。基本语法frnd(v1,v2,M,N,P,.)生成的随机数服从参数为(v1,v2)的卡方分布,这些随机数排列成M*N*P. 多维向量。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:frnd(3,5,5,1) %生成5个随机数排列的列向量,一般用这种格式frnd(3,5,5) %生成5行5列的随机数矩阵frnd(3,5,5,4) %生成一个5行4列的随机数矩阵%注:上述语句生成的随机数所服从的参数为(v1=3,v2=5)的F分布生成的随机数大致的分布。x=frnd(3,5,100000,1);hist(x,50);从结果可以看出来, F分布集中在x正半轴的左侧,但是它在极端值处也很可能有一些取值。7trnd()此函数生成服从t(Student's t Distribution,这里Student不是学生的意思,而是Cosset.W.S.的笔名)分布的随机数。t分布有1个参数:自由度v。基本语法trnd(v,M,N,P,.)生成的随机数服从参数为v的t分布,这些随机数排列成M*N*P. 多维向量。如果只写M,则生成M*M矩阵;如果参数为M,N可以省略掉方括号。一些例子:trnd(7,5,1) %生成5个随机数排列的列向量,一般用这种格式trnd(7,5) %生成5行5列的随机数矩阵trnd(7,5,4) %生成一个5行4列的随机数矩阵%注:上述语句生成的随机数所服从的参数为(v=7)的t分布生成的随机数大致的分布。x=trnd(7,100000,1);hist(x,50);可以发现t分布比标准正太分布要“瘦”,不过随着自由度v的增大,t分布会逐渐变胖,当自由度为正无穷时,它就变成标准正态分布了。接下来的分布相对没有这么常用,同时这些函数的语法和前面函数语法相同,所以写得就简略一些在视频中也不会讲述,你只需按照前面那几个分布的语法套用即可,应该不会有任何困难时间足够的话这是一个不错的练习机会。8betarnd()此函数生成服从Beta分布的随机数。Beta分布有两个参数分别是A和B。下图是A=2,B=5 的beta分布的PDF图形。生成beta分布随机数的语法是:betarnd(A,B,M,N,P,.)9exprnd()此函数生成服从指数分布的随机数。指数分布只有一个参数: mu, 下图是mu=3时指数分布的PDF图形生成指数分布随机数的语法是:betarnd(mu,M,N,P,.)10gamrnd()生成服从Gamma分布的随机数。Gamma分布有两个参数:A和B。下图是A=2,B=5 Gamma分布的PDF图形生成Gamma分布随机数的语法是:gamrnd(A,B,M,N,P,.)11lognrnd()生成服从对数正态分布的随机数。其有两个参数:mu和sigma,服从这个这样的随机数取对数后就服从均值为mu,标准差为sigma的正态分布。下图是mu=-1, sigma=1/1.2的对数正态分布的PDF图形。生成对数正态分布随机数的语法是:lognrnd(mu,sigma,M,N,P,.)12raylrnd()生成服从瑞利(Rayleigh)分布的随机数。其分布有1个参数:B。下图是B=2的瑞利分布的PDF图形。生成瑞利分布随机数的语法是:raylrnd(B,M,N,P,.)13wblrnd()生成服从威布尔(Weibull)分布的随机数。其分布有2个参数:scale 参数 A和shape 参数 B。下图是A=3,B=2的Weibull分布的PDF图形。生成Weibull分布随机数的语法是:wblrnd(A,B,M,N,P,.)还有非中心卡方分布(ncx2rnd),非中心F分布(ncfrnd