gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:02:33 25 4
gpt4 key购买 nike

我有以下非常简单的代码,应该迭代地更改矩阵的值(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 执行相同的操作。我们迭代多次,最终应该得到一个行和列相加适当的矩阵。

最佳答案

如果您的算法给出过多的舍入误差,解决方案应该是找到更好的算法,而不是使用更高精度的数字。这看起来像一个经典的线性规划或联立方程问题,对此有经过尝试和测试的算法,效果很好。您需要坐下来研究一下数值方法

关于java - 避免矩阵计算中的舍入误差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19240190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com