高斯消元法中的比例因子

时间:2014-12-24 12:34:54

标签: algorithm

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。

我对上述文字的疑问是

  1. 作者的意思是" A [i,i]如此小的可能性因此缩放因子A [j,i] / A [i,i]是如此之大" ?请用这个简单的例子来解释。

  2. 在上述问题的扩展中,作者的意思是" A [j,k]的新值可能会因为减去两个引起的舍入误差而失真 大小不同的数量"

2 个答案:

答案 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;
}

Try it there

。现在这不是一个很大的区别,但经过几次迭代后它可能会失控...

所以,我们可以区分计算 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)。当cebf相比非常小时(bfce相比非常小),减法的结果由于数字较大而占主导地位表示浮点数。基本上,当一个数字比另一个数字小几个数量级时,加法或减法的结果与更大的数字相同。作者想要提到的是,在使用高斯消元法计算解决方案的过程中很容易发生这种情况。