matlab随机模拟
matlab模拟

1.1.1模拟技术在许多数学方法中,一般都要用到解析论证和数值计算的技巧。
但是,许多现实的系统是很复杂的,其中的随机性因素往往难以用数学公式表示出来,也就很难使用数学推导或数值计算机的手段来分析系统、预测系统的性能。
因此,产生了对系统进行模拟的技术。
在使用计算机对系统进行模拟之前,一般要清楚模拟的一般步骤和方法。
后面将从较小的模拟实例,对模拟技术进行简要的介绍。
模拟过程的一般过程为:(1)分析问题,收集资料。
需要搞清楚问题要达到的目标,根据问题的性质收集有关随机性因素的资料。
这里用得较多的知识为概率统计方面。
在这个阶段,还应当估计一下待建立的模拟系统的规模和条件,说明哪些是可以控制的变量,哪些是不可控制的变量。
(2)建立模拟模型,编制模拟程序。
按照一般的建模方法,对问题进行适当的假设。
也就是说,模拟模型未必要将被模拟系统的每个细节全部考虑。
模拟模型的优劣将通过与实际系统有关资料的比较来评价。
如果一个“粗糙”的模拟模型已经比较符合实际系统的情况,也就没有必要建立费时、复杂的模型。
当然,如果开始建立的模型比较简单,与实际系统相差较大,那么可以在建立了简单模型后,逐步加入一些原先没有考虑的因素,直到模型达到预定的要求为止。
编写模拟程序之前,要现画出程序框图或写出算法步骤。
然后选择合适的计算机语言,编写模拟程序。
模拟实现的工具较多,如数学软件类:Matlab、Mathematica、Maple、MathCAD等,还有其它的高级语言工具,如:Visual C++、C++ Builder、Delphi、Borland C++3.1等。
(3)运行模拟程序,计算结果。
为了减小模拟结果的随机性偏差,一般要多次运行模拟程序,还有就是增加模拟模型的时段次数。
(4)分析模拟结果,并检验。
模拟结果一般说来反映的是统计特性,结果的合理性、有效性,都需要结合实际的系统来分析,检验。
以便提出合理的对策、方案。
以上步骤是一个反复的过程,在时间和步骤上是彼此交错的。
随机微分方程matlab程序

在MATLAB 中,我们可以使用内置的函数和工具箱来模拟和解决随机微分方程(SDEs)。
以下是使用MATLAB 模拟Ornstein-Uhlenbeck 过程(一种类型的随机微分方程)的示例代码:
matlab复制代码
% 参数设置
T = 1; % 时间终点
dt = 0.01; % 时间步长
N = round(T/dt); % 时间步数
% 初始化 Ornstein-Uhlenbeck 过程
x = zeros(1, N);
w = randn(1, N); % 白噪声
% 模拟 Ornstein-Uhlenbeck 过程
for i = 1:N-1
x(i+1) = x(i) + dt*(-x(i) + w(i));
end
% 使用内置函数 plot 绘制结果
figure;
plot(0:dt:T, x);
title('Ornstein-Uhlenbeck Process');
xlabel('Time');
ylabel('X(t)'););
这个代码段使用Euler-Maruyama 方法来数值模拟Ornstein-Uhlenbeck 过程。
请注意,这只是解决随机微分方程的一种方法,而且在实际应用中,可能需要选择不同的方法以适应特定的问题。
另外,上述代码只是一种基本的实现,你可能需要调整和扩展它以满足你的具体需求。
matlab中生成a到b的随机数

