初等行列变换:
1.把某一行乘某一个非零的数.
2.交换某两行的位置.
3.把某行的若干倍加到令一行。
原理:
将其处理为上三角的形式,然后从后往前递推,用已知项求未知项,最后求出所有未知项.
处理求解问题:
1.求无解: 0 = 非0.
2.求无穷解: 0 = 0.
3.求有解: 完美阶梯形.
高斯消元步骤:
枚举每一列:
1.找到绝对值最大的那一行.
2.将该列换到最上面.
3.将该列的第一个非0的数变为1.
4.将下面的所有该列的数变为0.
代码实现:
int gauss()//处理
{
int c;
int r = 0;
for( c = 0; c < n; c ++ ) //枚举每一列
{
int t = r;
for(int i = r; i < n; i ++ ) //找到该列的绝对值最大的那一行
if(fabs(a[i][c]) > fabs(a[t][c]))
t = i;
if(fabs(a[t][c]) < eps) continue; //如果该列最大值是0,那么一定不是唯一解
for(int i = c; i < n+1; i ++ ) //将该行换到未固定的最上面一行
swap(a[r][i],a[t][i]);
for(int i = n; i >= c; i -- ) //将该列的第一个非0的数变为1
a[r][i]/=a[r][c];
for(int i = r+1; i < n; i ++ ) //把某行的若干倍加到令一行
if(fabs(a[i][c]) > eps)
for(int j = n; j >= c; j -- )
a[i][j]-=a[r][j]*a[i][c];
r ++ ;
}
if (r < n)
{
for (int i = r; i < n; i ++ )
if (fabs(a[i][n]) > eps) //0 = 非0为无解
return 2;
return 1; //0 = 0为无穷解
}
for(int i = n-1; i >= 0; i -- ) //将各个未知项求出
for(int j = i+1; j < n; j ++ )
a[i][n]-=a[i][j]*a[j][n];
return 0; //完美阶梯形为唯一解
}