matlab模拟

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.1.1模拟技术

在许多数学方法中,一般都要用到解析论证和数值计算的技巧。但是,许多现实的系统是很复杂的,其中的随机性因素往往难以用数学公式表示出来,也就很难使用数学推导或数值计算机的手段来分析系统、预测系统的性能。因此,产生了对系统进行模拟的技术。

在使用计算机对系统进行模拟之前,一般要清楚模拟的一般步骤和方法。后面将从较小的模拟实例,对模拟技术进行简要的介绍。

模拟过程的一般过程为:

(1)分析问题,收集资料。需要搞清楚问题要达到的目标,根据问题的性质收集有关随机性因素的资料。这里用得较多的知识为概率统计方面。

在这个阶段,还应当估计一下待建立的模拟系统的规模和条件,说明

哪些是可以控制的变量,哪些是不可控制的变量。

(2)建立模拟模型,编制模拟程序。按照一般的建模方法,对问题进行适当的假设。也就是说,模拟模型未必要将被模拟系统的每个细节全部

考虑。模拟模型的优劣将通过与实际系统有关资料的比较来评价。如

果一个“粗糙”的模拟模型已经比较符合实际系统的情况,也就没有

必要建立费时、复杂的模型。当然,如果开始建立的模型比较简单,

与实际系统相差较大,那么可以在建立了简单模型后,逐步加入一些

原先没有考虑的因素,直到模型达到预定的要求为止。编写模拟程序

之前,要现画出程序框图或写出算法步骤。然后选择合适的计算机语

言,编写模拟程序。模拟实现的工具较多,如数学软件类:Matlab、

Mathematica、Maple、MathCAD等,还有其它的高级语言工具,如:

Visual C++、C++ Builder、Delphi、Borland C++3.1等。

(3)运行模拟程序,计算结果。为了减小模拟结果的随机性偏差,一般要多次运行模拟程序,还有就是增加模拟模型的时段次数。

(4)分析模拟结果,并检验。模拟结果一般说来反映的是统计特性,结果的合理性、有效性,都需要结合实际的系统来分析,检验。以便提出

合理的对策、方案。

以上步骤是一个反复的过程,在时间和步骤上是彼此交错的。比如模型的修改和改进,都需要重新编写和改动模拟程序。模拟结果的不合理,则要求检查模型,并修改模拟程序。

1.1.2模拟时间

利用计算机进行模拟时,有两种控制模拟时间的方法。一种是固定时间增量法,另一种是可变时间增量法,又叫面向事件法。

固定时间增量法,是选用一段合适的时间作单位,然后每隔一个单位时间就计算一次有关参数的值,到达预定的模拟时间后,模拟程序结束。在编写这种程序时,一般可以建立一个“模拟时钟”变量。程序的主体框架一般时个大的循环,循环变量,则为模拟时间;在每个循环体内,就是对每个时段作处理。例如,有些排队论模型,可能就是以每隔一段时间(一天或者一个月)进行处理。

采用可变时间增量法编写的模拟程序也有一个“模拟时钟”变量,但它是在一个事件发生时,“模拟时钟”才向前推进。需要注意的是,该模拟方法每一步

经过的时间是可变的,而且会自动寻找下一个最早使系统状态发生变化的事件。整个模拟直到“模拟时钟”到达指定的时间长度为止。可以参考有关离散系统仿真的内容。

1.1.3 模拟语言

运用计算机进行模拟,还要选用适当的程序设计的语言。当然,象C/C++、Pascal 、Fortran 这样的高级语言是可以用于模拟的实现,特别是在面向对象这样的程序设计思想的引入,使得采用这样的语言实现模拟要更方便些。但是,用这样的语言编写的程序一般都很长,而且编写复杂,调试费时。因此人们研究初了许多专门用于模拟的语言,如GPSS 、SIMULA 等。这里本书不讨论其他的模拟语言,而主要讲解如何使用Matlab 语言编写模拟程序。Matlab 不仅数值计算功能强大,而且由于其语言的简洁和高级,编写的代码少,而且容易调试,实现模拟模型很快。

1.1.4 随机数的模拟

计算机模拟主要用于模拟复杂过程或现象的一些方法。采用计算机模拟一个实验或一个过程,那么用不同的数据重复计算机模拟就能得出统计学结论。使用这种研究方法得到的结论可能在数学上不很精确,但其精确性对于我们了解所模拟的过程已经足够了。

考虑落在单位区间(0,1)中的一个实数序列。简单的说,如果这些数是杂乱地分布于整个区间中,且其排列次序似乎也无章法可循,那么这一序列就称为是随机地。

下列序列的数就不是随机的:

(1) 该序列的数是单调增加的或单调减小的;

(2) 后一个数是关于前一个数的连续函数,如)(1-=i i x f x ;

1.1.5 随机数的产生

大多数计算机系统都有随机数生成器,MATLAB 也有自己的随机数生成器,但是这些系统产生的随机数一般称为伪随机数,它们不是真正随机的。有许多产生随机数的算法,下面介绍一种算法还是比较令人满意的。

产生均匀分布于开区间(0,1)中的随机数 ,,21x x 。算法如下: 取一个整数0l ,使得121310-<

)12

,7mod(31

15

-=-i i l l

1

2

31

-=

i i l x

这里的i l 是范围在12131-<

1和21474836471231=-这个梅森(Mersenne)质数之间的任何一个整数都可取为种子。 下面就用Matlab 编写实现该算法的程序,函数名为mrand : function r=mrand global L

L=mod(16807*L,2147483647); r=L*4.6566128752459e-10; 调用说明:

如果要调用该函数mrand ,需要在程序中添加如下2条命令:

global L L=3

第一句:global L 声明变量L 为全局变量 第二句:给L 赋予初值

下面集中随机数也是常用的,都可以借助上面的函数mrand 实现。

fix:取整函数,向靠近0的方向取整

(1) 要产生在(a,b)上均匀分布的随机数x ,

则x=(b-a)*mrand+a

(2) 产生集合{0,1,2,…,n}中的随机数I ,则

I=fix((n+1)*mrand)

(3) 产生从j 到k(j ≤k)的随机整数X ,则

X=fix((k-j+1)*mrand)+j

注意:一般说来直接采用Matlab 中的rand 就可以产生(0,1)之间均匀分布的随机数。

下面通过自定义的Matlab 函数用于模拟随机变量,当然也可以改写为非函数实现。

1.1.6 模拟均匀分布随机变量的函数

function r=rnd_u(a,b) %产生在[a,b]间均匀分布的随机数 r=a+(b-a)*rand; return

1.1.7 模拟指数分布随机变量的函数

function r=rnd_beta(lamada) %模拟指数分布