高斯消元

 板子来源于网络

struct Gauss
{
    /**** **** **** **** **** ****
    * Function Name : 高斯消元法
    * Description : 求解线性方程组
    *
    * void exchange_col(int p1,int p2,int n)
    * 交换 p1 行和 p2 行的所有数据
    *
    * bool gauss(int n)
    * 求解系数矩阵为 n 的线性方程组,方程组无解返回 false,否则 true
    *
    * x1 = x0 - f(x0)/f'(x0) 牛顿迭代法
    **** **** **** **** **** ****/
    static const int N = 15;
    double matrix[N][N + 1]; //系数矩阵,从 0 开始 
    double ans[N]; //结果数组
    void exchange_col(int p1, int p2, int n) //交换 p1 行和 p2 行的所有数据
    {
        double t;
        int i;
        for (i = 0; i <= n; i++)
            t = matrix[p1][i], matrix[p1][i] = matrix[p2][i], matrix[p2][i] = t;
    }
    bool gauss(int n) //求解系数矩阵为 n 的线性方程组
    {
        int i, j, k;
        int p;
        double r;
        for (i = 0; i < n - 1; i++)
        {
            p = i;
            for (j = i + 1; j < n; j++)   //寻找 i 列绝对值最大值位置
            {
                if (abs(matrix[j][i]) > abs(matrix[p][i])) p = j;
            }
            if (p != i) exchange_col(i, p, n);
            if (matrix[i][i] == 0) return false;
            for (j = i + 1; j < n; j++)   //剩余列进行消元
            {
                r = matrix[j][i] / matrix[i][i];
                for (k = i; k <= n; k++) matrix[j][k] -= r * matrix[i][k];
            }
        }
        for (i = n - 1; i >= 0; i--)   //获得结果
        {
            ans[i] = matrix[i][n];
            for (j = n - 1; j > i; j--) ans[i] -= matrix[i][j] * ans[j];
            if (matrix[i][i] == 0) return false;
            ans[i] /= matrix[i][i];
        }
        return true;
    }

}gs;

 

posted @ 2017-10-06 21:11  Luke_Ye  阅读(190)  评论(0编辑  收藏  举报