【问题标题】:lower triangular matrix give wrong answer when 0下三角矩阵在0时给出错误答案
【发布时间】:2015-05-15 13:27:38
【问题描述】:

我一直在研究这段代码,以获得求解线性方程的下三角矩阵,代码如下:

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

【问题讨论】:

  • 您检查a[fila][colum] 是否为零,但除以a[colum][colum]
  • 是的,我没有看到,如果矩阵按行排序并将0行放在其他位置会更好?
  • fracc=(-((a[fila][colum])/(a[colum][colum])));在第一个循环中导致除以 0。

标签: c matrix gaussian


【解决方案1】:

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

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

您需要准备好识别此类情况,因为它们对于奇异矩阵是不可避免的。对于其他矩阵,你需要准备好交换行来避免它。

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

【讨论】:

  • @user2461687,还要注意,对于线性方程求解器,如果您交换系数矩阵的行,那么您需要确保在右侧向量中执行相应的交换。
  • 我只使用一个二维数组:/
  • 线性方程组具有以下形式:MX = V,其中 M 是系数矩阵,V 是右手边(X 是 n 维变量)。我只是说,当您在 M 中交换行时,您需要在 V 中进行相应的交换。如果 V 是零向量(或所有分量相等的任何其他向量),那么您没有问题。如果您使用的是 (M | V) 形式的增广矩阵(即比行多一列),那么只要您小心,您就可以免费获得结果。否则,需要注意。
  • 是的,我正在使用增强矩阵,我会小心,当 a[colum][colum]==0 时,我正在执行搜索 0 的算法,并将行换成其他的那些不包括0的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多