求助:利用mathematica 生成自定义概率密度分布的伪随机数
mathematica吧
全部回复
仅看楼主
level 7
fel20131124 楼主
问题:概率密度分布函数为分段函数(距离原点< 3的部分服从高斯分布,其他部分服从A x^(-3.5)的概率分布):
ft=1/287.712*Piecewise[{{(Sqrt[r^2+y^2+z^2+x^2])^-3.5,Sqrt[r^2+y^2+z^2+x^2]>3},{1.92487*Exp[-(r^2+y^2+z^2+x^2)/2],Sqrt[r^2+y^2+z^2+x^2]<=3}}]
对n维的自定义概率分布产生伪随机数,参考了:http://mathematica.stackexchange.com/questions/2635/randomvariate-from-2-dimensional-probability-distribution在Mathematica中未提供对多变量分布产生随机数的支持。该网址的后两个方法效率很高,但一直没搞懂,所以先用第一个传统的方法了。主要是利用了边缘函数(MarginalDistribution)的概念。写代码时,为了简便用了4D 高斯分布做概率密度函数,但将自定义的函数ft写入后,第一步求边缘函数就卡了半天。下面是我的代码:
di=ProbabilityDistribution[PiecewiseExpand[ft],{k,-\[Infinity],\[Infinity]},{y,-\[Infinity],\[Infinity]},{z,-\[Infinity],\[Infinity]},{x,-\[Infinity],\[Infinity]}];
md1=ProbabilityDistribution[PDF[MarginalDistribution[di,1],x1],{x1,-Infinity,Infinity}]
fa=PDF[MarginalDistribution[di,1],a];
dd0[a_]=ProbabilityDistribution[PDF[di,{a,x2,x3,x4}]/PDF[MarginalDistribution[di,1],a],{x2,-\[Infinity],\[Infinity]},{x3,-\[Infinity],\[Infinity]},{x4,-\[Infinity],\[Infinity]}];
fb[a_]=PDF[MarginalDistribution[dd0[a],1],b];
md2[a_]=ProbabilityDistribution[PDF[MarginalDistribution[dd0[a],1],x2],{x2,-Infinity,Infinity}];
dd1[a_,b_]=ProbabilityDistribution[PDF[di,{a,b,x3,x4}]/(fa*fb[a]),{x3,-\[Infinity],\[Infinity]},{x4,-\[Infinity],\[Infinity]}];
fc[a_,b_]=PDF[MarginalDistribution[dd1[a,b],1],c];
md3[a_,b_]=ProbabilityDistribution[PDF[MarginalDistribution[dd1[a,b],1],x3],{x3,-Infinity,Infinity}];
md4[a_,b_,c_]=ProbabilityDistribution[PDF[di,{a,b,c,x4}]/(fa*fb[a]*fc[a,b]),{x4,-Infinity,Infinity}];
Clear[diRNG];
diRNG[len_]:=Module[{xx1,xx2,xx21,xx3,xx31,xx4},xx1=RandomVariate[md1,len];
xx2=RandomVariate[md2[#]]&/@xx1;
xx21=Transpose@{xx1,xx2};
xx3=RandomVariate[md3[#1,
#2]]&@@#
&/@xx21;
xx31=Transpose@{xx1,xx2,xx3};
xx4=RandomVariate[md4[
#1,#
2,
#3]]&@@#
&/@xx31;
Transpose[{xx1,xx2,xx3,xx4}]
]
代码基本是根据stackexchange上修改的,总卡在第一个MarginaDistribution函数上,难道是由于分段函数积分太慢?而且效率极低。求教有写过这种代码的吧友,是否有高效的途径?
其实,我认为stackexchange网页上最后一种方法:蒙特卡洛的方法最帅了,苦于不懂啊。
2015年11月24日 14点11分 1
吧务
level 15
……楼主你去Stackexchange问过了吗?
2015年12月05日 08点12分 2
我实验室的账号不给我,我没法问。不过我想出替代方法了,在调试…
2015年12月05日 14点12分
吧务
level 12
Umm,this problem I didnot pay attention before is interesting.
2015年12月05日 09点12分 3
1