R语言实践利用概率统计方法计算三重积分

文章目录

  • 利用概率统计方法计算三重积分
    • 一、蒙特卡罗尔平均值法
    • 二、R语言代码实践

利用概率统计方法计算三重积分

一、蒙特卡罗尔平均值法

考虑K重积分 I = ∭ Ω . . ∫ f ( x 1 , x 2 , . . . , x k ) d x 1 d x 2 . . d x k I=\iiint\limits_Ω..\int f(x_1,x_2,...,x_k)dx_1dx_2..dx_k I=Ω..f(x1,x2,...,xk)dx1dx2..dxk ,选取Ω范围内概率密度函数 g ( x 1 , x 2 , x 3 , . . . , x k ) g(x_1,x_2,x_3,...,x_k) g(x1,x2,x3,...,xk),则 I I I 可以进行以下转换:
I = ∭ Ω . . ∫ f ( x 1 , x 2 , x 3 , . . . , x k ) g ( x 1 , x 2 , x 3 , . . . , x k ) g ( x 1 , x 2 , x 3 , . . . , x k ) d x 1 d x 2 d x 3 . . . d x k = E ( f ( x 1 , x 2 , x 3 , . . . , x k ) g ( x 1 , x 2 , x 3 , . . . , x k ) ) \begin{aligned} I&=\iiint\limits_Ω..\int \dfrac{f(x_1,x_2,x_3,...,x_k)}{g(x_1,x_2,x_3,...,x_k)}g(x_1,x_2,x_3,...,x_k)dx_1dx_2dx_3...dx_k \\ &=E(\dfrac{f(x_1,x_2,x_3,...,x_k)}{g(x_1,x_2,x_3,...,x_k)}) \end{aligned} I=Ω..g(x1,x2,x3,...,xk)f(x1,x2,x3,...,xk)g(x1,x2,x3,...,xk)dx1dx2dx3...dxk=E(g(x1,x2,x3,...,xk)f(x1,x2,x3,...,xk)) F ( x 1 , x 2 , x 3 , . . . , x k ) = f ( x 1 , x 2 , x 3 , . . . , x k ) g ( x 1 , x 2 , x 3 , . . . , x k ) F(x_1,x_2,x_3,...,x_k)=\dfrac{f(x_1,x_2,x_3,...,x_k)}{g(x_1,x_2,x_3,...,x_k)} F(x1,x2,x3,...,xk)=g(x1,x2,x3,...,xk)f(x1,x2,x3,...,xk) ,则
I = E ( F ( x 1 , x 2 , x 3 , . . . , x k ) ) I= E(F(x_1,x_2,x_3,...,x_k)) I=E(F(x1,x2,x3,...,xk))

根据辛钦大数定律,设随机变量X1,X2,X3…Xk,相互独立服从同一分布,且具有数学期望 E ( X k ) = μ ( k = 1 , 2 , 3... ) E(X_k)=μ(k=1,2,3...) E(Xk)=μk=1,2,3...),则对于任何正数 ε \varepsilon ε,有: lim ⁡ n → ∞ P { ∣ 1 n ∑ k = 1 n X k − μ ∣ < ε } = 1 \lim\limits_{n\to ∞}P\{|\dfrac{1}{n}\sum\limits_{k=1}^{n}X_k-μ|<\varepsilon\}=1 nlimP{ n1k=1nXkμ<ε}=1

所以 I = E ( F ( x 1 , x 2 . . , x k ) ) = 1 n ∑ i = 1 n F ( x 1 i , x 2 i . . . , x k i ) I=E(F(x_1,x_2..,x_k))=\dfrac{1}{n}\sum\limits_{i=1}^nF(x_{1i},x_{2i}...,x_{ki}) I=E(F(x1,x2..,xk))=n1i=1nF(x1i,x2i...,xki)
简化: g ( x 1 , x 2 , x 3 , . . . , x k ) = 1 V Ω , ( x 1 , x 2 , . . . , x k ) ϵ Ω g(x_1,x_2,x_3,...,x_k)=\dfrac{1}{V_Ω},(x_1,x_2,...,x_k)\epsilonΩ g(x1,x2,x3,...,xk)=VΩ1(x1,x2,...,xk)ϵΩ 服从K维均匀分布,则:
I = E ( F ( x 1 , x 2 , x 3 , . . . , x k ) ) = E ( f ( x 1 , x 2 , x 3 , . . . , x k ) g ( x 1 , x 2 , x 3 , . . . , x k ) = V Ω n ∑ i = 1 n f ( x 1 i , x 2 i , x 3 i . . . , x k i ) \begin{aligned} I&=E(F(x_1,x_2,x_3,...,x_k)) \\ &=E(\dfrac{f(x_1,x_2,x_3,...,x_k)}{g(x_1,x_2,x_3,...,x_k)} \\ &=\dfrac{V_Ω}{n}\sum\limits_{i=1}^nf(x_{1i},x_{2i},x_{3i}...,x_{ki}) \end{aligned} I=E(F(x1,x2,x3,...,xk))=E(g(x1,x2,x3,...,xk)f(x1,x2,x3,...,xk)=nVΩi=1nf(x1i,x2i,x3i...,xki)

二、R语言代码实践

题目: 请使用概率统计知识求解以下积分的近似值
∫ 1 3 ∫ 2 4 ∫ 3 6 ( x e − y 2 + z 2 + x y z ) d x d y d z ≈ 324 ± 2.9 ∗ 1 0 − 7 \int_1^3\int_2^4\int_3^6(xe^{-{y^2+z^2}}+xyz)dxdydz\approx324\pm2.9*10^{-7} 132436(xey2+z2+xyz)dxdydz324±2.9107

#---------代码块---------
f=function(x,y,z) x*exp(-(y^2+z^2))+x*y*z
arr=array(1:1000)  #创建一维数组,长度1000
x1=3;x2=6
y1=2;y2=4
z1=1;z2=3
v=(x2-x1)*(y2-y1)*(z2-z1)  #空间体积
for(i in 1:1000)   #循环运算结果1000次,存入数组
{
     
	r1=runif(10^5,min=x1,max=x2)  #生成均匀分布随机数 x
	r2=runif(10^5,min=y1,max=y2)  #生成均匀分布随机数 y
	r3=runif(10^5,min=z1,max=z2)  #生成均匀分布随机数 z
	h=f(r1,r2,r3)
	out=v*mean(h)   #计算得到的积分值
	arr[i]=out	    #将积分值存入数组
}
print(mean(arr))    #输出计算1000次积分值后的平均值
#---------运行结果---------
[1] 324.0016

下面给出通用代码模板

fun=function(x) x[1]*exp(-x[2]^2-x[3]^2)+x[1]*x[2]*x[3]
start=c(1,2,3);end=c(3,4,6);n=10^5  #分别存放各个变量的起始值和结束值
simulation=function(fun,start,end,n)
{
     
	V=prod(end-start);      #(3-1)*(4-2)*(6-4)=12  求体积
	mat=matrix(0,nrow=n,ncol=length(start))  #n行3列矩阵,初值各元素为0
	for(i in 1:length(start)) #为每一列既3个变量生成随机数
	 	mat[,i]=runif(n,min=start[i],max=end[i])
	mean(apply(mat,1,fun))*V  #将矩阵的n行值代入fun中计算后取平均值最后乘以体积
}
simulation(fun,start,end,n)

你可能感兴趣的:(笔记,r语言,概率论,算法,数据分析)