OMSCS-SIM课程笔记03-Hand and Spreadsheet Simulations

这个系列是Gatech OMSCS 仿真和建模课程(ISYE 6644: Simulation and Modeling for Engineering and Science)的同步课程笔记。课程内容涉及计算机模拟在统计分析和建模中的应用,本节介绍随机模拟的基本方法。

Stepping Through a Differential Equation

在正式介绍随机模拟前我们首先来看一下如何通过模拟的方法来求解微分方程。假设我们已知函数f(x)的导数f(x),利用导数的定义我们可以使用差分进行近似:

f(x)f(x+h)f(x)h

整理后可以得到迭代形式:

f(x+h)f(x)+hf(x)

这种求解微分方程的方法称为Euler方法(Euler’s method)。对于给定的边界条件,我们可以利用Euler方法进行迭代来获得f(x)的表格。当步长h比较小而且在边界附近时Euler方法有比较好的近似结果。

Monte Carlo Integration

接下来我们考虑积分的情况。对于任意可积函数g(x),假设我们需要计算它在[a, b]区间上的积分:

I=abg(x) dx

通过换元可以把它转换成[0, 1]标准区间上的积分:

I=abg(x) dx=(ba)01g(a+(ba)u) du

其中,u=xaba。当然我们可以利用梯形公式(trapezoidal rule)或是Gauss–Laguerre积分(Gauss–Laguerre quadrature)来进行计算,不过当g(x)比较复杂时使用数值积分可能是比较困难的。在这种情况下我们可以使用随机模拟来进行计算,这种通过生成随机数来计算积分的方法称为蒙特卡洛积分(Monte Carlo integration, MC)

使用MC时我们首先从(0, 1)区间上的均匀分布进行采样,然后定义Ii为使用样本Ui计算得到的函数值:

Ii=(ba)g(a+(ba)Ui)

其中UiUnif(0,1)。显然Ii是一个随机变量,而它的均值满足:

I¯n=1ni=1nIi=bani=1ng(a+(ba)Ui)

进一步对I¯n求期望得到:

E[I¯n]=(ba)E[g(a+(ba)Ui)]=(ba)01g(a+(ba)u)f(u) du=(ba)01g(a+(ba)u) du=I

也就是说I¯n是积分I的一个无偏估计,类似地可以证明它的方差满足V(I¯n)=O(1n)。依据大数定理我们可以认为当n时,I¯n会收敛到I(I¯nI)。

更进一步我们还可以估计I¯n的置信区间。根据CLT有

I¯nNor(E[I¯n],V[I¯n])Nor(I,V(Ii/n))

那么I100(1α)%水平下的置信区间为:

II¯n±SI2nzα/2

其中zα/2为标准正态分布α/2处对应的分位数,SI2为样本方差SI2=1n1i=1n(IiI¯n)2

Making Some π

MC的一个经典应用是估计圆周率π的值。假设U1U2服从均匀分布Unif(0,1)且相互独立,则点(U1,U2)位于圆内的条件为:

(U112)2+(U212)214

因此我们可以建立一个指示函数I(u1,u2)表示样本点是否落在圆内:

I(u1,u2)={1,if (u112)2+(u212)2140,otherwise

显然I(u1,u2)的积分为π4。通过MC我们只需要生成大量的样本然后计算指示函数并取均值即可完成对π4的估计。

Single-Server Queue

现实中的很多问题使用解析的方法来精确求解可能是比较困难的,在这种情况下使用模拟的方法可以帮助我们进行求解。首先考虑一个排队问题,假设有一个先入先出(FIFO)的队列,我们引入一些记号来方便描述:

  • 用户ii1之间到达的时间间隔为Ii
  • 用户i到达的时刻为Ai=j=1iIi
  • 用户i的服务时刻为Ti,离开的时刻为Di,它们满足Ti=max(Ai,Di1)
  • 用户i的等待时间为WiQ=TiAi
  • 用户i在队列中的总时间Wi=DiAi
  • 用户i的服务时间为Si,它与离开队列时刻Di的关系为Di=Ti+Si

依据这些关系我们可以生成一个用户序列如下,通过模拟结果可以计算出用户的平均等待时间为i=16WiQ6=7.33

接下来我们考虑系统中在单位时间的平均用户数,我们记L(t)t时刻系统中用户的数目,它包含正在服务以及在队列中等候的用户数。

因此单位时间的平均用户数为:

L¯=129029L(t) dt=7029

另一种计算L¯的方法是对每个用户在系统中的时长进行求和然后再对时间进行平均:

L¯=i=16DiAi29=7029

如果使用后入先出(LIFO)的策略,对于同样的样本我们可以得到仿真结果如下:

计算得到此时用户的平均等待时间为5.33,单位时间系统中的平均用户数为2,因此后入先出的队列比先入先出的队列更加高效。

(s; S) Inventory System

接下来考虑一个库存管理系统。假设每件商品的售价为d,库存系统的管理策略为保证每一天开始库存中商品的数量至少为s,如果当天结束时库存小于s则需要进行补货将库存量提到S。记第i天结束后的库存量为Ii,当天的进货量为Zi,它满足

Zi={SIi,if Ii<s0,otherwise

假设第i天进货的花费为K+cZi,每件商品在库存中的保管费用为h,商店的需求为Di,如果当天库存量小于需求单位商品还会导致p的损失。在这些条件下我们可以建立商店的利润模型:

通过模拟我们可以得到商店每天的利润:

Simulating Random Variables

本节课最后讨论了模拟随机变量的方法。对于离散型随机变量我们可以通过对[0, 1]区间上的均匀分布进行采样,然后利用逆变换采样来生成离散变量。

而对于连续型随机变量,只需要解出CDF的反函数再进行逆变换采样即可。

Reference