我一直在研究这个代码,得到用于求解线性方程的下三角矩阵,这里是代码:
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;
}
答案 0 :(得分:3)
是的,如果外循环a[colum][colum]
的任何迭代正好是0.0
,那么除以该值会产生无限结果和/或浮点异常。当a[0][0]
为零时,最容易触发,但在处理其他列时也可以稍后触发。
当a[colum][colum]
在任何迭代时非常接近于零时,您也会遇到潜在的数值稳定性问题。
您需要准备好识别这些案例,因为它们对于单数矩阵是不可避免的。对于其他矩阵,您需要准备交换行以避免它。
特别是,在外循环的每次迭代中,您可以扫描目标列中具有最大绝对值的剩余行,并在必要时交换行以使该行成为当前行。