matlab中生成a到b的随机数在MATLAB中生成从a到b的随机数非常简单。
MATLAB有一个内置的函数随机数生成器,名为"rand",该函数可以生成一个介于0和1之间的随机数。
通过简单的数学运算,我们可以将这个随机数转换为我们所需的范围内的随机数。
接下来,我将一步一步地解释如何使用MATLAB生成从a到b的随机数,并提供一些示例代码来帮助理解。
第一步是确定所需的随机数范围。
假设我们想要生成从a到b的随机数,其中a和b是两个特定的数字。
确保a小于b,这样我们才能得到一个有效的范围。
第二步是使用MATLAB的"rand"函数生成介于0和1之间的随机数。
这个函数没有参数,所以我们只需简单地调用它即可。
以下是生成一个介于0和1之间的随机数的示例代码:MATLABrandom_number = rand;第三步是将生成的随机数缩放到我们所需的范围内。
我们可以使用以下公式将0到1之间的随机数转换为从a到b之间的随机数:MATLABscaled_number = a + (b - a) * random_number;在这个公式中,"(b - a)"表示所需范围的大小,"random_number"是0到1之间的随机数,乘以所需范围的大小会将其缩放为合适的范围,并加上a,最终得到从a到b之间的随机数。
现在,让我们通过一个示例代码来演示如何生成从3到7之间的随机数:MATLABa = 3;b = 7;random_number = rand;scaled_number = a + (b - a) * random_number;disp(scaled_number);运行这段代码会产生一个介于3和7之间的随机数。
每次运行时,结果都会不同。
现在,我们已经学会了如何生成从a到b的随机数。
让我们进一步扩展这个概念,生成一个包含多个随机数的矩阵。
Matlab中的随机数生成方法

Matlab中的随机数生成方法随机数在计算机科学中扮演着重要的角色,它们被广泛应用于模拟、统计分析和算法设计等领域。
Matlab作为一种强大的数值计算工具,也提供了多种随机数生成方法。
本文将深入探讨Matlab中的随机数生成方法,并介绍其特点和使用场景。
1. 基本的随机数生成函数Matlab提供了基本的随机数生成函数,如rand、randn和randi等。
其中,rand 函数生成0到1之间的均匀分布随机数,randn函数生成符合标准正态分布的随机数,而randi函数则用于生成整数随机数。
这些函数具有简单易用的特点,适用于一般的随机数生成需求。
2. 自定义随机数生成器除了基本的随机数生成函数,Matlab还允许用户自定义随机数生成器。
用户可以通过设定随机数生成器的种子(seed)和算法来实现特定的随机数分布。
例如,可以使用randstream函数创建一个自定义的随机数流,并通过reset函数设置种子,以确保每次运行获得相同的随机数序列。
这使得Matlab的随机数生成更具可控性和重复性。
3. 高级随机数生成方法除了基本的随机数生成函数和自定义随机数生成器,Matlab还提供了一些高级的随机数生成方法。
这些方法包括蒙特卡洛方法、随机游走和马尔可夫链等。
蒙特卡洛方法是一种基于随机采样和统计模型的数值计算方法,常用于模拟、优化和概率分析等领域。
Matlab中的随机游走函数可以模拟随机漫步的过程,用于研究股票市场、物理传输和随机搜索等问题。
马尔可夫链是一种随机过程,具有记忆性和状态转移的特点,Matlab提供了马尔可夫链模拟函数,可用于模拟信道传输、语音识别和图像处理等应用。
4. 随机数的应用场景随机数在科学研究和工程实践中有着广泛的应用场景。
在模拟领域,随机数常用于生成真实世界的随机样本,用于测试和验证模型。
在统计分析中,随机数可用于生成随机样本和蒙特卡洛模拟,用于估计参数和检验假设。
在算法设计中,随机数常用于生成随机初始值、打破平衡和优化搜索空间等。
用 MATLAB 模拟掷硬币过程

