ALGORITHM ForwardElimination(A [1..n,1..n],b [1..n]) //将高斯消元应用于系统系数的矩阵A, //使用系统右侧值的向量b进行扩充 //输入:矩阵A [1..n,1..n]和列矢量b [1..n] //输出:用A代替A的等效上三角矩阵 //第(n + 1)st列中相应的右侧值 对于i←1到n做A [i,n + 1]←b [i] //增加矩阵 因为我←1到n - 1做 对于j←i + 1到n做 对于k←i到n + 1做 A [j,k]←A [j,k] - A [i,k] * A [j,i] / A [i,i]
关于这个伪代码有两个重要的观察结果。 首先,它并不总是正确的:如果A [i,i] = 0,我们就不能除以它 因此不能使用第i行作为第i次迭代的轴 算法。在这种情况下,我们应该利用第一个 基本操作并将第i行与其下方的一行交换 在第i列中具有非零系数。 (如果系统有 独特的解决方案,这是系统的正常情况 考虑,这样的行必须存在。)因为我们必须做好准备 无论如何,对于行交换的可能性,我们可以照顾 另一个潜在的困难:A [i,i]的可能性如此之小 因此缩放因子A [j,i] / A [i,i]如此之大 A [j,k]的新值可能会因引起的舍入误差而失真 通过减去两个不同大小的数量来减去 避免这个问题,我们总能找到最大的一行 第i列中系数的绝对值,与之交换 第i行,然后使用新的A [i,i]作为第i次迭代 枢。这种称为部分旋转的修改保证了 比例因子的大小永远不会超过1。
我对上述文字的疑问是
作者的意思是" A [i,i]如此小的可能性因此缩放因子A [j,i] / A [i,i]是如此之大" ?请用这个简单的例子来解释。
在上述问题的扩展中,作者的意思是" A [j,k]的新值可能会因为减去两个引起的舍入误差而失真 大小不同的数量"
答案 0 :(得分:0)
所以,我认为这些评论仅在您想要编程时才有用。那里的主要问题是表示数字的方式。
让我们说A [i,i] reaaally 小,并且A [j,i] / A [i,i]大约是10 ^ 12。本身,这不是一个问题,但是当你想操纵这个数字时,你不会完全操纵10 ^ 12但是这个数字的近似值。大多数情况下,用于大数表示的范数是IEEE 754(如果您想深入研究)。
要记住的主要是这些不是确切的数字,这意味着10 ^ 12和10 ^ 12 -1具有相同的表示。 (如果您愿意,可以试试there)
所以,如果我们的值很高,我们可能无法执行正确的操作,因为我们实际上并没有使用正确的数字。我试图制作一个小程序来说明你可以得到的这些差异:
int main()
{
float bigOne = 100000000000000;
float smallerOne = 99990000000000;
float expectedSubstraction = 10000000000;
float divisionFactor = 1000000;
cout << (bigOne-smallerOne)/divisionFactor << endl;
cout<< "expected : " << expectedSubstraction/divisionFactor << endl;
return 0;
}
。现在这不是一个很大的区别,但经过几次迭代后它可能会失控...
所以,我们可以区分计算 A [i,k] * A [j,i] / A [i,i] 和< em>真实 A [i,k] * A [j,i] / A [i,i]
此外,如果 A [j,k] 相当小, A [i,k] * A [j,i] / A [i,i] 仍然很大,我们不会得到精确值,因为我们将对一个确切的数字和一个大数字的表示执行操作。这不一定是一个很大的差异,但如果错误在多次迭代中滚雪球,它可能导致绝对结果。
希望有所帮助!
答案 1 :(得分:0)
要了解作者的意思,请考虑最简单的高斯消元示例,当我们只有两个线性方程时:
ax+by=c
dx+ey=f
我用字母c,f替换字母a,b,d,e和b [k]的A [i,j],使公式更容易阅读。
为了消除第一个等式中的y,我们将第二个等式重写为
y=(f-dx)/e /* (1) */
执行替换以计算x
x=(ce-bf)/(ae-bd) /* (2) */
然后从y
返回计算x
。
现在考虑上面(1)中原始方程中的e
非常小,例如10 -320 时会发生什么。缩放系数(即,您乘以f-dx
以获得y
的数量)是1/e
,或10 320 。乘以一个数字,在数字的浮点表示中溢出指数的大风险。这就是作者在你的问题的第一部分中引用的段落的意思。
对于你的问题的第二部分,考虑上面的公式(2)。当ce
与bf
相比非常小时(bf
与ce
相比非常小),减法的结果由于数字较大而占主导地位表示浮点数。基本上,当一个数字比另一个数字小几个数量级时,加法或减法的结果与更大的数字相同。作者想要提到的是,在使用高斯消元法计算解决方案的过程中很容易发生这种情况。