我一直在研究这段代码以获得用于求解线性方程的下三角矩阵,这是代码:
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/