21xrx.com
2024-12-22 23:17:45 Sunday
登录
文章检索 我的文章 写文章
C++如何求解方程组
2023-07-06 05:47:15 深夜i     --     --
C++ 方程组 求解

C++作为一种高级编程语言,可以使用其强大的计算能力来求解复杂的方程组。在本文中,我们将介绍如何使用C++编程来求解方程组。

一、高斯消元法

高斯消元法是一种经典的求解线性方程组的方法。其基本思路是通过一系列的行变换来将方程组化为简化的阶梯形矩阵,然后通过反向代入的方式求解出方程组的解。

下面是一个使用C++实现高斯消元法求解方程组的示例代码:


#include <iostream>

#include <vector>

using namespace std;

const double eps = 1e-6; // 设置一个很小的阈值

vector<double> solve_equations(vector<vector<double>>& A, vector<double>& b) {

  int n = A.size();

  // 构造增广矩阵

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

    A[i].push_back(b[i]);

  }

  // 高斯消元过程

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

    int k = i;

    // 取绝对值最大的一行进行消元

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

      if (fabs(A[j][i]) > fabs(A[k][i])) k = j;

    }

    if (fabs(A[k][i]) < eps) return vector<double>();

    swap(A[i], A[k]);

    for (int j = i + 1; j <= n; ++j) A[i][j] /= A[i][i];

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

      if (i == j) continue;

      for (int k = i + 1; k <= n; ++k) A[j][k] -= A[j][i] * A[i][k];

    }

  }

  // 解方程

  vector<double> x(n);

  for (int i = 0; i < n; ++i) x[i] = A[i][n];

  return x;

}

int main() {

  vector<vector<double>> A {1, 4, 8};

  vector<double> b 11;

  vector<double> x = solve_equations(A, b);

  if (x.empty())

    cout << "No solution" << endl;

   else {

    for (double i : x) cout << i << " ";

    cout << endl;

  }

  return 0;

}

二、矩阵运算法

另一种求解方程组的方法是使用矩阵运算法。其基本思路是将方程组表示成矩阵形式,然后通过矩阵的行列式和逆矩阵等运算来求解方程组的解。

下面是一个使用C++实现矩阵运算法求解方程组的示例代码:


#include <iostream>

#include <vector>

using namespace std;

const double eps = 1e-6; // 设置一个很小的阈值

// 计算矩阵的行列式

double det(vector<vector<double>>& A) {

  int n = A.size();

  double res = 1;

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

    int k = i;

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

      if (fabs(A[j][i]) > fabs(A[k][i])) k = j;

    }

    if (fabs(A[k][i]) < eps)

      res = 0;

      break;

    

    if (i != k) {

      swap(A[i], A[k]);

      res = -res;

    }

    res *= A[i][i];

    for (int j = i + 1; j < n; ++j) A[i][j] /= A[i][i];

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

      if (i == j) continue;

      for (int k = i + 1; k < n; ++k) A[j][k] -= A[j][i] * A[i][k];

    }

  }

  return res;

}

// 求矩阵的逆矩阵

vector<vector<double>> inverse(vector<vector<double>>& A) {

  int n = A.size();

  vector<vector<double>> B(n, vector<double>(2 * n));

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

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

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

    }

    B[i][n + i] = 1;

  }

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

    int k = i;

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

      if (fabs(B[j][i]) > fabs(B[k][i])) k = j;

    }

    if (fabs(B[k][i]) < eps) return vector<vector<double>>();

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

    for (int j = i + 1; j <= 2 * n; ++j) B[i][j] /= B[i][i];

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

      if (i == j) continue;

      for (int k = i + 1; k <= 2 * n; ++k) B[j][k] -= B[j][i] * B[i][k];

    }

  }

  vector<vector<double>> res(n, vector<double>(n));

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

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

      res[i][j] = B[i][n + j];

    }

  }

  return res;

}

// 求解方程组

vector<double> solve_equations(vector<vector<double>>& A, vector<double>& b) {

  double D = det(A);

  if (fabs(D) < eps) return vector<double>();

  vector<vector<double>> A_inv = inverse(A);

  if (A_inv.empty()) return vector<double>();

  vector<double> x(A.size());

  for (int i = 0; i < A.size(); ++i) {

    for (int j = 0; j < A.size(); ++j) {

      x[i] += A_inv[i][j] * b[j];

    }

  }

  return x;

}

int main() {

  vector<vector<double>> A { 3, 5, 8};

  vector<double> b 10;

  vector<double> x = solve_equations(A, b);

  if (x.empty())

    cout << "No solution" << endl;

   else {

    for (double i : x) cout << i << " ";

    cout << endl;

  }

  return 0;

}

三、总结

使用C++求解方程组可以使用高斯消元法和矩阵运算法两种方法。其中高斯消元法比较简单,适用于小规模的方程组;矩阵运算法适用于大规模的方程组,但其计算复杂度较高,计算速度较慢。在实际应用中,可以根据具体情况选择合适的方法来求解方程组。

  
  

评论区

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