0时,下三角矩阵给出错误的答案

时间:2015-05-15 13:27:38

标签: c matrix gaussian

我一直在研究这个代码,得到用于求解线性方程的下三角矩阵,这里是代码:

int jordan (){
    float fracc=0;
    int z=0;
    fila=0;
    colum=0;
    for(colum=0;colum<cant;colum++) {
          buscar_ceros(); /*here we call*/
         for(fila=colum+1;fila<cant;fila++) {
            if(a[fila][colum]!=0) {
                fracc=(-((a[fila][colum])/(a[colum][colum])));
                for(z=0;z<=cant;z++) {
                    a[fila][z]=a[fila][z]+(fracc*a[colum][z]);
                }
            }
        }
    }
    impri();
    return 0;
}

当我输入矩阵时,当第一个元素不是0时,它会起作用:

输入

0 2 5 6
1 0 -2 4
2 4 0 -2

输出

0 2 5 6
-1.$ -1.$ -1.$ -1.$
1.$ 1.$ 1.$ 1.$

我认为一个可能的解决方案是编写一个算法来对行进行排序,但它可能是另一种方式。

这是我为避免0而做的代码:

int buscar_ceros(){
int m=0,r;
x=0;
flag=0;
    do{
        if((a[x][colum])!=0){
            flag=1;
    }
    x++;
}while(!(flag==1));

flag=0;
    for(r=0;r<=cant;r++){
        m=a[x][r];
        a[x][r]=a[fila][r];
        a[fila][r]=m;
    }
return 0;
}

1 个答案:

答案 0 :(得分:3)

是的,如果外循环a[colum][colum]的任何迭代正好是0.0,那么除以该值会产生无限结果和/或浮点异常。当a[0][0]为零时,最容易触发,但在处理其他列时也可以稍后触发。

a[colum][colum]在任何迭代时非常接近于零时,您也会遇到潜在的数值稳定性问题。

您需要准备好识别这些案例,因为它们对于单数矩阵是不可避免的。对于其他矩阵,您需要准备交换行以避免它。

特别是,在外循环的每次迭代中,您可以扫描目标列中具有最大绝对值的剩余行,并在必要时交换行以使该行成为当前行。