21xrx.com
2025-04-26 20:51:38 Saturday
文章检索 我的文章 写文章
C++实现高斯消元法
2023-06-22 18:21:51 深夜i     20     0
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++中实现高斯消元法,并求解线性方程组。

  
  

评论区

请求出错了