用MATLAB模拟掷硬币过程我们掷一枚硬币,它出现的情况只可能是要么出现正面,要么出现反面,这一随机事件的样本点有限且等可能。
所以掷硬币这一随机事件为古典概型,它出现的样本点是有限的且等可能。
为了模拟掷硬币出现正面或者反面,规定随机数小于0.5时为反面,否则为正面。
在MATLAB中提供了一个在[0,1]区间上均匀分布的随机函数rand()。
可用round()函数将其变成0—1阵,然后将整个矩阵的各元素值加起来再除以总的元素个数即为出现正面的概率。
一、连续掷100次硬币,运行1000次,程序如下:for i=1:100a(i)=sum(sum(round(rand(1000))))/100end以下值是截取部分运行结果,发现正面出现的概率总是在0.5左右浮动。
a =Columns 1 through 60.5080 0.4935 0.5059 0.5035 0.5040 0.4969Columns 7 through 120.4945 0.5010 0.4875 0.4948 0.5042 0.5022Columns 13 through 180.4894 0.4965 0.4977 0.4969 0.5008 0.5154Columns 19 through 240.5013 0.5022 0.4969 0.5006 0.4980 0.4949Columns 25 through 300.4878 0.4994 0.4964 0.4944 0.4995 0.4950Columns 31 through 360.5066 0.4989 0.4940 0.4988 0.4939 0.4909Columns 37 through 420.4977 0.5025 0.4927 0.4977 0.4904 0.5040Columns 43 through 480.5080 0.4935 0.5059 0.5035 0.5040 0.4969Columns 49 through 540.5029 0.4977 0.5024 0.4956 0.4857 0.5035Columns 55 through 600.5006 0.5116 0.5035 0.4953 0.4974 0.5012Columns 61 through 660.4997 0.5039 0.5009 0.5012 0.5037 0.5021Columns 67 through 720.4952 0.4959 0.5035 0.4921 0.5061 0.4969 Columns 73 through 780.4998 0.4978 0.5084 0.5059 0.5069 0.4978 Columns 79 through 840.5105 0.4888 0.5007 0.4994 0.5024 0.4951 Columns 85 through 900.5012 0.4989 0.5017 0.4980 0.4893 0.5078 Columns 91 through 960.5013 0.5022 0.4969 0.5006 0.4980 0.4949 Columns 97 through 1000.4926 0.5038 0.4885 0.5069=二、连续掷200次硬币,运行1000次,程序如下:for i=1:100a(i)=sum(sum(round(rand(1000))))/200end以下是截取部分结果,发现正面出现的概率依然在0.5附近浮动。
matlab中随机函数

matlab中随机函数Matlab中随机函数Matlab中的随机函数是一种非常有用的工具,它可以帮助我们生成随机数、随机矩阵、随机向量等。
在Matlab中,有多种不同的随机函数可供使用,包括rand、randn、randi等。
下面我们将详细介绍这些函数的用法和特点。
1. rand函数rand函数是Matlab中最常用的随机函数之一,它可以生成一个0到1之间的随机数。
使用方法如下:rand() % 生成一个0到1之间的随机数rand(3) % 生成一个3x3的随机矩阵rand(2,3) % 生成一个2x3的随机矩阵rand(1,5) % 生成一个1x5的随机向量2. randn函数randn函数是Matlab中另一个常用的随机函数,它可以生成一个符合正态分布的随机数。
使用方法如下:randn() % 生成一个符合正态分布的随机数randn(3) % 生成一个3x3的符合正态分布的随机矩阵randn(2,3) % 生成一个2x3的符合正态分布的随机矩阵randn(1,5) % 生成一个1x5的符合正态分布的随机向量3. randi函数randi函数可以生成一个指定范围内的随机整数。
使用方法如下:randi(10) % 生成一个1到10之间的随机整数randi([1,10],3) % 生成一个3x3的1到10之间的随机整数矩阵randi([1,10],2,3) % 生成一个2x3的1到10之间的随机整数矩阵randi([1,10],1,5) % 生成一个1x5的1到10之间的随机整数向量除了上述三种常用的随机函数外,Matlab中还有其他一些随机函数,如:- randperm函数:生成一个随机排列的向量- randstream函数:生成一个随机数流- randseed函数:设置随机数种子总之,Matlab中的随机函数非常强大,可以帮助我们快速生成各种随机数、随机矩阵和随机向量,为我们的科学计算和数据分析提供了很大的便利。
matlab的随机矩阵

