// int_0^14/(1+x^2)dx=pi#include<iostream>#include<cstdlib>#include<ctime>// this function defines the function to integrateusingnamespacestd;doublefunc(doublex)double func(double x);( double value;int main()value = 4/(1.+x*x);(srand(unsigned(time(O);// seedtherandomizerreturn value;inti, n;l//endoffunctiontoevaluatedoublecrude_mc, x, sum_sigma,fx,variance;cin>>n;crude_mc= sum_sigma=0.;for (i= 1;i<=n; i++)x=rand()/(double)RAND_MAX//cout<<x<<endl;fx=func(x);crude_mc +=fx;sum_sigma+=fx*fx;}crude_mc=crude_mc/((double)n);Crude MCsum_sigma=sum_sigma/((double)n)variance=sum_sigma-crude_mc*crude_mc;TocomparewithVegascout<<"variance="<<variance<<"Integral="<< crude_mc<<endl;//endofmainprogram
// int_0^1 4/(1+x^2) dx = pi #include <iostream> #include <cstdlib> #include <ctime> using namespace std; double func(double x); int main() { srand(unsigned(time(0))); // seed the randomizer int i, n; double crude_mc, x, sum_sigma, fx, variance; cin >> n; crude_mc = sum_sigma=0. ; for ( i = 1; i <= n; i++){ x=rand()/(double)RAND_MAX; //cout<<x<<endl; fx=func(x); crude_mc += fx; sum_sigma += fx*fx; } crude_mc = crude_mc/((double) n ); sum_sigma = sum_sigma/((double) n ); variance=sum_sigma-crude_mc*crude_mc; cout << " variance= " << variance << " Integral = "<< crude_mc<< endl; } // end of main program // this function defines the function to integrate double func(double x) { double value; value = 4/(1.+x*x); return value; } // end of function to evaluate Crude MC To compare with Vegas
多重定积分如试验次数增加100倍,精度提高10倍。当然这样做就增加了计算的机时,提高了费用。所以在考虑蒙特卡洛方法的精确度时,不能只是简单地减少方差和增加模拟次数,还要司时兼顾计算费用,即机时耗费。通常以方差和费用的乘积作为衡量方法优劣的标准。。多重定积分用简单的抽样的蒙特卡洛方法(不考虑权重),则前面一维积分的式子,N(b-a)Zf(ar:)f(a)daNi=1可以推广为:Nn.b1ebmII(b; - aj)Zf(a1 .n:).dri..danf(a1,c2,...an)NJaianj=1i=1可以看到其中n积分的维度数目,N是抽样的次数其中对每个坐标的抽样值是在相应的间范围内均匀抽取的
多重定积分
多重定积分?对于固定的样本数N值,蒙特卡洛方法给出的误差~1/VN,而对于固定网格点法,由于每一维上的平均点数为N1/d,因此误差~1/N1/2d>1/VN当多重积分的维数d>4时,几乎没有其他数值计算方法可以超过蒙特卡洛方法?在实际计算时如何选取N值是根据被积函数的性质和要求的精度确定的,通常要比较不同N值下的结果,看它们的差异再确定需要增加的N值?如果积分中的被积函数不光滑时,则用自前的非权重简单抽样蒙特卡洛方法得到的精度可能很差,如图中有一些极大值区域没有被随机抽出。统计力学中Boltzman分布函数在相空间的大部分区域其值都是很小的,真正有贡献的区域范围很窄。?简单抽样为了提高精度,增大抽样量的办法不可取,因为这样的计算效率很低。引入带权重的重要抽样法,将可以保证计算精度又有很高的效率
多重定积分
重要抽样法重要抽样法示意图简单抽样法积分近似度较差f(x)A火轴按风分布抽得如杂度重要抽样法的原理起源于数学上的变量代换方法的思想,即:dG(r)f(a)drg)da电此时随机点的选择不再是简单抽样法中的均匀选择,而是以分布函数G(x)分布的这里gx)称为偏倚分布密度函数
重要抽样法
重要抽样法该方法使原本对f(x)的抽样,变成由另一个分布密度函数(中产生简g(x)单子样,并附带一个权重g(x)。这种方法也称为偏倚抽样法。。公式右边积分中被积函数的方差为。2f/g。如果g(x)选择恰当,并使它在积分域内的函数由线形状与x),则该方差可以变得很小。函数g(x)应当满足如下条件:。(1)g(x)应当是个分布密度函数,即g(α)da=1●(2)f(x)/g(x)不应在积分域内起伏太大,如上图,使f(x)/g(x)~1,以保证方差f/g}比f}小。(3)分布密度函数g(x)所对应的分布函数G(x)能够比较方便地解析求出。。(4)能方便地产生在积分域内满足分布函数G(x)分布的随机点。如能按上述条件找到函数g(x),我们就可以依下列步骤求积分:。(1)根据分布密度函数g(x)产生随机点x。例如采用反函数法。。(2)求出各抽样点x的函数值f(x)/g(x),并将所有点上的该函数值选加起来,再除以抽样点数就得到积分结果
重要抽样法