我可能错过了一些非常基本的东西。如果我不知道可访问相空间的体积(即通过分区函数进行适当的归一化),我看不到如何使用 Metropolis–Hastings 算法来计算积分。
考虑这两个问题(它们非常相关):
1) 某些约束下的可能状态数
我有一些可能的区域(概率)和一些不可能的区域(概率)的相空间。我不知道这两个区域的体积,但我可以很容易地检查一个点是否在可能或不可能的区域。
因为我知道相空间不可能部分的面积远大于可能部分的面积,所以我不想使用 Metropolis-Hastings 算法来优先探索可能的配置。我可以根据 Metropolis-Hastings 轻松实现更新以生成马尔可夫链,该链确实探索了相空间的可能部分,但是,我不知道如何使用它通过对此类马尔可夫链求和来实际计算可能的区域。我仍然不知道正确的标准化。
在 2D http://www.openprocessing.org/sketch/200710中有一个问题的 javascript 可视化, 其中最相关的部分代码是:
// in this example probability of configuration is p=0
// if the x,y point overlap with some sphere, otherwise it is p=1
float getUnnormalizedProbability( float x, float y ){
float prob = 1.0;
for(int i=0; i<nsph; i++){
float dx = x - sphx[i];
float dy = y - sphy[i];
float r2 = dx*dx + dy*dy;
if( r2 < sphR2[i] ){
prob = 0.0;
break;
}
}
return prob;
}
void MMCstep(){
float newx = x + random(-stepsz,stepsz);
float newy = y + random(-stepsz,stepsz);
// Periodic boundary condition
if ( newx<0 ) newx = boxsz + newx;
if ( newx>boxsz ) newx = newx - boxsz;
if ( newy<0 ) newy = boxsz + newy;
if ( newy>boxsz ) newy = newy - boxsz;
float newp = getUnnormalizedProbability( newx, newy );
// Metropolis-Hastings condition alfa = min( 1, pnew/p );
if( newp >= p ){
move( newx, newy, newp );
}else{
if( (newp/p) > random(1.0) ){
move( newx, newy, newp );
}
}
}
2)有限板上的中子散射
我有辐射源和探测器(某种尺寸)和几个中子散射材料薄板(某种尺寸和一些归一化的角散射分布)。
我想计算发射的影响的中子的百分比。
它可以通过随机选择板上和然而,这需要通过源自点的中子完全撞击第二块板的概率对总和进行重整化,因为我没有对中子不撞击板的情况进行抽样,我不知道这种重整化。
可以看到 plat_2 的立体角)非常费力。我不想那样做。
我想知道 Metropolis-Hastings 算法是否能以某种方式帮助解决这个问题。
