我有以下非常简单的代码,它应该迭代地改变矩阵的值(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来做同样的事情。我们迭代地多次这样做,最后我们应该得到一个矩阵,其行和列适当地相加。
答案 0 :(得分:1)
如果您的算法给出了过多的舍入误差,解决方案应该是找到更好的算法,而不是使用更高精度的数值。这看起来像是经典的线性规划或联立方程问题,其中有经验丰富的试验算法。您需要坐下来研究数值方法。
答案 1 :(得分:0)
好的,我明白了。原因实际上根本没有舍入错误,但我的代码错了。我应该在每次k循环迭代后将rowums和colsums设置为零。感谢每一个人的帮助。