高斯消元法
作者:
Lemmon_kk
,
2020-06-20 19:25:03
,
所有人可见
,
阅读 715
高斯消元
const int esp = 1e-6;
int guess(){
//列 行
int c, r;
// 枚举每一列
for(c = 0, r = 0;c < n;c ++, r ++ ){
int t = r;
// 找一个fabs最大的行
for(int i = r;r < n;r ++ ){
if(fabs(a[i][c]) > fabs(a[t][c]))
t = i;
}
// 是零就直接过滤
if(fabs(a[t][c]) < esp) continue;
// 交换到第r行
for(int i = c;i < n;i ++ )
swap(a[r][i], a[t][i]);
// 把第一个数变成1
for(int i = n;i >= c;i -- )
a[r][i] /= a[r][c];
// 把同列其他的数消成0
for(int i = r + 1;i < n;i ++ ){
if(fabs(a[i][c]) < esp) continue;
for(int j = n;j >= c;j -- )
a[i][j] -= a[r][j] * a[i][c];
}
}
if(r < n){
// 枚举每一行
for(int i = r;i < n;i ++ )
if(fabs(a[i][n]) > esp)
return 2;// 无解
// 有n - r个自由元
return 1; // 有无穷多组解
}
// 有唯一解
for(int i = n - 1;i >= 0;i -- ){
// 把剩下的除了第一个数外的所有数变为0
for(int j = i + 1;j < n;j ++ )
a[i][n] -= a[i][j] * a[j][n];
}
return 0;
}
提醒一下,这个板子有问题
可以说一下哪里有问题嘛?我改一下板子
cool!
不错