蒙特卡洛法求多重积分-Cpp
0~1随机分布的点列
C++类的写法:
class RND{private:int R;public:RND(int r = 1){R = r;}double rnd1(){int m;double s, u, v, p;s = 65536.0;u = 2053.0;v = 13849.0;m = (int)(R / s);m = R / s;R = R - m * s;R = u * R + v;m = (int)(R / s);R = (int)(R - m * s);p = R / s;return(p);}};
这样,调用rnd1就可以产生0~1随机分布的随机数。
蒙特卡洛算法的核心函数,
C++写法:
double mtml(int n, double a[], double b[], double (*f) (int, double[])){int m, i;double s, d, *x;RND r(1.0);x = new double[n];d = 65536.0;s = 0.0;for (m = 0; m <= 65535; m++){for (i = 0; i <=n - 1; i++)x[i] = a[i] + (b[i] - a[i])*r.rnd1();s = s + (*f) (n, x) / d;}for (i = 0; i <= n - 1; i++) s=s*(b[i] - a[i]);delete []x;return (s);}
接下来在主函数中写被积函数的写法的形式为:
double f(int n,double x[]){double z;z=f(x0,x1,x2,...,xn-1)表达式;return z;}
积分结果为:
mtml(n,a,b,f)
本文参考了清华大学出版社的《常用函数算法集(C++描述)》
完整代码请参考我的GitHub/TYduoduo