高斯消元


bool cmp(int i, int k, int now)
{
    if (fabs(fabs(a[i][k]) - fabs(a[now][k])) > eps)//不相等,将大的放上面
        return fabs(a[i][k]) > fabs(a[now][k]);
    for (re j = k + 1; j <= n; j++)//相等后,找到第一个不等的,将小的放上面
        if (fabs(fabs(a[i][j]) - fabs(a[now][j])) > eps)
            return fabs(a[i][j]) < fabs(a[now][j]);
    return false;
}
void gauss()
{
    for (re k = 1; k <= n; k++)//枚举对角线
    {
        int now_max = k;
        for (re i = k + 1; i <= n; i++)//使得矩阵方程线性处理
            if (cmp(i, k, now_max)) now_max = i;
        swap(a[now_max], a[k]);
        if (fabs(a[k][k]) < eps) continue;
        for (re j = k + 1; k <= m; k++) a[k][j] /= a[k][k];//把当前x系数变为1
        a[k][k] = 1.0;
        for (re i = 1; i <= n; i++)
        {
            if (i == k) continue;
            double ijk = a[i][k];//把同一列上其他x的系数变为0
            for (re j = k; j <= m; j++) a[i][j] -= a[k][j] * ijk;
        }
    }
}
int judge()
{
    for (re i = 1; i <= n; i++)
    {
        int tot = 0;
        for (re j = 1; j <= n; j++)
            if (fabs(a[i][j]) < eps) tot++;
        if (tot == n)
        {
            if (fabs(a[i][m]) < eps) return 0;//无穷解
            else return -1;//无解
        }
    }
    for (re i = 1; i <= n; i++)//唯一解
        printf("x%d = %.2lf\n", i, a[i][m]);
    return 1;
}

相关