matlab的随机矩阵MATLAB是一种强大的数值计算和数据可视化工具,在科学和工程领域非常受欢迎。
它具有丰富的数学函数库和图形处理功能,可以进行复杂的数值计算、数据分析和建模,帮助用户快速解决各种问题。
在MATLAB中,我们可以使用随机矩阵来模拟各种现实世界中的随机现象,并对其进行分析和处理。
随机矩阵是由随机数填充的矩阵,每个随机数都是独立和均匀分布的。
具体地说,MATLAB提供了几种生成随机矩阵的函数,如rand、randi和randn等。
这些函数可以生成具有指定大小和分布的随机矩阵。
下面我们来详细介绍一些常用的生成随机矩阵的函数和其应用。
1. rand函数rand函数可以生成一个具有在[0, 1)范围内均匀分布的随机数的矩阵。
它的基本语法如下:A = rand(m, n)其中,m和n分别表示生成的随机矩阵的行数和列数。
例如,我们可以生成一个3×3的随机矩阵:A = rand(3, 3)运行上述代码后,MATLAB会生成一个3×3的随机矩阵A,其元素是0到1之间的随机数。
rand函数在科学实验、模拟和概率分析等领域中经常使用。
例如,在蒙特卡洛方法中,我们可以使用rand函数生成大量的随机数来模拟真实环境中的不确定性,并用于统计估计和优化问题。
此外,rand函数还可以用于生成随机图像、随机噪声等。
2. randi函数randi函数可以生成一个具有特定范围和分布的随机整数矩阵。
它的基本语法如下:A = randi([min, max], m, n)其中,min和max表示生成随机整数的范围,m和n表示生成的随机矩阵的行数和列数。
例如,我们可以生成一个3×3的随机整数矩阵,范围为1到10:A = randi([1, 10], 3, 3)运行上述代码后,MATLAB会生成一个3×3的随机整数矩阵A,其元素是1到10之间的随机整数。
randi函数在密码学、模拟实验和随机算法等领域中经常使用。
使用Matlab对布朗运动的模拟

