蒙特卡罗方法
蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战期间研制原子弹的“曼哈顿计划”。它使用随机数来进行场景的模拟或者过程的仿真,其思想核心就是通过模拟出来的大量样本集或者随机过程去近似我们想要研究的实际问题对象,这是一类非常重要的数值计算方法。
在实际问题中,面对一些带随机因素的复杂系统,用分析方法建模常常需要作许多简化假设,与面临的实际问题可能相差甚远,以致解答根本无法应用。这时,计算机模拟几乎成为唯一的选择。
一、随机变量的模拟
1. 离散随机变量的模拟
设随机变量
X
X
X 的分布律为
P
{
X
=
x
i
}
=
p
i
,
i
=
1
,
2
,
⋯
P\left\{X=x_{i}\right\}=p_{i}, i=1,2, \cdots
P{X=xi}=pi,i=1,2,⋯ , 令
p
(
0
)
=
0
,
p
(
i
)
=
∑
j
=
1
i
p
j
,
i
=
1
,
2
,
⋯
p^{(0)}=0, \quad p^{(i)}=\sum_{j=1}^{i} p_{j}, i=1,2, \cdots
p(0)=0,p(i)=j=1∑ipj,i=1,2,⋯
将
p
(
i
)
\boldsymbol{p}^{(i)}
p(i) 作为分点, 将区间
(
0
,
1
)
(\mathbf{0}, \mathbf{1})
(0,1) 分为一系列小区间
(
p
(
i
−
1
)
,
p
(
i
)
)
(
i
=
1
,
2
,
⋯
)
\left(\boldsymbol{p}^{(i-1)}, \boldsymbol{p}^{(i)}\right)(\boldsymbol{i}=\mathbf{1}, \mathbf{2}, \cdots)
(p(i−1),p(i))(i=1,2,⋯) 。 对于均匀分布的随机变量
R
∼
U
(
0
,
1
)
\boldsymbol{R} \sim \boldsymbol{U}(\mathbf{0}, \mathbf{1})
R∼U(0,1), 则有
P
{
p
(
i
−
1
)
<
R
≤
p
(
i
)
}
=
p
(
i
)
−
p
(
i
−
1
)
=
p
i
,
i
=
1
,
2
,
⋯
,
P\left\{p^{(i-1)}<R \leq p^{(i)}\right\}=p^{(i)}-p^{(i-1)}=p_{i}, \quad i=1,2, \cdots,
P{p(i−1)<R≤p(i)}=p(i)−p(i−1)=pi,i=1,2,⋯,
由此可知,事件
{
p
(
i
−
1
)
<
R
≤
p
(
i
)
}
\left\{\boldsymbol{p}^{(i-1)}<\boldsymbol{R} \leq \boldsymbol{p}^{(i)}\right\}
{p(i−1)<R≤p(i)} 和事件
{
X
=
x
i
}
\left\{\boldsymbol{X}=\boldsymbol{x}_{i}\right\}
{X=xi} 有相同的发生概率。因此我们可以用随机变量
R
\boldsymbol{R}
R 落在小区间内的情况来模拟离散的随机变量
X
\boldsymbol{X}
X 的取值情况。
例: 已知在一次随机试验中,事件
A
,
B
,
C
A, B, C
A,B,C 发生的概率分别为
0.2
,
0.3
,
0.5
0.2, 0.3,0.5
0.2,0.3,0.5 。模拟 100,000 次随机试验, 计算事件
A
,
B
,
C
\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}
A,B,C 发生的频率。在一次随机试验中,事件发生的概率如下表。
事件
A
B
C
概率
0.2
0.3
0.5
累积概率
0.2
0.5
1
\begin{array}{c|ccc} \hline \text { 事件 } & \boldsymbol{A} & \boldsymbol{B} & \boldsymbol{C} \\ \text { 概率 } & \mathbf{0 . 2} & \mathbf{0 . 3} & \mathbf{0 . 5} \\ \text { 累积概率 } & \mathbf{0 . 2} & \mathbf{0 . 5} & \mathbf{1} \\ \hline \end{array}
事件 概率 累积概率 A0.20.2B0.30.5C0.51
我们用产生[0,1]区间上均匀分布的随机数, 来模拟事件
A
,
B
,
C
\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}
A,B,C 的发生。由几何概率的知识,可以认为如果产生的随机数在区间[0,0.2]上, 事件
A
A
A 发生了; 产生的随机数在区间
(
0.2
,
0.5
]
(0.2,0.5]
(0.2,0.5] 上, 事件
B
B
B 发生了; 产生的随机数在区间
(
0.5
,
1
]
(0.5,1]
(0.5,1] 上, 事件
C
C
C 发生了。产生 100000 个[0,1]区间上均匀分布的随机数, 统计随机数落在相应区间上的次数, 就是在 这 100000 次模拟中事件
A
,
B
,
C
A, B, C
A,B,C 发生的次数,再除以总的试验次数 100000,即得到事件
A
,
B
,
C
\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}
A,B,C 发生的频率。
代码
import numpy as np
n = 100000
a = np.random.rand(n) #产生[0,1)的均匀分布随机数
n1 = np.sum(a<=0.2)
n2 = np.sum((a>0.2)&(a<=0.5))
n3 = np.sum(a>0.5)
f = np.array([n1,n2,n3])/100000
print(f)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-in9ErdrV-1628690832671)(C:\Users\haz\AppData\Roaming\Typora\typora-user-images\image-20210811203815021.png)]
2. 连续随机变量的模拟
利用[0,1]区间上的均匀分布随机数可以产生具有给定分布的随机变量数列。我们知道, 若随机变量
ξ
\xi
ξ 的概率密度函数和分布函数分别为
f
(
x
)
,
F
(
x
)
f(x), F(x)
f(x),F(x) ,则随机变量
η
=
F
(
ξ
)
\eta=F(\xi)
η=F(ξ) 的分布就是区间
[
0
,
1
]
[0,1]
[0,1] 上的均匀分布。因此, 若
R
i
R_{i}
Ri 是
[
0
,
1
]
[0,1]
[0,1]中圴匀分布的随机数,那么方程
∫
−
∞
x
i
f
(
x
)
d
x
=
R
i
\int_{-\infty}^{x_{i}} f(x) d x=R_{i}
∫−∞xif(x)dx=Ri
的解
x
i
\boldsymbol{x}_{i}
xi 就是所求的具有概率密度函数为
f
(
x
)
f(x)
f(x) 的随机抽样。这可简单解释如下。
若某个连续型随机变量
ξ
\xi
ξ 的分布函数为
F
(
x
)
=
∫
−
∞
x
f
(
t
)
d
t
,
F(x)=\int_{-\infty}^{x} f(t) d t,
F(x)=∫−∞xf(t)dt,
不失一般性, 设
F
(
x
)
F(x)
F(x) 是严格单调增函数, 存在反函数
x
=
F
−
1
(
y
)
x=\boldsymbol{F}^{-1}(\boldsymbol{y})
x=F−1(y), 下面我们证明随机变量
η
=
F
(
ξ
)
\eta=F(\xi)
η=F(ξ) 服从
[
0
,
1
]
[0,1]
[0,1] 上的均匀分布, 记
η
\eta
η 的分布函数为
G
(
y
)
G(y)
G(y), 由于
F
(
x
)
F(x)
F(x) 是分布函数, 它的取值在
[
0
,
1
]
[0,1]
[0,1] 上,从而当
0
<
y
<
1
0<y<1
0<y<1 时
G
(
y
)
=
P
{
η
≤
y
}
=
P
{
F
(
ξ
)
≤
y
}
=
P
{
ξ
≤
F
−
1
(
y
)
}
=
F
(
F
−
1
(
y
)
)
=
y
G(y)=P\{\eta \leq y\}=P\{F(\xi) \leq y\}=P\left\{\xi \leq F^{-1}(y)\right\}=F\left(F^{-1}(y)\right)=y
G(y)=P{η≤y}=P{F(ξ)≤y}=P{ξ≤F−1(y)}=F(F−1(y))=y
因而
η
\eta
η 的分布函数为
G
(
y
)
=
{
0
,
y
≤
0
y
,
0
<
y
<
1
1
,
y
≥
1
G(y)= \begin{cases}0, & y \leq 0 \\ y, & 0<y<1 \\ 1, & y \geq 1\end{cases}
G(y)=⎩⎪⎨⎪⎧0,y,1,y≤00<y<1y≥1
η
\eta
η 服从[0,1]上的均匀分布。
R
R
R 为
[
0
,
1
]
[0,1]
[0,1] 区间上均匀分布的随机变量, 则随机变量
ξ
=
F
−
1
(
R
)
\xi=F^{-1}(R)
ξ=F−1(R) 的分布函数 为
F
(
x
)
F(x)
F(x), 概率密度函数为
f
(
x
)
f(x)
f(x), 这里
F
−
1
(
x
)
F^{-1}(x)
F−1(x) 是
F
(
x
)
F(x)
F(x) 的反函数。
所以, 只要分布函数
F
(
x
)
F(x)
F(x) 的反函数
F
−
1
(
x
)
F^{-1}(x)
F−1(x) 存在, 由[0,1]区间上均匀分布
的随机数
R
t
\boldsymbol{R}_{t}
Rt, 求
x
t
=
F
−
1
(
R
t
)
\boldsymbol{x}_{t}=\boldsymbol{F}^{-1}\left(\boldsymbol{R}_{t}\right)
xt=F−1(Rt), 即解方程
F
(
x
t
)
=
R
t
,
F\left(x_{t}\right)=R_{t},
F(xt)=Rt,
就可得到分布函数为
F
(
x
)
F(x)
F(x) 的随机抽样
x
t
x_{t}
xt 。
例: 求具有指数分布
f
(
x
)
=
{
λ
e
−
λ
x
,
x
>
0
0
,
x
≤
0
f(x)= \begin{cases}\lambda e^{-\lambda x}, & x>0 \\ 0, & x \leq 0\end{cases}
f(x)={λe−λx,0,x>0x≤0
的随机抽样。
设
R
i
\boldsymbol{R}_{i}
Ri 是[0,1]区间上均匀分布的随机数, 则
R
i
=
∫
−
∞
x
i
f
(
x
)
d
x
=
∫
0
x
i
λ
e
−
λ
x
d
x
=
1
−
e
−
λ
x
i
R_{i}=\int_{-\infty}^{x_{i}} f(x) d x=\int_{0}^{x_{i}} \lambda e^{-\lambda x} d x=1-e^{-\lambda x_{i}}
Ri=∫−∞xif(x)dx=∫0xiλe−λxdx=1−e−λxi
所以
x
i
=
−
1
λ
ln
(
1
−
R
i
)
x_{i}=-\frac{1}{\lambda} \ln \left(1-R_{i}\right)
xi=−λ1ln(1−Ri)
就是所求的随机抽样。
由于
1
−
R
i
1-\boldsymbol{R}_{i}
1−Ri 也服从均匀分布,所以上式又可简化为
x
i
=
−
1
λ
ln
R
i
x_{i}=-\frac{1}{\lambda} \ln R_{i}
xi=−λ1lnRi
Python 中
N
u
m
P
y
NumPy
NumPy 库函数可以产生常用分布的随机数,实际上不需要 我们去生成各种分布的随机数。
二、 M o n t e C a r l o Monte Carlo MonteCarlo法的应用
1.定积分的计算
在实际问题中,许多需要计算多重积分的复杂问题,用蒙特卡洛方法一般都能够很有效地予以解决,尽管蒙特卡洛方法计算结果的精度不很高,但它能很快提供出一个低精度的模拟结果也是很有价值的。而且, 在多重积分中蒙特卡洛方法的计算误差与积分重数无关。
例1: 求定积分
I = ∬ x 2 + y 2 ≤ 1 1 − x 2 d x d y I=\iint_{x^{2}+y^{2} \leq 1} \sqrt{1-x^{2}} d x d y I=∬x2+y2≤11−x2dxdy
根据积分的几何意义,它的值等于以 x 2 + z 2 = 1 ( z > 0 ) {x^{2}+z^{2} = 1}(z>0) x2+z2=1(z>0)为曲面顶, x 2 + y 2 ≤ 1 , z = 0 {x^{2}+y^{2} \leq 1,z = 0} x2+y2≤1,z=0为底的柱体 D D D的体积,用以下思路求 I I I的近似值:
D D D被包含在长方体 Ω \Omega Ω: ∣ x ∣ ≤ 1 , ∣ y ∣ ≤ 1 , 0 ≤ z ≤ 1 |x| \leq 1,|y| \leq 1,0 \leq z \leq 1 ∣x∣≤1,∣y∣≤1,0≤z≤1 的内部,长方体 Ω \Omega Ω 的体积为 4 。 而 D D D 是 x 2 + y 2 ≤ 1 x^{2}+y^{2} \leq 1 x2+y2≤1, 0 ≤ z ≤ 1 − x 2 \mathbf{0} \leq \boldsymbol{z} \leq \sqrt{1-\boldsymbol{x}^{2}} 0≤z≤1−x2 所围成的区域。若在 Ω \Omega Ω 内产生均匀分布的 N N N 个点, 有 n n n 个点落 在D的内部。由频率近似于概率, 得到在 Ω \Omega Ω 内任取一点, 落在 D D D 内的概率 p = D 的体积 Ω 的体积 = I 4 ≈ n N p=\frac{D \text { 的体积 }}{\Omega \text { 的体积 }}=\frac{I}{4} \approx \frac{n}{N} p=Ω 的体积 D 的体积 =4I≈Nn, 所以 I ≈ 4 n N I \approx \frac{4 n}{N} I≈N4n 。
代码
import numpy as np
N = 10000000
x = np.random.uniform(-1,1,size=N)
y = np.random.uniform(-1,1,N)
z = np.random.uniform(0,1,N)
n = np.sum((x**2+y**2<=1)&(0<=z)&(z<=np.sqrt(1-x**2)))
I = n/N*4
print('I近似为',I)
2.概率在计算中的应用
例1:求 π \pi π 的近似值
在单位正方形 ( x ∈ [ 0 , 1 ] , y ∈ [ 0 , 1 ] ) (x\in[0,1],y\in[0,1]) (x∈[0,1],y∈[0,1])中取 10,000,000 个随机点 ( x i , y i ) \left(\boldsymbol{x}_{i}, \boldsymbol{y}_{i}\right) (xi,yi), i = 1 , 2 , ⋯ , 10000000 \boldsymbol{i}=\mathbf{1 , 2}, \cdots, \mathbf{1 0 0 0 0 0 0 0} i=1,2,⋯,10000000, 统计点落在 x 2 + y 2 ≤ 1 \boldsymbol{x}^{2}+\boldsymbol{y}^{2} \leq \mathbf{1} x2+y2≤1 内的频数 n \boldsymbol{n} n 。则由几何概率知, 任取单位正方形内一点, 落在单位圆内部(第一象限部分)的概率为 p = π 4 p=\frac{\pi}{4} p=4π,由于试验次数充分多,频率近似于概率,有 n 10000000 ≈ π 4 \frac{n}{\mathbf{1 0 0 0 0 0 0 0}} \approx \frac{\pi}{4} 10000000n≈4π, 所以 π ≈ 4 n 10000000 \pi \approx \frac{4 n}{\mathbf{1 0 0 0 0 0 0 0}} π≈100000004n 。
代码
import numpy as np
N = 10000000
x = np.random.rand(N)
y = np.random.rand(N)
n = np.sum(x**2+y**2<1)
PI = n/N*4
print(PI)
例2:炮弹射击
炮弹射击的目标为一椭圆
x
2
12
0
2
+
y
2
8
0
2
=
1
\frac{x^{2}}{120^{2}}+\frac{y^{2}}{80^{2}}=1
1202x2+802y2=1 所围成的区域的中心, 瞄准目标的中心发射时, 受到各种因素的影响, 炮弹着地点与目标中心有
随机偏差。设炮弹着地点围绕目标中心呈二维正态分布, 且偏差的标准差在
x
x
x 和
y
y
y 方向均为 100 米,并相互独立, 用 Monte Carlo 法计算炮弹落在椭圆区域内的概率,并与数值积分计算的概率进行比较。
解: 炮弹的落点为二维随机变量, 记为
(
X
,
Y
)
,
(
X
,
Y
)
(\boldsymbol{X}, \boldsymbol{Y}),(\boldsymbol{X}, \boldsymbol{Y})
(X,Y),(X,Y) 的联合概率密度函数为
f
(
x
,
y
)
=
1
20000
π
e
−
x
2
+
y
2
20000
f(x, y)=\frac{1}{20000 \pi} e^{-\frac{x^{2}+y^{2}}{20000}}
f(x,y)=20000π1e−20000x2+y2
炮弹落在椭圆区域内的概率为
p
=
∬
x
2
12
0
2
+
y
2
8
0
2
≤
1
1
20000
π
e
−
x
2
+
y
2
20000
d
x
d
y
p=\iint_{\frac{x^{2}}{120^{2}}+\frac{y^{2}}{80^{2}} \leq 1} \frac{1}{\mathbf{2 0 0 0 0} \pi} e^{-\frac{x^{2}+y^{2}}{20000}} d x d y
p=∬1202x2+802y2≤120000π1e−20000x2+y2dxdy
利用 Python 数值解的命令,求得
p
=
0.3754
\boldsymbol{p}=\mathbf{0 . 3 7 5 4}
p=0.3754 。
我们也可以使用 Monte Carlo 法求概率。模拟发射了 N N N 发炮弹,统计炮弹落在椭圆 x 2 12 0 2 + y 2 8 0 2 = 1 \frac{x^{2}}{120^{2}}+\frac{y^{2}}{80^{2}}=1 1202x2+802y2=1 内部的次数 n n n, 用炮弹落在椭圆内的频率近似所求的概率,模拟结果为所求的概率在 0.3754 0.3754 0.3754 附近波动。
代码
import numpy as np
from scipy.integrate import dblquad
f = lambda x,y: 1/(20000*np.pi)*np.exp(-(x**2+y**2)/20000)
fy = lambda x: 80*np.sqrt(1-x**2/120**2)
p1 = dblquad(f,-120,120,lambda x: -fy(x),lambda x: fy(x))
print("概率的数值解为:",p1[0])
N = 1000000
mean = [0,0]
cov = np.eye(2)*10000
a = np.random.multivariate_normal(mean,cov,N)
n = (a[:,0]**2/120**2+a[:,1]**2/80**2<=1).sum()
p2 = n/N
print("概率的近似值为",p2)
例3:求全局最优解
求下列函数的最大值:
f
(
x
)
=
(
1
−
x
3
)
sin
(
3
x
)
,
−
2
π
≤
x
≤
2
π
.
f(x)=\left(1-x^{3}\right) \sin (3 x),-2 \pi \leq x \leq 2 \pi .
f(x)=(1−x3)sin(3x),−2π≤x≤2π.
解 为了便于理解,先做出图象
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi,2*np.pi,100)
y = (1-x**3)*np.sin(3*x)
plt.plot(x,y)
plt.show()
可见,函数在-6和 6 附近达到最大值,最大值接近 195。
如果使用优化命令 f m i n b o u n d fminbound fminbound 求解,只能求得局部极大点 x=-3.7505, 对应的局部极大值为52.0046。显然结果是错误的, 原因是 f m i n b o u n d fminbound fminbound 容易䧂入局部极值,这也是许多优化算法难以克服的一个困难。
from scipy import optimize
import numpy as np
f = lambda x: (1-x**3)*np.sin(3*x)
a = optimize.fminbound(lambda x: -f(x),-np.pi*2,np.pi*2) # 标量函数的有界最小化。
print(a,f(a))
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
用随机模拟的方法,就是随机产生若干个自变量的值来搜索,求得最大值再194附近,效果要好得多。
import numpy as np
f = lambda x: (1-x**3)*np.sin(3*x)
x = np.random.uniform(-2*np.pi,2*np.pi,100)
y = f(x)
y_max = y.max()
x_ = x[f(x) == y_max]
print(x_[0],y_max)
例4:库存管理问题
某小贩每天以
a
=
2
a=2
a=2 元/束的价格购进一种鲜花, 卖价为
b
=
3
b=3
b=3 元/束,当天卖不出去的花全部损失. 顾客一天内对花的需求量
X
X
X 是随机变量,
X
X
X 服从泊松分布
P
{
X
=
k
}
=
e
−
λ
λ
k
k
!
,
k
=
0
,
1
,
2
,
⋯
P\{X=k\}=e^{-\lambda} \frac{\lambda^{k}}{k !}, k=0,1,2, \cdots
P{X=k}=e−λk!λk,k=0,1,2,⋯
其中参数
λ
=
10
\lambda=10
λ=10. 问小贩每天应购进多少束鲜花才能得到好收益?
解 这是一个随机决策问题,要确定每天应购进的鲜花数量以使收入最高。设小贩每天购进
u
u
u 束鲜花. 如果这天需求量
X
≤
u
X \leq \boldsymbol{u}
X≤u, 则其收入为
b
X
−
a
u
b \boldsymbol{X}-\boldsymbol{a} \boldsymbol{u}
bX−au,如果需求量
X
>
u
\boldsymbol{X}>\boldsymbol{u}
X>u, 则其收入为
b
u
−
a
u
\boldsymbol{b} \boldsymbol{u}-\boldsymbol{a} \boldsymbol{u}
bu−au, 因此小贩一天的期望收入为
J
(
u
)
=
−
a
u
+
∑
k
=
0
u
b
k
⋅
e
−
λ
⋅
λ
k
k
!
+
∑
k
=
u
+
1
∞
b
u
⋅
e
−
λ
⋅
λ
k
k
!
J(u)=-a u+\sum_{k=0}^{u} b k \cdot e^{-\lambda} \cdot \frac{\lambda^{k}}{k !}+\sum_{k=u+1}^{\infty} b u \cdot e^{-\lambda} \cdot \frac{\lambda^{k}}{k !}
J(u)=−au+k=0∑ubk⋅e−λ⋅k!λk+k=u+1∑∞bu⋅e−λ⋅k!λk
问题归结为在
a
,
b
,
λ
a, b, \lambda
a,b,λ 已知时,求
u
u
u 使得
J
(
u
)
J(u)
J(u) 最大. 因而最佳购进量
u
∗
u^{*}
u∗ 满足
J
(
u
∗
)
≥
J
(
u
∗
+
1
)
,
J
(
u
∗
)
≥
J
(
u
∗
−
1
)
,
J\left(u^{*}\right) \geq J\left(u^{*}+1\right), J\left(u^{*}\right) \geq J\left(u^{*}-1\right),
J(u∗)≥J(u∗+1),J(u∗)≥J(u∗−1),
由于
J
(
u
+
1
)
−
J
(
u
)
=
−
a
+
b
e
−
λ
∑
k
=
u
+
1
∞
λ
k
k
!
=
−
a
+
b
(
1
−
∑
k
=
0
u
e
−
λ
λ
k
k
!
)
J(u+1)-J(u)=-a+b e^{-\lambda} \sum_{k=u+1}^{\infty} \frac{\lambda^{k}}{k !}=-a+b\left(1-\sum_{k=0}^{u} e^{-\lambda} \frac{\lambda^{k}}{k !}\right)
J(u+1)−J(u)=−a+be−λ∑k=u+1∞k!λk=−a+b(1−∑k=0ue−λk!λk)
最佳购进量
u
∗
\boldsymbol{u}^{*}
u∗ 满足
1
−
∑
k
=
0
u
∗
e
−
λ
λ
k
k
!
≤
a
b
1
−
∑
k
=
0
u
∗
−
1
e
−
λ
λ
k
k
!
≥
a
b
\begin{aligned} &1-\sum_{k=0}^{u^{*}} e^{-\lambda} \frac{\lambda^{k}}{k !} \leq \frac{a}{b} \\ &1-\sum_{k=0}^{u^{*}-1} e^{-\lambda} \frac{\lambda^{k}}{k !} \geq \frac{a}{b} \end{aligned}
1−k=0∑u∗e−λk!λk≤ba1−k=0∑u∗−1e−λk!λk≥ba
记泊松分布的分布函数为
F
(
i
)
=
P
{
X
≤
i
}
=
∑
k
=
0
i
e
−
λ
λ
k
k
!
F(i)=P\{X \leq i\}=\sum_{k=0}^{i} e^{-\lambda} \frac{\lambda^{k}}{k !}
F(i)=P{X≤i}=∑k=0ie−λk!λk, 则最佳购进量
u
∗
u^{*}
u∗ 满足
F
(
u
∗
−
1
)
≤
1
−
a
b
≤
F
(
u
∗
)
F\left(u^{*}-1\right) \leq 1-\frac{a}{b} \leq F\left(u^{*}\right)
F(u∗−1)≤1−ba≤F(u∗)
查 Poisson 分布表, 或利用 Python 软件, 求得最佳购进量
u
∗
=
9
\boldsymbol{u}^{*}=9
u∗=9 。
from scipy.stats import poisson
a=2; b=3
lamda =10; p=1-a/b
u=poisson.ppf(1-a/b,lamda) # 求最佳订购量
p1=poisson.cdf(u-1,lamda) #p1和p2是为验证最佳购进量
p2=poisson.cdf(u,lamda)
print(u,p1,p,p2)
下面用计算机模拟进行检验。 对不同的 a , b , λ \boldsymbol{a}, \boldsymbol{b}, \lambda a,b,λ ,用计算机模拟求最优决策 u u u 的算法如下:
- 步骤 1 给定 a , b , λ \boldsymbol{a}, \boldsymbol{b}, \lambda a,b,λ, 记进货量为 u u u 时, 收益为 M u \boldsymbol{M}_{u} Mu, 当 u = 0 \boldsymbol{u}=\mathbf{0} u=0 时, M 0 = 0 \boldsymbol{M}_{0}=\mathbf{0} M0=0;令 u = 1 \boldsymbol{u}=\mathbf{1} u=1, 继续下一步。
- 步骤 2 对随机需求变量 X X X 做模拟,求出收入,共做 n n n 次模拟,求出收入的平均值 M u M_{u} Mu 。
- 步骤 3 若 M u ≥ M u − 1 \boldsymbol{M}_{u} \geq \boldsymbol{M}_{u-1} Mu≥Mu−1, 令 u = u + 1 \boldsymbol{u}=\boldsymbol{u}+\mathbf{1} u=u+1, 转步骤 2 ; 2 ; 2; 若 M u < M u − 1 \boldsymbol{M}_{u}<\boldsymbol{M}_{u-1} Mu<Mu−1, 输出 u ∗ = u − 1 \boldsymbol{u}^{*}=\boldsymbol{u}-\mathbf{1} u∗=u−1, 停止。
用 Python 软件进行模拟,求得最佳进货量为 8 或 9 , 发现其与理论推导符合得很好。模拟的 Python 程序如下:
import numpy as npa=2; b=3; lamda=10; M1=0;u=1; n=10000;for i in range(1,2*lamda): d=np.random.poisson(lamda,n) #产生n个服从Poiss分布的需求量数据 M2=np.mean(((b-a)*u*(u<=d)+((b-a)*d-a*(u-d))*(u>d))) #求平均利润 if M2>M1: M1=M2; u=u+1; else: print('最佳购进量:',u-1); break
三、概率论相关知识补充
超几何分布
设有N件产品,其中有M件次品,现从中任取n件,用X表示其中的次品数,求其分布律。
P
(
X
=
k
)
=
C
M
k
C
N
−
M
n
−
k
C
N
n
,
k
=
0
,
1
,
2
,
⋯
,
l
.
P(X=k)=\frac{C_{M}^{k} C_{N-M}^{n-k}}{C_{N}^{n}}, k=0,1,2, \cdots, l.
P(X=k)=CNnCMkCN−Mn−k,k=0,1,2,⋯,l.
l = m i n ( M , n ) l = min(M,n) l=min(M,n)
泊松分布
若
P
(
X
=
k
)
=
e
−
λ
λ
k
k
!
,
k
=
0
,
1
,
2
,
⋯
P(X=k)=e^{-\lambda} \frac{\lambda^{k}}{k !}, k=0,1,2, \cdots
P(X=k)=e−λk!λk,k=0,1,2,⋯
其中
λ
>
0
\lambda>0
λ>0 是常数,则称
X
X
X 服从参数为
λ
\lambda
λ 的泊松 (Poisson) 分布. 记作
X
∼
π
(
λ
)
X \sim \pi(\lambda)
X∼π(λ) 或
P
(
λ
)
P(\lambda)
P(λ)
应用场合 在某个时段内:
- 市级医院急诊病人数;
- 某地区拨错号的电话呼唤次数;
- 某地区发生的交通事故的次数. # 蒙特卡罗方法
蒙特卡罗(Monte Carlo)方法,也称为计算机随机模拟方法,是一种基于“随机数”的计算方法。这一方法源于美国在第一次世界大战期间研制原子弹的“曼哈顿计划”。它使用随机数来进行场景的模拟或者过程的仿真,其思想核心就是通过模拟出来的大量样本集或者随机过程去近似我们想要研究的实际问题对象,这是一类非常重要的数值计算方法。
在实际问题中,面对一些带随机因素的复杂系统,用分析方法建模常常需要作许多简化假设,与面临的实际问题可能相差甚远,以致解答根本无法应用。这时,计算机模拟几乎成为唯一的选择。
一、随机变量的模拟
1. 离散随机变量的模拟
设随机变量
X
X
X 的分布律为
P
{
X
=
x
i
}
=
p
i
,
i
=
1
,
2
,
⋯
P\left\{X=x_{i}\right\}=p_{i}, i=1,2, \cdots
P{X=xi}=pi,i=1,2,⋯ , 令
p
(
0
)
=
0
,
p
(
i
)
=
∑
j
=
1
i
p
j
,
i
=
1
,
2
,
⋯
p^{(0)}=0, \quad p^{(i)}=\sum_{j=1}^{i} p_{j}, i=1,2, \cdots
p(0)=0,p(i)=j=1∑ipj,i=1,2,⋯
将
p
(
i
)
\boldsymbol{p}^{(i)}
p(i) 作为分点, 将区间
(
0
,
1
)
(\mathbf{0}, \mathbf{1})
(0,1) 分为一系列小区间
(
p
(
i
−
1
)
,
p
(
i
)
)
(
i
=
1
,
2
,
⋯
)
\left(\boldsymbol{p}^{(i-1)}, \boldsymbol{p}^{(i)}\right)(\boldsymbol{i}=\mathbf{1}, \mathbf{2}, \cdots)
(p(i−1),p(i))(i=1,2,⋯) 。 对于均匀分布的随机变量
R
∼
U
(
0
,
1
)
\boldsymbol{R} \sim \boldsymbol{U}(\mathbf{0}, \mathbf{1})
R∼U(0,1), 则有
P
{
p
(
i
−
1
)
<
R
≤
p
(
i
)
}
=
p
(
i
)
−
p
(
i
−
1
)
=
p
i
,
i
=
1
,
2
,
⋯
,
P\left\{p^{(i-1)}<R \leq p^{(i)}\right\}=p^{(i)}-p^{(i-1)}=p_{i}, \quad i=1,2, \cdots,
P{p(i−1)<R≤p(i)}=p(i)−p(i−1)=pi,i=1,2,⋯,
由此可知,事件
{
p
(
i
−
1
)
<
R
≤
p
(
i
)
}
\left\{\boldsymbol{p}^{(i-1)}<\boldsymbol{R} \leq \boldsymbol{p}^{(i)}\right\}
{p(i−1)<R≤p(i)} 和事件
{
X
=
x
i
}
\left\{\boldsymbol{X}=\boldsymbol{x}_{i}\right\}
{X=xi} 有相同的发生概率。因此我们可以用随机变量
R
\boldsymbol{R}
R 落在小区间内的情况来模拟离散的随机变量
X
\boldsymbol{X}
X 的取值情况。
例: 已知在一次随机试验中,事件
A
,
B
,
C
A, B, C
A,B,C 发生的概率分别为
0.2
,
0.3
,
0.5
0.2, 0.3,0.5
0.2,0.3,0.5 。模拟 100,000 次随机试验, 计算事件
A
,
B
,
C
\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}
A,B,C 发生的频率。在一次随机试验中,事件发生的概率如下表。
事件
A
B
C
概率
0.2
0.3
0.5
累积概率
0.2
0.5
1
\begin{array}{c|ccc} \hline \text { 事件 } & \boldsymbol{A} & \boldsymbol{B} & \boldsymbol{C} \\ \text { 概率 } & \mathbf{0 . 2} & \mathbf{0 . 3} & \mathbf{0 . 5} \\ \text { 累积概率 } & \mathbf{0 . 2} & \mathbf{0 . 5} & \mathbf{1} \\ \hline \end{array}
事件 概率 累积概率 A0.20.2B0.30.5C0.51
我们用产生[0,1]区间上均匀分布的随机数, 来模拟事件
A
,
B
,
C
\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}
A,B,C 的发生。由几何概率的知识,可以认为如果产生的随机数在区间[0,0.2]上, 事件
A
A
A 发生了; 产生的随机数在区间
(
0.2
,
0.5
]
(0.2,0.5]
(0.2,0.5] 上, 事件
B
B
B 发生了; 产生的随机数在区间
(
0.5
,
1
]
(0.5,1]
(0.5,1] 上, 事件
C
C
C 发生了。产生 100000 个[0,1]区间上均匀分布的随机数, 统计随机数落在相应区间上的次数, 就是在 这 100000 次模拟中事件
A
,
B
,
C
A, B, C
A,B,C 发生的次数,再除以总的试验次数 100000,即得到事件
A
,
B
,
C
\boldsymbol{A}, \boldsymbol{B}, \boldsymbol{C}
A,B,C 发生的频率。
代码
import numpy as np
n = 100000
a = np.random.rand(n) #产生[0,1)的均匀分布随机数
n1 = np.sum(a<=0.2)
n2 = np.sum((a>0.2)&(a<=0.5))
n3 = np.sum(a>0.5)
f = np.array([n1,n2,n3])/100000
print(f)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
2. 连续随机变量的模拟
利用[0,1]区间上的均匀分布随机数可以产生具有给定分布的随机变量数列。我们知道, 若随机变量
ξ
\xi
ξ 的概率密度函数和分布函数分别为
f
(
x
)
,
F
(
x
)
f(x), F(x)
f(x),F(x) ,则随机变量
η
=
F
(
ξ
)
\eta=F(\xi)
η=F(ξ) 的分布就是区间
[
0
,
1
]
[0,1]
[0,1] 上的均匀分布。因此, 若
R
i
R_{i}
Ri 是
[
0
,
1
]
[0,1]
[0,1]中圴匀分布的随机数,那么方程
∫
−
∞
x
i
f
(
x
)
d
x
=
R
i
\int_{-\infty}^{x_{i}} f(x) d x=R_{i}
∫−∞xif(x)dx=Ri
的解
x
i
\boldsymbol{x}_{i}
xi 就是所求的具有概率密度函数为
f
(
x
)
f(x)
f(x) 的随机抽样。这可简单解释如下。
若某个连续型随机变量
ξ
\xi
ξ 的分布函数为
F
(
x
)
=
∫
−
∞
x
f
(
t
)
d
t
,
F(x)=\int_{-\infty}^{x} f(t) d t,
F(x)=∫−∞xf(t)dt,
不失一般性, 设
F
(
x
)
F(x)
F(x) 是严格单调增函数, 存在反函数
x
=
F
−
1
(
y
)
x=\boldsymbol{F}^{-1}(\boldsymbol{y})
x=F−1(y), 下面我们证明随机变量
η
=
F
(
ξ
)
\eta=F(\xi)
η=F(ξ) 服从
[
0
,
1
]
[0,1]
[0,1] 上的均匀分布, 记
η
\eta
η 的分布函数为
G
(
y
)
G(y)
G(y), 由于
F
(
x
)
F(x)
F(x) 是分布函数, 它的取值在
[
0
,
1
]
[0,1]
[0,1] 上,从而当
0
<
y
<
1
0<y<1
0<y<1 时
G
(
y
)
=
P
{
η
≤
y
}
=
P
{
F
(
ξ
)
≤
y
}
=
P
{
ξ
≤
F
−
1
(
y
)
}
=
F
(
F
−
1
(
y
)
)
=
y
G(y)=P\{\eta \leq y\}=P\{F(\xi) \leq y\}=P\left\{\xi \leq F^{-1}(y)\right\}=F\left(F^{-1}(y)\right)=y
G(y)=P{η≤y}=P{F(ξ)≤y}=P{ξ≤F−1(y)}=F(F−1(y))=y
因而
η
\eta
η 的分布函数为
G
(
y
)
=
{
0
,
y
≤
0
y
,
0
<
y
<
1
1
,
y
≥
1
G(y)= \begin{cases}0, & y \leq 0 \\ y, & 0<y<1 \\ 1, & y \geq 1\end{cases}
G(y)=⎩⎪⎨⎪⎧0,y,1,y≤00<y<1y≥1
η
\eta
η 服从[0,1]上的均匀分布。
R
R
R 为
[
0
,
1
]
[0,1]
[0,1] 区间上均匀分布的随机变量, 则随机变量
ξ
=
F
−
1
(
R
)
\xi=F^{-1}(R)
ξ=F−1(R) 的分布函数 为
F
(
x
)
F(x)
F(x), 概率密度函数为
f
(
x
)
f(x)
f(x), 这里
F
−
1
(
x
)
F^{-1}(x)
F−1(x) 是
F
(
x
)
F(x)
F(x) 的反函数。
所以, 只要分布函数
F
(
x
)
F(x)
F(x) 的反函数
F
−
1
(
x
)
F^{-1}(x)
F−1(x) 存在, 由[0,1]区间上均匀分布
的随机数
R
t
\boldsymbol{R}_{t}
Rt, 求
x
t
=
F
−
1
(
R
t
)
\boldsymbol{x}_{t}=\boldsymbol{F}^{-1}\left(\boldsymbol{R}_{t}\right)
xt=F−1(Rt), 即解方程
F
(
x
t
)
=
R
t
,
F\left(x_{t}\right)=R_{t},
F(xt)=Rt,
就可得到分布函数为
F
(
x
)
F(x)
F(x) 的随机抽样
x
t
x_{t}
xt 。
例: 求具有指数分布
f
(
x
)
=
{
λ
e
−
λ
x
,
x
>
0
0
,
x
≤
0
f(x)= \begin{cases}\lambda e^{-\lambda x}, & x>0 \\ 0, & x \leq 0\end{cases}
f(x)={λe−λx,0,x>0x≤0
的随机抽样。
设
R
i
\boldsymbol{R}_{i}
Ri 是[0,1]区间上均匀分布的随机数, 则
R
i
=
∫
−
∞
x
i
f
(
x
)
d
x
=
∫
0
x
i
λ
e
−
λ
x
d
x
=
1
−
e
−
λ
x
i
R_{i}=\int_{-\infty}^{x_{i}} f(x) d x=\int_{0}^{x_{i}} \lambda e^{-\lambda x} d x=1-e^{-\lambda x_{i}}
Ri=∫−∞xif(x)dx=∫0xiλe−λxdx=1−e−λxi
所以
x
i
=
−
1
λ
ln
(
1
−
R
i
)
x_{i}=-\frac{1}{\lambda} \ln \left(1-R_{i}\right)
xi=−λ1ln(1−Ri)
就是所求的随机抽样。
由于
1
−
R
i
1-\boldsymbol{R}_{i}
1−Ri 也服从均匀分布,所以上式又可简化为
x
i
=
−
1
λ
ln
R
i
x_{i}=-\frac{1}{\lambda} \ln R_{i}
xi=−λ1lnRi
Python 中
N
u
m
P
y
NumPy
NumPy 库函数可以产生常用分布的随机数,实际上不需要 我们去生成各种分布的随机数。
二、 M o n t e C a r l o Monte Carlo MonteCarlo法的应用
1.定积分的计算
在实际问题中,许多需要计算多重积分的复杂问题,用蒙特卡洛方法一般都能够很有效地予以解决,尽管蒙特卡洛方法计算结果的精度不很高,但它能很快提供出一个低精度的模拟结果也是很有价值的。而且, 在多重积分中蒙特卡洛方法的计算误差与积分重数无关。
例1: 求定积分
I = ∬ x 2 + y 2 ≤ 1 1 − x 2 d x d y I=\iint_{x^{2}+y^{2} \leq 1} \sqrt{1-x^{2}} d x d y I=∬x2+y2≤11−x2dxdy
根据积分的几何意义,它的值等于以 x 2 + z 2 = 1 ( z > 0 ) {x^{2}+z^{2} = 1}(z>0) x2+z2=1(z>0)为曲面顶, x 2 + y 2 ≤ 1 , z = 0 {x^{2}+y^{2} \leq 1,z = 0} x2+y2≤1,z=0为底的柱体 D D D的体积,用以下思路求 I I I的近似值:
D D D被包含在长方体 Ω \Omega Ω: ∣ x ∣ ≤ 1 , ∣ y ∣ ≤ 1 , 0 ≤ z ≤ 1 |x| \leq 1,|y| \leq 1,0 \leq z \leq 1 ∣x∣≤1,∣y∣≤1,0≤z≤1 的内部,长方体 Ω \Omega Ω 的体积为 4 。 而 D D D 是 x 2 + y 2 ≤ 1 x^{2}+y^{2} \leq 1 x2+y2≤1, 0 ≤ z ≤ 1 − x 2 \mathbf{0} \leq \boldsymbol{z} \leq \sqrt{1-\boldsymbol{x}^{2}} 0≤z≤1−x2 所围成的区域。若在 Ω \Omega Ω 内产生均匀分布的 N N N 个点, 有 n n n 个点落 在D的内部。由频率近似于概率, 得到在 Ω \Omega Ω 内任取一点, 落在 D D D 内的概率 p = D 的体积 Ω 的体积 = I 4 ≈ n N p=\frac{D \text { 的体积 }}{\Omega \text { 的体积 }}=\frac{I}{4} \approx \frac{n}{N} p=Ω 的体积 D 的体积 =4I≈Nn, 所以 I ≈ 4 n N I \approx \frac{4 n}{N} I≈N4n 。
代码
import numpy as np
N = 10000000
x = np.random.uniform(-1,1,size=N)
y = np.random.uniform(-1,1,N)
z = np.random.uniform(0,1,N)
n = np.sum((x**2+y**2<=1)&(0<=z)&(z<=np.sqrt(1-x**2)))
I = n/N*4
print('I近似为',I)
2.概率在计算中的应用
例1:求 π \pi π 的近似值
在单位正方形 ( x ∈ [ 0 , 1 ] , y ∈ [ 0 , 1 ] ) (x\in[0,1],y\in[0,1]) (x∈[0,1],y∈[0,1])中取 10,000,000 个随机点 ( x i , y i ) \left(\boldsymbol{x}_{i}, \boldsymbol{y}_{i}\right) (xi,yi), i = 1 , 2 , ⋯ , 10000000 \boldsymbol{i}=\mathbf{1 , 2}, \cdots, \mathbf{1 0 0 0 0 0 0 0} i=1,2,⋯,10000000, 统计点落在 x 2 + y 2 ≤ 1 \boldsymbol{x}^{2}+\boldsymbol{y}^{2} \leq \mathbf{1} x2+y2≤1 内的频数 n \boldsymbol{n} n 。则由几何概率知, 任取单位正方形内一点, 落在单位圆内部(第一象限部分)的概率为 p = π 4 p=\frac{\pi}{4} p=4π,由于试验次数充分多,频率近似于概率,有 n 10000000 ≈ π 4 \frac{n}{\mathbf{1 0 0 0 0 0 0 0}} \approx \frac{\pi}{4} 10000000n≈4π, 所以 π ≈ 4 n 10000000 \pi \approx \frac{4 n}{\mathbf{1 0 0 0 0 0 0 0}} π≈100000004n 。
代码
import numpy as np
N = 10000000
x = np.random.rand(N)
y = np.random.rand(N)
n = np.sum(x**2+y**2<1)
PI = n/N*4
print(PI)
例2:炮弹射击
炮弹射击的目标为一椭圆
x
2
12
0
2
+
y
2
8
0
2
=
1
\frac{x^{2}}{120^{2}}+\frac{y^{2}}{80^{2}}=1
1202x2+802y2=1 所围成的区域的中心, 瞄准目标的中心发射时, 受到各种因素的影响, 炮弹着地点与目标中心有
随机偏差。设炮弹着地点围绕目标中心呈二维正态分布, 且偏差的标准差在
x
x
x 和
y
y
y 方向均为 100 米,并相互独立, 用 Monte Carlo 法计算炮弹落在椭圆区域内的概率,并与数值积分计算的概率进行比较。
解: 炮弹的落点为二维随机变量, 记为
(
X
,
Y
)
,
(
X
,
Y
)
(\boldsymbol{X}, \boldsymbol{Y}),(\boldsymbol{X}, \boldsymbol{Y})
(X,Y),(X,Y) 的联合概率密度函数为
f
(
x
,
y
)
=
1
20000
π
e
−
x
2
+
y
2
20000
f(x, y)=\frac{1}{20000 \pi} e^{-\frac{x^{2}+y^{2}}{20000}}
f(x,y)=20000π1e−20000x2+y2
炮弹落在椭圆区域内的概率为
p
=
∬
x
2
12
0
2
+
y
2
8
0
2
≤
1
1
20000
π
e
−
x
2
+
y
2
20000
d
x
d
y
p=\iint_{\frac{x^{2}}{120^{2}}+\frac{y^{2}}{80^{2}} \leq 1} \frac{1}{\mathbf{2 0 0 0 0} \pi} e^{-\frac{x^{2}+y^{2}}{20000}} d x d y
p=∬1202x2+802y2≤120000π1e−20000x2+y2dxdy
利用 Python 数值解的命令,求得
p
=
0.3754
\boldsymbol{p}=\mathbf{0 . 3 7 5 4}
p=0.3754 。
我们也可以使用 Monte Carlo 法求概率。模拟发射了 N N N 发炮弹,统计炮弹落在椭圆 x 2 12 0 2 + y 2 8 0 2 = 1 \frac{x^{2}}{120^{2}}+\frac{y^{2}}{80^{2}}=1 1202x2+802y2=1 内部的次数 n n n, 用炮弹落在椭圆内的频率近似所求的概率,模拟结果为所求的概率在 0.3754 0.3754 0.3754 附近波动。
代码
import numpy as np
from scipy.integrate import dblquad
f = lambda x,y: 1/(20000*np.pi)*np.exp(-(x**2+y**2)/20000)
fy = lambda x: 80*np.sqrt(1-x**2/120**2)
p1 = dblquad(f,-120,120,lambda x: -fy(x),lambda x: fy(x))
print("概率的数值解为:",p1[0])
N = 1000000
mean = [0,0]
cov = np.eye(2)*10000
a = np.random.multivariate_normal(mean,cov,N)
n = (a[:,0]**2/120**2+a[:,1]**2/80**2<=1).sum()
p2 = n/N
print("概率的近似值为",p2)
例3:求全局最优解
求下列函数的最大值:
f
(
x
)
=
(
1
−
x
3
)
sin
(
3
x
)
,
−
2
π
≤
x
≤
2
π
.
f(x)=\left(1-x^{3}\right) \sin (3 x),-2 \pi \leq x \leq 2 \pi .
f(x)=(1−x3)sin(3x),−2π≤x≤2π.
解 为了便于理解,先做出图象
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-2*np.pi,2*np.pi,100)
y = (1-x**3)*np.sin(3*x)
plt.plot(x,y)
plt.show()
可见,函数在-6和 6 附近达到最大值,最大值接近 195。
如果使用优化命令 f m i n b o u n d fminbound fminbound 求解,只能求得局部极大点 x=-3.7505, 对应的局部极大值为52.0046。显然结果是错误的, 原因是 f m i n b o u n d fminbound fminbound 容易䧂入局部极值,这也是许多优化算法难以克服的一个困难。
from scipy import optimize
import numpy as np
f = lambda x: (1-x**3)*np.sin(3*x)
a = optimize.fminbound(lambda x: -f(x),-np.pi*2,np.pi*2) # 标量函数的有界最小化。
print(a,f(a))
用随机模拟的方法,就是随机产生若干个自变量的值来搜索,求得最大值再194附近,效果要好得多。
import numpy as np
f = lambda x: (1-x**3)*np.sin(3*x)
x = np.random.uniform(-2*np.pi,2*np.pi,100)
y = f(x)
y_max = y.max()
x_ = x[f(x) == y_max]
print(x_[0],y_max)
例4:库存管理问题
某小贩每天以
a
=
2
a=2
a=2 元/束的价格购进一种鲜花, 卖价为
b
=
3
b=3
b=3 元/束,当天卖不出去的花全部损失. 顾客一天内对花的需求量
X
X
X 是随机变量,
X
X
X 服从泊松分布
P
{
X
=
k
}
=
e
−
λ
λ
k
k
!
,
k
=
0
,
1
,
2
,
⋯
P\{X=k\}=e^{-\lambda} \frac{\lambda^{k}}{k !}, k=0,1,2, \cdots
P{X=k}=e−λk!λk,k=0,1,2,⋯
其中参数
λ
=
10
\lambda=10
λ=10. 问小贩每天应购进多少束鲜花才能得到好收益?
解 这是一个随机决策问题,要确定每天应购进的鲜花数量以使收入最高。设小贩每天购进
u
u
u 束鲜花. 如果这天需求量
X
≤
u
X \leq \boldsymbol{u}
X≤u, 则其收入为
b
X
−
a
u
b \boldsymbol{X}-\boldsymbol{a} \boldsymbol{u}
bX−au,如果需求量
X
>
u
\boldsymbol{X}>\boldsymbol{u}
X>u, 则其收入为
b
u
−
a
u
\boldsymbol{b} \boldsymbol{u}-\boldsymbol{a} \boldsymbol{u}
bu−au, 因此小贩一天的期望收入为
J
(
u
)
=
−
a
u
+
∑
k
=
0
u
b
k
⋅
e
−
λ
⋅
λ
k
k
!
+
∑
k
=
u
+
1
∞
b
u
⋅
e
−
λ
⋅
λ
k
k
!
J(u)=-a u+\sum_{k=0}^{u} b k \cdot e^{-\lambda} \cdot \frac{\lambda^{k}}{k !}+\sum_{k=u+1}^{\infty} b u \cdot e^{-\lambda} \cdot \frac{\lambda^{k}}{k !}
J(u)=−au+k=0∑ubk⋅e−λ⋅k!λk+k=u+1∑∞bu⋅e−λ⋅k!λk
问题归结为在
a
,
b
,
λ
a, b, \lambda
a,b,λ 已知时,求
u
u
u 使得
J
(
u
)
J(u)
J(u) 最大. 因而最佳购进量
u
∗
u^{*}
u∗ 满足
J
(
u
∗
)
≥
J
(
u
∗
+
1
)
,
J
(
u
∗
)
≥
J
(
u
∗
−
1
)
,
J\left(u^{*}\right) \geq J\left(u^{*}+1\right), J\left(u^{*}\right) \geq J\left(u^{*}-1\right),
J(u∗)≥J(u∗+1),J(u∗)≥J(u∗−1),
由于
J
(
u
+
1
)
−
J
(
u
)
=
−
a
+
b
e
−
λ
∑
k
=
u
+
1
∞
λ
k
k
!
=
−
a
+
b
(
1
−
∑
k
=
0
u
e
−
λ
λ
k
k
!
)
J(u+1)-J(u)=-a+b e^{-\lambda} \sum_{k=u+1}^{\infty} \frac{\lambda^{k}}{k !}=-a+b\left(1-\sum_{k=0}^{u} e^{-\lambda} \frac{\lambda^{k}}{k !}\right)
J(u+1)−J(u)=−a+be−λ∑k=u+1∞k!λk=−a+b(1−∑k=0ue−λk!λk)
最佳购进量
u
∗
\boldsymbol{u}^{*}
u∗ 满足
1
−
∑
k
=
0
u
∗
e
−
λ
λ
k
k
!
≤
a
b
1
−
∑
k
=
0
u
∗
−
1
e
−
λ
λ
k
k
!
≥
a
b
\begin{aligned} &1-\sum_{k=0}^{u^{*}} e^{-\lambda} \frac{\lambda^{k}}{k !} \leq \frac{a}{b} \\ &1-\sum_{k=0}^{u^{*}-1} e^{-\lambda} \frac{\lambda^{k}}{k !} \geq \frac{a}{b} \end{aligned}
1−k=0∑u∗e−λk!λk≤ba1−k=0∑u∗−1e−λk!λk≥ba
记泊松分布的分布函数为
F
(
i
)
=
P
{
X
≤
i
}
=
∑
k
=
0
i
e
−
λ
λ
k
k
!
F(i)=P\{X \leq i\}=\sum_{k=0}^{i} e^{-\lambda} \frac{\lambda^{k}}{k !}
F(i)=P{X≤i}=∑k=0ie−λk!λk, 则最佳购进量
u
∗
u^{*}
u∗ 满足
F
(
u
∗
−
1
)
≤
1
−
a
b
≤
F
(
u
∗
)
F\left(u^{*}-1\right) \leq 1-\frac{a}{b} \leq F\left(u^{*}\right)
F(u∗−1)≤1−ba≤F(u∗)
查 Poisson 分布表, 或利用 Python 软件, 求得最佳购进量
u
∗
=
9
\boldsymbol{u}^{*}=9
u∗=9 。
from scipy.stats import poisson
a=2; b=3
lamda =10; p=1-a/b
u=poisson.ppf(1-a/b,lamda) # 求最佳订购量
p1=poisson.cdf(u-1,lamda) #p1和p2是为验证最佳购进量
p2=poisson.cdf(u,lamda)
print(u,p1,p,p2)
下面用计算机模拟进行检验。 对不同的 a , b , λ \boldsymbol{a}, \boldsymbol{b}, \lambda a,b,λ ,用计算机模拟求最优决策 u u u 的算法如下:
- 步骤 1 给定 a , b , λ \boldsymbol{a}, \boldsymbol{b}, \lambda a,b,λ, 记进货量为 u u u 时, 收益为 M u \boldsymbol{M}_{u} Mu, 当 u = 0 \boldsymbol{u}=\mathbf{0} u=0 时, M 0 = 0 \boldsymbol{M}_{0}=\mathbf{0} M0=0;令 u = 1 \boldsymbol{u}=\mathbf{1} u=1, 继续下一步。
- 步骤 2 对随机需求变量 X X X 做模拟,求出收入,共做 n n n 次模拟,求出收入的平均值 M u M_{u} Mu 。
- 步骤 3 若 M u ≥ M u − 1 \boldsymbol{M}_{u} \geq \boldsymbol{M}_{u-1} Mu≥Mu−1, 令 u = u + 1 \boldsymbol{u}=\boldsymbol{u}+\mathbf{1} u=u+1, 转步骤 2 ; 2 ; 2; 若 M u < M u − 1 \boldsymbol{M}_{u}<\boldsymbol{M}_{u-1} Mu<Mu−1, 输出 u ∗ = u − 1 \boldsymbol{u}^{*}=\boldsymbol{u}-\mathbf{1} u∗=u−1, 停止。
用 Python 软件进行模拟,求得最佳进货量为 8 或 9 , 发现其与理论推导符合得很好。模拟的 Python 程序如下:
import numpy as npa=2; b=3; lamda=10; M1=0;u=1; n=10000;for i in range(1,2*lamda): d=np.random.poisson(lamda,n) #产生n个服从Poiss分布的需求量数据 M2=np.mean(((b-a)*u*(u<=d)+((b-a)*d-a*(u-d))*(u>d))) #求平均利润 if M2>M1: M1=M2; u=u+1; else: print('最佳购进量:',u-1); break
三、概率论相关知识补充
超几何分布
设有N件产品,其中有M件次品,现从中任取n件,用X表示其中的次品数,求其分布律。
P
(
X
=
k
)
=
C
M
k
C
N
−
M
n
−
k
C
N
n
,
k
=
0
,
1
,
2
,
⋯
,
l
.
P(X=k)=\frac{C_{M}^{k} C_{N-M}^{n-k}}{C_{N}^{n}}, k=0,1,2, \cdots, l.
P(X=k)=CNnCMkCN−Mn−k,k=0,1,2,⋯,l.
l = m i n ( M , n ) l = min(M,n) l=min(M,n)
泊松分布
若
P
(
X
=
k
)
=
e
−
λ
λ
k
k
!
,
k
=
0
,
1
,
2
,
⋯
P(X=k)=e^{-\lambda} \frac{\lambda^{k}}{k !}, k=0,1,2, \cdots
P(X=k)=e−λk!λk,k=0,1,2,⋯
其中
λ
>
0
\lambda>0
λ>0 是常数,则称
X
X
X 服从参数为
λ
\lambda
λ 的泊松 (Poisson) 分布. 记作
X
∼
π
(
λ
)
X \sim \pi(\lambda)
X∼π(λ) 或
P
(
λ
)
P(\lambda)
P(λ)
应用场合 在某个时段内:
- 市级医院急诊病人数;
- 某地区拨错号的电话呼唤次数;
- 某地区发生的交通事故的次数.
- 一本书一页中的印刷错误数.
正态分布
若随机变量
X
X
X 的概率密度函数为
f
(
x
)
=
1
2
π
σ
e
−
(
x
−
μ
)
2
2
σ
2
,
−
∞
<
x
<
+
∞
f(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}},-\infty<x<+\infty
f(x)=2πσ1e−2σ2(x−μ)2,−∞<x<+∞
其中
μ
,
σ
\mu, \sigma
μ,σ 为常数,且
σ
>
0
\sigma>0
σ>0, 则称随机变量
X
X
X 服从参数 为
μ
,
σ
2
\mu, \sigma^{2}
μ,σ2 的正态分布.服从正态分布的随机变量为正态变量. 记作
X
∼
N
(
μ
,
σ
2
)
X \sim N\left(\mu, \sigma^{2}\right)
X∼N(μ,σ2)
二维正态分布
若
r
.
v
.
(
X
,
Y
)
r . v .(X, Y)
r.v.(X,Y) 的联合
d
.
f
.
d.f.
d.f. 为
f
(
x
,
y
)
=
1
2
π
σ
1
σ
2
1
−
ρ
2
×
e
−
1
2
(
1
−
ρ
2
)
[
(
x
−
μ
1
)
2
σ
1
2
−
2
ρ
(
x
−
μ
1
)
(
y
−
μ
2
)
σ
1
σ
2
+
(
y
−
μ
2
)
2
σ
2
2
]
f(x, y)=\frac{1}{2 \pi \sigma_{1} \sigma_{2} \sqrt{1-\rho^{2}}} \times e^{-\frac{1}{2\left(1-\rho^{2}\right)}\left[\frac{\left(x-\mu_{1}\right)^{2}}{\sigma_{1}^{2}}-2 \rho \frac{\left(x-\mu_{1}\right)\left(y-\mu_{2}\right)}{\sigma_{1} \sigma_{2}}+\frac{\left(y-\mu_{2}\right)^{2}}{\sigma_{2}^{2}}\right]}
f(x,y)=2πσ1σ21−ρ21×e−2(1−ρ2)1[σ12(x−μ1)2−2ρσ1σ2(x−μ1)(y−μ2)+σ22(y−μ2)2]
则称
(
X
,
Y
)
(X, Y)
(X,Y) 服从参数为
μ
1
,
σ
1
2
,
μ
2
,
σ
2
2
,
ρ
\mu_{1}, \sigma_{1}^{2}, \mu_{2}, \sigma_{2}^{2}, \rho
μ1,σ12,μ2,σ22,ρ 的正态分布,记作
(
X
,
Y
)
∼
N
(
μ
1
,
σ
1
2
;
μ
2
,
σ
2
2
;
ρ
)
.
(X, Y) \sim N\left(\mu_{1}, \sigma_{1}^{2} ; \mu_{2}, \sigma_{2}^{2} ; \rho\right) .
(X,Y)∼N(μ1,σ12;μ2,σ22;ρ). 其中
,
σ
1
,
σ
2
>
0
,
−
1
<
ρ
<
1.
, \sigma_{1}, \sigma_{2}>0,-1<\rho<1 .
,σ1,σ2>0,−1<ρ<1.
- 一本书一页中的印刷错误数.
正态分布
若随机变量
X
X
X 的概率密度函数为
f
(
x
)
=
1
2
π
σ
e
−
(
x
−
μ
)
2
2
σ
2
,
−
∞
<
x
<
+
∞
f(x)=\frac{1}{\sqrt{2 \pi} \sigma} e^{-\frac{(x-\mu)^{2}}{2 \sigma^{2}}},-\infty<x<+\infty
f(x)=2πσ1e−2σ2(x−μ)2,−∞<x<+∞
其中
μ
,
σ
\mu, \sigma
μ,σ 为常数,且
σ
>
0
\sigma>0
σ>0, 则称随机变量
X
X
X 服从参数 为
μ
,
σ
2
\mu, \sigma^{2}
μ,σ2 的正态分布.服从正态分布的随机变量为正态变量. 记作
X
∼
N
(
μ
,
σ
2
)
X \sim N\left(\mu, \sigma^{2}\right)
X∼N(μ,σ2)
二维正态分布
若
r
.
v
.
(
X
,
Y
)
r . v .(X, Y)
r.v.(X,Y) 的联合
d
.
f
.
d.f.
d.f. 为
f
(
x
,
y
)
=
1
2
π
σ
1
σ
2
1
−
ρ
2
×
e
−
1
2
(
1
−
ρ
2
)
[
(
x
−
μ
1
)
2
σ
1
2
−
2
ρ
(
x
−
μ
1
)
(
y
−
μ
2
)
σ
1
σ
2
+
(
y
−
μ
2
)
2
σ
2
2
]
f(x, y)=\frac{1}{2 \pi \sigma_{1} \sigma_{2} \sqrt{1-\rho^{2}}} \times e^{-\frac{1}{2\left(1-\rho^{2}\right)}\left[\frac{\left(x-\mu_{1}\right)^{2}}{\sigma_{1}^{2}}-2 \rho \frac{\left(x-\mu_{1}\right)\left(y-\mu_{2}\right)}{\sigma_{1} \sigma_{2}}+\frac{\left(y-\mu_{2}\right)^{2}}{\sigma_{2}^{2}}\right]}
f(x,y)=2πσ1σ21−ρ21×e−2(1−ρ2)1[σ12(x−μ1)2−2ρσ1σ2(x−μ1)(y−μ2)+σ22(y−μ2)2]
则称
(
X
,
Y
)
(X, Y)
(X,Y) 服从参数为
μ
1
,
σ
1
2
,
μ
2
,
σ
2
2
,
ρ
\mu_{1}, \sigma_{1}^{2}, \mu_{2}, \sigma_{2}^{2}, \rho
μ1,σ12,μ2,σ22,ρ 的正态分布,记作
(
X
,
Y
)
∼
N
(
μ
1
,
σ
1
2
;
μ
2
,
σ
2
2
;
ρ
)
.
(X, Y) \sim N\left(\mu_{1}, \sigma_{1}^{2} ; \mu_{2}, \sigma_{2}^{2} ; \rho\right) .
(X,Y)∼N(μ1,σ12;μ2,σ22;ρ). 其中
,
σ
1
,
σ
2
>
0
,
−
1
<
ρ
<
1.
, \sigma_{1}, \sigma_{2}>0,-1<\rho<1 .
,σ1,σ2>0,−1<ρ<1.