21xrx.com
2024-12-22 20:57:14 Sunday
登录
文章检索 我的文章 写文章
C++实现高斯消元法
2023-06-22 18:21:51 深夜i     --     --
C++ 高斯消元法 线性方程组 矩阵计算 数值计算

高斯消元法是一种经典的线性方程组求解算法,可以求解形如Ax=b的线性方程组,其中A为一个n x n的系数矩阵,b为一个n x 1的常数向量。在这种算法中,目标是将系数矩阵进行简化,使得每一行的第一个非零元素都是1,且该元素下方的所有元素均为0。同时,将常数向量也相应地进行变换。最终得到的简化矩阵与常数向量即为原线性方程组的解。

在C++中,我们可以用二维数组来表示矩阵和向量,并使用循环和条件语句来进行矩阵的操作。下面给出一个简单的实现示例。

首先,我们需要定义一个函数来进行高斯消元。该函数的参数包括系数矩阵A、常数向量b和未知数个数n。函数的返回值为一个表示简化后的矩阵和常数向量的二维数组。


double **GaussElimination(double **A, double *b, int n) {

  // 定义和初始化新的矩阵和向量

  double **B = new double*[n];

  double *c = new double[n];

  for (int i = 0; i < n; i++) {

    B[i] = new double[n];

    for (int j = 0; j < n; j++) {

      B[i][j] = A[i][j];

    }

    c[i] = b[i];

  }

  // 进行消元操作

  for (int i = 0; i < n; i++) {

    // 如果当前行的第一个元素为0,则进行行交换

    if (B[i][i] == 0) {

      for (int j = i+1; j < n; j++) {

        if (B[j][i] != 0) {

          // 交换i和j两行的系数和常数

          swap(B[i], B[j]);

          swap(c[i], c[j]);

          break;

        }

      }

    }

    // 将当前行的第一个元素变为1

    double p = B[i][i];

    for (int j = i; j < n; j++) {

      B[i][j] /= p;

    }

    c[i] /= p;

    // 消去下方的元素

    for (int j = i+1; j < n; j++) {

      double q = B[j][i];

      for (int k = i; k < n; k++) {

        B[j][k] -= q * B[i][k];

      }

      c[j] -= q * c[i];

    }

  }

  // 返回简化后的矩阵和向量

  return new double*[n+1]B;

}

在主函数中,我们可以先定义一个系数矩阵A和常数向量b,并输入它们的值。然后调用GaussElimination函数进行高斯消元,得到简化后的矩阵和向量。最后输出解向量即可。


int main() {

  int n; // 未知数的个数

  cin >> n;

  double **A = new double*[n];

  double *b = new double[n];

  for (int i = 0; i < n; i++) {

    A[i] = new double[n];

    for (int j = 0; j < n; j++) {

      cin >> A[i][j];

    }

    cin >> b[i];

  }

  // 进行高斯消元并输出解向量

  double **BC = GaussElimination(A, b, n);

  double *c = BC[1];

  for (int i = 0; i < n; i++) {

    cout << c[i] << " ";

  }

  cout << endl;

  return 0;

}

通过这种方式,我们可以轻松地在C++中实现高斯消元法,并求解线性方程组。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复