避免矩阵计算中的舍入误差

时间:2013-10-08 05:59:52

标签: java numerical

我有以下非常简单的代码,它应该迭代地改变矩阵的值(finalvals),直到行和和列总和接近某些值(由b1和c给出) -

  double[] rowsums = new double[3];
    double[] colsums = new double[3];
    Double[][] finalvals = {
        {10320289.32d,15531663.71d,513718885.9d},
            {5741307.806d,19279894.22d,254573082.9d},
            {216919827.7d,229857986.8d,8769234962d}
    };
    Double[] b1 = {544169638d,273919997d,9217088452d};
    Double[] c = {232981430d,264669549d,9537527108d};
    for(int k = 0;k<1000;k++){
        for(int i = 0;i<3;i++){
            for(int j = 0;j<3;j++){
                rowsums[i] = rowsums[i] + finalvals[i][j];
            }
        }
        for(int i = 0;i<3;i++) {
            for(int j = 0;j<3;j++) {
                finalvals[i][j] = b1[i] * finalvals[i][j] / rowsums[i];
            }
        }
        for(int i = 0;i<3;i++) {
            for(int j = 0;j<3;j++) {
                colsums[j] = colsums[j] + finalvals[i][j];
            }
        }
        for(int i = 0;i<3;i++) {
            for(int j = 0;j<3;j++) {
                finalvals[i][j] = c[j] * finalvals[i][j] / colsums[j];
            }
        }
    }
    for(int i = 0;i<3;i++) {
        for(int j = 0;j<3;j++) {
            System.out.print(finalvals[i][j] + " ");
        }
        System.out.print("\n");
    }

然而,由于数值泄漏,终结值在经过一千次迭代后才变为全零。有没有办法堵塞这些泄漏? 编辑:算法的描述 - 我们希望矩阵行与数组b1和矩阵列相加以求和数组c。因此,首先按照现有值的比例在矩阵的前三行中分配b1的第一个值,对于其他两个行类似地分配。然后我们使用列和数组c来做同样的事情。我们迭代地多次这样做,最后我们应该得到一个矩阵,其行和列适当地相加。

2 个答案:

答案 0 :(得分:1)

如果您的算法给出了过多的舍入误差,解决方案应该是找到更好的算法,而不是使用更高精度的数值。这看起来像是经典的线性规划或联立方程问题,其中有经验丰富的试验算法。您需要坐下来研究数值方法

答案 1 :(得分:0)

好的,我明白了。原因实际上根本没有舍入错误,但我的代码错了。我应该在每次k循环迭代后将rowums和colsums设置为零。感谢每一个人的帮助。