使用Matlab对布朗运动的模拟布朗运动是指在流体中微小颗粒受到流体分子的碰撞而产生的不规则运动。
这种运动的规律性和性质是由意大利生物学家、显微镜发明者安东尼奥·布朗于1827年发现的,后来被爱因斯坦引用并解释为分子动力学的现象。
布朗运动在科学研究中有着重要的应用,比如在纳米技术、生物医学等领域,对其进行模拟和研究可以帮助人们更好地理解和利用这一现象。
而现在,随着计算机科学和数学的发展,我们可以利用现代建模工具如Matlab来对布朗运动进行模拟和分析。
在本文中,我们将介绍如何使用Matlab对布朗运动进行模拟,并对模拟结果进行分析,以便更好地理解和应用布朗运动的规律。
我们需要了解布朗运动的基本特征:布朗粒子在流体中的不规则运动是由于流体分子无序碰撞使其产生的。
这种运动的主要特点是运动轨迹不规则,随机性强,且总体呈现出一种偏移的趋势。
在Matlab中,我们可以通过编写一些简单的代码来模拟这种运动的特征。
我们需要定义一个粒子的初始位置和速度,然后通过随机数生成的方式来模拟流体分子对粒子的碰撞力,最后将这些力作用在粒子上,从而模拟粒子的运动轨迹。
以下是一个简单的Matlab代码示例:```matlab% 定义模拟参数timesteps = 1000; % 模拟时间步数dt = 0.01; % 时间步长D = 1; % 扩散系数% 初始化粒子位置和速度x = 0;y = 0;vx = 0;vy = 0;% 模拟布朗运动for t = 1:timesteps% 生成随机碰撞力Fx = sqrt(2 * D * dt) * randn();Fy = sqrt(2 * D * dt) * randn();% 计算速度变化vx = vx + Fx;vy = vy + Fy;% 更新位置x = x + vx * dt;y = y + vy * dt;% 绘制粒子运动轨迹plot(x, y, 'ro');hold on;end```在这段代码中,我们使用了随机数生成函数randn()来模拟流体分子对粒子的碰撞力,然后根据扩散系数D和时间步长dt来更新粒子的速度和位置。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
MATLAB中的计算机模拟第一节 导言计算机科学技术的迅猛发展,给许多学科带来了巨大的影响.计算机不但使问题的求解变得更加方便、快捷和精确,而且使得解决实际问题的领域更加广泛.计算机适合于解决那些规模大、难以解析化以及不确定的数学模型.例如对于一些带随机因素的复杂系统,用分析方法建模常常需要作许多简化假设,与面临的实际问题可能相差甚远,以致解答根本无法应用,这时模拟几乎成为人们的唯一选择.在历届的美国和中国大学生的数学建模竞赛(MCM)中,学生们经常用到计算机模拟方法去求解、检验等.计算机模拟(computer simulation)是建模过程中较为重要的一类方法.本章将讨论如何利用计算机技术对连续系统和离散系统进行模拟.由于计算机以重复性运算见长,故它为研究模拟方法提供了极为合适的手段.计算机模拟是一种广义的数值计算方法.通过本章的学习,你将会了解蒙特卡洛方法的思想;初步掌握对连续系统或离散系统进行模拟的方法;掌握由实际问题怎样去建立计算机模拟模型以及应用MATLAB编程语言进行计算.第二节引例第三节 随机变量的抽样第四节 连续系统的模拟第五节 离散系统的模拟第六节 范例第七节 实验第二节 引例:葡丰投针问题在用传统方法难以解决的问题中,有很大一部分可以用概率模型进行描述.由于这类模型含有不确定的随机因素,分析起来通常比确定性的模型困难.有的模型难以作定量分析,得不到解析的结果,或者是虽有解析结果,但计算代价太大以至不能使用.在这种情况下,可以考虑采用Monte Carlo 方法。
下面通过例子简单介绍Monte Carlo 方法的基本思想.Monte Carlo 方法是计算机模拟的基础,它的名字来源于世界著名的赌城——摩纳哥的蒙特卡洛,其历史起源于1777年法国科学家蒲丰提出的一种计算圆周 π的方法——随机投针法,即著名的蒲丰投针问题。
1)Monte Carlo 方法的基本思想是首先建立一个概率模型,使所求问题的解正好是该模型的参数或其他有关的特征量.然后通过模拟一统计试验,即多次随机抽样试验(确定m 和n ),统计出某事件发生的百分比.只要试验次数很大,该百分比便近似于事件发生的概率.这实际上就是概率的统计定义.利用建立的概率模型,求出要估计的参数.蒙特卡洛方法属于试验数学的一个分支.MATLAB 语言编程实现 l=1; n=1000;d=2; m=0; for k =l :nx =unifrnd (0,d /2); p =unifrnd (0,pi );if )sin(15.0y x ××< m=m +1 elsc end end p=m/npi_m=1/p 运行,即得结果.蒙特卡洛方法适用范围很广泛,它既能求解确定性的问题,也能求解随机性的问题以及科学研究中的理论问题.例如利用蒙特卡洛方法可以近似地计算定积分,即产生数值积分问题.任意曲边梯形面积的近似计算一个古老的问题:用一堆石头测量一个水塘的面积.应该怎样做呢?测量方法如下:假定水塘位于一块面积已知的矩形农田之中.如图8.2所示.随机地向这块农田扔石头使得它们都落在农田内.被扔到农田中的石头可能溅上了水,也可能没有溅上水,估计被“溅上水的”石头量占总的石头量的百分比.试想如何利用这估计的百分比去近似计算该水塘面积?结合图8.2中的图形(1)分析,只要已知各种参数及函数(a ,b ,H ,f(x)),有以下两种方法可近似计算水塘面积.1.随机投点法1)赋初值:试验次数n=0,成功次数m=0;规定投点试验的总次数N ;2)随机选择m 个数对,1,,m i y x i i <<,其中H y b x a i i <<<<0,,置 n =n +l ; 3)判断,若是,转4,否则停止计算;N n ≤ 4)判断条件(表示一块溅水的石头)是否成立,若成立则置m=m+1,转2,否则转2;)(i i x f y < 5)计算水塘面积的近似值N m a b H S /)(×−×=.2.平均值估计法1)产生[a,b]区间的均匀随机数;,,2,1,N i x i "= 2) 计算;,,2,1),(N i x f i "= 3)计算∑=−=Ni i x f N a b S 1)()(。
该方法的特点是估计函数f(x)在[a,b]上的平均值,面积近似等于该平均值乘以(b-a).第三节 随机变量的抽样根据随机变量遵循的分布规律使用一种方法获取它的具体值,叫做抽样(sampling).随机变量的抽样方法很多,不同的分布采用的方法不尽相同。
区间[0,1]上均匀分布的随机变量的抽样是其中最基本的方法.在计算机上,其他各种分布的随机抽样方法都是在它的基础上产生的.计算机上产生的随机数是按照确定的算法产生的,它遵循一定的规律,显然不是真正随机的,因此这种随机数我们叫做伪随机数(random number).只要伪随机数能通过一系列的统计检验,就可以把它们当作真正的随机数放心地使用,而不会引起太大的误差. 产生均匀分布的伪随机数的常用方法有平方取中法、线性同余法和广义同余法等.由于目前计算机上常用的高级语言(如C,Pascal,Fortran 等)都有产生均匀分布随机数的系统函数,我们可以直接使用而不必关心其实现原理,在此不作专门介绍.首先介绍MATLAB 软件中产生区间[0,1]上的均匀分布随机数的系统函数R=rand(n),它产生n n ×阶均匀随机矩阵.一般R=rand(m,n),产生阶均匀随机矩阵.n m × 下面简单介绍由均匀随机数以及某种算法产生其他分布随机数的方法.用表示独立同分布于U[0,1]的随机数列. ",,21r r 直接抽样法设连续的随机变量X 有分布函数 ∫∞−=xdt t f x F )()(其中f (t )是X 的密度函数。
因为0<F(x)<1,令r=F(x),若函数F(x)的反函数存在,对么对随机变量X 的抽样可由公式产生出. )(1r F x −= 例子近似抽样法近似抽样方法的步骤是设一组独立同分布的随机变量利用中心极限定理"",,,,21n r r r时当∞→−∑=n N nDr Er r n i ni i i ),1,0(~/11设为[0,1]区间上的均匀随机数列,则",,21r r 12/1,2/1==i i Dr Er ,从而有,当n 充分大时,)1,0(~1212111N nr n n i i ∑=−常用的是n =12的情形,,其中是标准正态 分布的随机数,即由12个区间[0,1]上均匀随机数产生一个标准正态随机数.如果还要产生一般正态分布的随机数,则只需用变换∑∑=−=−=−=61122121126i i i i ir r ru 12u ασ+=u z .另外,还有一种利用二维正态变换产生的标准正态分布的随机数,其变换如下:时当02sin ln 22cos ln 212121≠⎪⎩⎪⎨⎧−=−=r r r y r r x ππMATLAB 中各种分布下产生随机数的命令常见的分布函数 MATLAB 语句 均匀分布U[0,1] R=rand(m,n)均匀分布U[a,b] R=unifrnd(a,b,m,n) 指数分布)(λE n)m,,exprnd(R λ= 正态分布N(mu,sigma) R=normrnd(mu,sigma,m,n) 二项分布B(n,p) R=binornd(n,p,m,n1) 了松分布)(λP n)m,,poissrnd(R λ= 以上语句均产生 的矩阵. n m ×系统模拟是在整个运行过程中对系统的仿真,是非常有效的和广泛使用的分析、研究复杂系统的技术.在一定假设条件下,利用数学运算模拟系统的运行,称为数学模拟.现代的数学模拟都是在计算机上进行的,因此也称为计算机模拟,简称模拟(simulation)模拟分为静态模拟(static simulation)和动态模拟(dynamic simulation).数值积分中的蒙特卡洛方法是典型的静态模拟.动态模拟又分为连续系统模拟和离散系统模拟.状态随着时间连续变化的系统,称为连续系统(continuous system).对连续系统的计算机模拟是近似地获取系统状态在一些离散时刻点上的数值.在一定假设条件下,利用数学运算模拟系统的运行过程.连续系统模型一般是微分方程,它在数值模拟中最基本的算法是数值积分算法.例如有一系统可用微分方程来描述),(y t f dtdy=已知输出量y 的初始条件,现在要求出输出量y 随时间变化的过程。
最直观的想法是:首先将时间离散化,令00)(y t y =)(t y k k k t t h −=+1,称为第k 步的计算步距(一般是等间距的),然后按以下算法计算状态变量在各时刻上的近似值)(t y 1+k t ),)(,()(111k k k k k k k t t y t f y y t y −+=≈+++其中初始点按照这种作法即可求出整个的曲线.这种最简单的数值积分算法称为欧拉法.除此之外,还有其他一些算法.",2,1),,(00=k y t )(t y 因此,连续系统模拟方法是:首先确定系统的连续状态变量,然后将它在时间上进行离散化处理,并由此模拟系统的运行状态.离散系统(discrete system)是指系统状态只在有限的时间点或可数的时间点上有随机事件驱动的系统.例如排队系统(queue system ),显然状态量的变化只是在离散的随机时间点上发生.假设离散系统状态的变化是在一个时间点上瞬间完成的.为了模拟离散系统,必须设置一个模拟时钟(simulate clock),它能将时间从一个时刻向另一个时刻进行推进,并且能随时反映系统时间的当前值.其中,模拟时间推进方式有两种,下次事件推进法和均匀间隔时间推进法.常用的是下次事件推进法.其过程是:置模拟时钟的初值为0,跳到第一个事件发生的时刻,计算系统的状态,产生未来事件并加入到队列中去,跳到下一事件,计算系统状态,……,重复这一过程直到满足某个终止条件为止.为了学习离散系统的模拟方法,举一个最简单的例子,以便帮助理解. 单服务排队系统通常顾客到达时刻、顾客服务完毕并离去时刻等均视为随机事件(瞬间完成)。
系统关心的指标通常是:顾客的平均等候时间、服务效率等.定义程序事件为模拟运行到150个时间单位(分钟)结束.该系统的模型一般用流程框图来描述,然后编制程序,模拟在一定时间范围内系统运行的活动过程.请看下列简图所表示的时间推进方式:引入以下符号:一第i 个顾客到达的时刻;i x i t 一相邻两个顾客到达的时间间隔)(1i i i x x t −=+ 一第i 个顾客接受服务的时间; i s 一第i 个顾客的排队等待时间;i D 一第 i 个顾客接受服务后离开的时刻i c )(i i i i D s x c ++=;在任意时刻t ,系统的状态可以用排队等候的顾客数目和服务员是否在工作来描述.排队等候的顾客数目称为队长,记作L(t),为非负整数.服务员的状态用S (t )表示,当服务员工作时,令S(t)=1;服务员空闲时,令S(t)=0系统的性能指标通常用排队长度、等待时间和服务利用率等来衡量.由于它们随时间改变,一般用一段时间内的平均值作为数量指标.有以下三个指标:1)平均队长 指队长L(t)在[0,T]内的平均值,计算公式为∫=Tdt t L TL 0)(12)顾客的平均等待时间 指每个顾客平均等待的时间长度,记作W .3) 服务利用率 指服务员工作时间在T 中的比例,∫=Tdt t S TU 0)(1为了简化问题,假设在上述模型下,系统的性能指标只有一个,即顾客的平均等待时间.考虑用模拟方法来求W ,若系统能模拟出每位顾客的等待时间序列,则},,,{21n D D D "∑==ni i D n W 11具体模拟步骤如下;第1步 调查并收集和处理数据,记录顾客到达时刻、等待时间和服务时间.假定顾客到达的间隔时间服从指数分布(均值为10分钟);每个顾客的服务时间服从均匀分布U[10,15]第2步 构造模拟模型.输人因素:顾客的到达间隔时间和服务时间;排队规则:先到先服务;一个服务机构.第3步 模拟实验.设置模拟时钟及总的运行时间T ,如8小时等.推进原则按下次事件推进或均匀间隔推进.用MATLAB 编制的程序 x=0;D=zeros(1,n);t=exprnd(10,1,n); %产生指数分布(0,1)的随机数,数组大小 n×1 s=unifrmd (10,15,1,n ); %产生均匀分布U[10,15]的辩,数组大小n ×1 x=x+t(1) %第一位顾客的到达时刻 for i =2:ny=x+t(i) %第2-n 位顾客的到达时刻 j=i 一l ;c=x +s(j) +D (j ) %计算顾客离开时刻if c <y %比较相邻两顾客的离开、到达时刻的大小 h =0; elseh =c-y ; endD(i)=h ; %输出第i 个顾客的等待时间 x=y ; endE(D)=mean(D) %计算数值的平均值 计算的一组结果如下表8.1近似的平均等待时间:E (D )=5.5l 67(分钟)另一段更简洁的程序function meantime=serve(n) arrive=zeros(1,0) for i=2:narrive(i)=arrive(i-1)+exprnd(0.1); endwait=zeros(1,n) for i=1:n if (i= =1)wait(i)=0;elseservetime=unifrnd(10,15);if(arrive(i-1)+servetime+wait(i-1)>arrive(i))wait(i)=arrive(i-1)+servetime+wait(i-1)-arrive(i); elsewait(i)=0;endendendmeantime=mean(wait);第六节 范例追逐问题1.问题提出在图8.4中,假设正方形ABCD 的四个顶点处各站一人.在某一时刻,四人同时以匀速v 沿顺时针方向追逐下一个人,并且在任意时刻他们始终保持追逐的方向是对准追逐目标,例如,A 追逐B ,任意时刻A 始终向着B 追.可以证明四人的运动轨迹将按螺旋曲线状汇合于中心O .怎样证明呢?有两种证明方法.一是分别求出四人的运动轨迹曲线解析式,求证四条曲线在某时刻相交于一点.另一方法则是用计算机模拟将四人的运动轨迹直观地表示在图形上.2.建立模型及模拟方法 模拟步骤:1)建立平面直角坐标系.2)以时间间隔t ∆进行采样,在每一时t 计算每个人在下一时t+t ∆时的坐标. 3)不妨设甲的追逐对象是乙,在时间t 时,甲的坐标为,乙的坐 ),(i i y x 标为),(22y x .甲在t+t∆时的坐标为),sin ,cos (11θθt v y t v x ∆+∆+其中2122121212)()(,sin ,cos y y x x d dy y d x x −+−=−=−=θθ 同理,乙在t+t ∆时的坐标为)sin ,cos (22θθt v y t v x ∆+∆+. 4)选取足够小的,模拟到t ∆t v d ∆<时为止.5)连接四人在各时刻的位置,就得到所求的轨迹.连续系统模拟的特点是首先选定一个时间步长(通常是等间距的);其次按时间顺序推进,每推进一个时间步长,就对系统的活动和状态按预定的规则和目的进行考察。