c - 下三角矩阵在 0 时给出错误答案

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

最佳答案

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

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

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

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

关于c - 下三角矩阵在 0 时给出错误答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30260749/

相关文章:

Matlab:对图像求导有困难吗?

c - 如何在 IAR 上使用 stdin.h

c - 尝试修改a.out。使用 fwrite 写入 a.out 时出现段错误

c - 将矩阵传递给 C 中的方法

matrix - 使用 CUDA 计算数百个小矩阵的特征值/特征向量

browser - 对 svg 过滤器的特征检测支持

python - Griddata 创建坏形状 scipy

c - 在 C 中使用指针从字符串中删除元音

C:multithreading-父线程在输出前退出

python - 如何使用 Numpy.concatenate 连接空数组?