求解线性方程组:列主元消元法
来源:优易学  2011-12-23 16:08:13   【优易学:中国教育考试门户网】   资料下载   IT书店

  /*列主元消元法

  列主元消元法是在Gauss消元法的基础上的一个改进。

  在Gauss消元法中,有些方程组虽然能够求解出结果,但是很难保证计算结果的可靠性

  列主元消元法对此进行了改进,减少了在消元过程中的误差。

  */

  /*函数名称:row_element_elimination_calculate;列主元消元法

  函数参数:int (*p)[3];线性方程组的系数行列式

  int *B;线性方程组的右边常数向量

  int size;线性方程组的阶数

  函数返回值:无,函数过程中输入线性方程组的求解结果

  */

  void row_element_elimination_calculate(double (*p)[3], double* B, int size)

  {

  double* X = new double[size];

  int i = 0, j = 0;

  double largest = -1e10; //最大列主元

  int swap_index = -1;

  for(i = 0; i < size; i++)

  {

  largest = -1e10;

  // 找到最大的列主元

  for(j = i; j < size; j++)

  {

  if(p[j][i] > largest)

  {

  largest = p[j][i];

  swap_index = j;

  }

  }

  //如果最大列主元不在子块的第一行,那么进行交换

  if(i != swap_index)

  {

  double temp = 0;

  for(j = 0; j < size; j++)

  {

  temp = p[i][j];

  p[i][j] = p[swap_index][j];

  p[swap_index][j] = temp;

  }

  temp = B[i];

  B[i] = B[swap_index];

  B[swap_index] = temp;

  }

  //进行消元

  double mi = 1.0;

  for(j = i + 1; j < size; j++)

  {

  mi = p[j][i]/p[i][i];

  for(int k = i; k < size; k++)

  {

  p[j][k] = p[j][k] - mi * p[i][k];

  }

  B[j] = B[j] - mi * B[i];

  }

  }

  //回代求取方程组的结果

  X[size - 1] = B[size - 1]/p[size - 1][size - 1];

  for(int i = size - 2; i >= 0; i--)

  {

  double temp = B[i] - X[i + 1] * p[i][i + 1];

  for(int j = i + 2; j < size; j++)

  temp = temp - X[j] * p[i][j];

  X[i] = temp/p[i][i];

  }

  for(int i = 0; i < size; i++)

  std::cout << X[i] << " ";

  std::cout << '\n';

  delete[] X;

  }

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训