Algorithm 高斯消去中的标度因子

Algorithm 高斯消去中的标度因子,algorithm,Algorithm,算法前向消除(A[1..n,1..n],b[1..n]) //对系统系数的矩阵A应用高斯消去法, //用系统右侧值的向量b扩充 //输入:矩阵A[1..n,1..n]和列向量b[1..n] //输出:一个等价的上三角矩阵代替一个带 //(n+1)st列中相应的右侧值 因为我←1对n做A[i,n+1]←b[i]//扩充矩阵 因为我←1至n− 我做 对于j←i+1至n do 为了k←我要n+1做什么 A[j,k]←A[j,k]− A[i,k]∗ A[j,i]/A[i,i] 关于这个伪代码有两个重要的

算法前向消除(A[1..n,1..n],b[1..n]) //对系统系数的矩阵A应用高斯消去法, //用系统右侧值的向量b扩充 //输入:矩阵A[1..n,1..n]和列向量b[1..n] //输出:一个等价的上三角矩阵代替一个带 //(n+1)st列中相应的右侧值 因为我←1对n做A[i,n+1]←b[i]//扩充矩阵 因为我←1至n− 我做 对于j←i+1至n do 为了k←我要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]非常大 [j,k]的新值可能会因四舍五入误差而失真 通过减去两个大小相差很大的数字。3到 为了避免此问题,我们可以始终查找具有最大值的行 第i列中系数的绝对值,与 第i行,然后使用新的A[i,i]作为第i次迭代的 支点这种被称为部分旋转的修改可以保证 比例因子的大小永远不会超过1

我对上述文本的问题如下:

  • 作者所说的“A[i,i]很小,因此比例因子A[j,i]/A[i,i]很大的可能性”是什么意思?请在这里用简单的例子解释

  • 在对上述问题的延伸中,作者所说的“A[j,k]的新值可能会因减去2而产生的舍入误差而失真”是什么意思 大不相同震级的数量“


  • 所以,我认为这些评论只有在你想编程的时候才有用。这里的主要问题是如何表示数字

    假设A[i,i]真的很小,A[j,i]/A[i,i]大约是10^12。就其本身而言,这不是一个问题,但是当您想要操纵这个数字时,您不会精确操纵10^12,而是操纵这个数字的近似值。大多数情况下,用于大数表示的规范是(如果您想深入研究)

    要记住的主要一点是,这些不是精确的数字,这意味着10^12和10^12-1具有相同的表示形式。(如果你愿意,可以试试看)

    因此,如果我们有高值,我们可能不会执行正确的操作,因为我们实际上不会处理正确的数字。我试图制作一个小程序来说明这些差异:

    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;
    }
    
    intmain()
    {
    float bigOne=1000000000000;
    浮点数=999000000000;
    浮点期望减法=1000000000;
    浮动系数=1000000;
    
    CUT< P>看看作者的意思,考虑高斯消去的最简单的例子,当我们只有两个线性方程:

    ax+by=c
    dx+ey=f
    
    我将A[I,j]替换为字母A,b,d,e,并将b[k]替换为字母c和f,以使公式更易于阅读

    为了从第一个方程中消除y,我们将第二个方程改写为

    y=(f-dx)/e            /* (1) */
    
    执行替换以计算
    x

    x=(ce-bf)/(ae-bd)   /* (2) */
    
    然后从
    x
    返回计算
    y

    现在考虑在上面的(1)中发生什么,当原代码中的代码> e <代码>非常小,比如10-320。缩放因子(即乘以<代码> f dx < /代码>以获得<代码> y < /代码>)是

    1/e
    ,或10320。乘以一个数字,在浮点数表示法中有可能溢出指数。这就是作者在问题的第一部分引用的段落的意思

    你的问题的第二部分考虑上面的公式(2)。当<代码> CE <代码>与<代码> BF < /代码>相比非常小(或<代码> BF < /代码>与<代码> CE <代码>相比非常小)由于浮点数的表示方式,减法运算的结果主要由较大的数决定。本质上,当一个数比另一个数小几个数量级时,加法或减法运算的结果与较大的数相同。作者想指出,在用高斯消去法计算解的过程