0

我有以下非常简单的代码,它应该迭代地更改矩阵的值(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");
    }

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

4

2 回答 2

1

如果您的算法给出过多的舍入误差,解决方案应该是找到更好的算法,而不是使用更高精度的数字。这看起来像一个经典的线性规划或联立方程问题,其中有经过验证的算法运行良好。你需要坐下来学习一下数值方法

于 2013-10-08T07:21:06.853 回答
0

好的,我想通了。原因实际上根本不是舍入错误,而是我的代码错误。在 k 循环的每次迭代之后,我应该将 rowsums 和 colsums 设置为零。感谢大家的帮助。

于 2013-10-08T08:29:28.687 回答