对N维函数求和 - 蒙特卡罗积分?

时间:2017-12-11 03:29:05

标签: java numerical-methods montecarlo

我想评估N维中蒙特卡罗方法所需的某个总和。在N维中,我有N个变量,具有M个数据点,这意味着我基本上具有代表M个采样点的M个N-D向量。我必须保持一个变量固定,而我总结M值的所有其他变量。目前我的代码是(假设我的网格有N列而M行是静态的):

 public static double myFunction(int row, int col){
      double checkMesh = mesh[row][col]; 
      return myFunctionHelper(0,col,checkMesh); 
 }

 public static double myFunctionHelper(int j, int col, double checkMesh){
      //function is initialized with j=0 
      if (j >= mesh[0].length){
           return 0;
      }
      double sum = 0;
      for (int i=0 ; i<mesh.length ; i++){
           sum += myFunctionHelper(j+1,col,checkMesh);
           if (j==mesh[0].length-1){
                if (mesh[0][col]==checkMesh){
                     sum += function(mesh[0]);
                }
                mesh = rotate(mesh,j);
           }
      }
      if (j>=1){
           mesh = rotate(mesh,j-1);
      }
      return sum;
 }

现在这个函数可以工作,但它不会修复任何变量,而只是对所有可能的变量组合求和。我想知道是否有人有任何关于我如何改变它以使其按照我的意愿工作的建议。目前我能想到的唯一解决方法是从矩阵中删除固定列,对已更改矩阵的组合求和,并在评估函数时确保固定变量包含在更改列表的正确位置,除了我想避免这样做,因为它需要更多的内存,而不是那么干净。我很感激帮助:)。

编辑:旋转功能采用网格并将第j列旋转一个垂直向上移动。函数也将vector作为参数,其中向量由数组表示。

1 个答案:

答案 0 :(得分:0)

(1)您通过调用myFunctionHelper的myFunctionHelper以递归方式计算总和。这可能有效,但它使代码更多涉及必要。递归并不适合这种数值计算。在没有递归的情况下重写算法,作为行和columnd索引的双循环,事情会变得更加清晰。

(2)使用mesh[0][col]==checkMesh,您尝试按值标识固定条目。为什么不列和行索引