执行高斯消去程序时结果错误

Error in results while executing gauss elimination program

本文关键字:结果 错误 程序 高斯消 执行      更新时间:2023-10-16

在代码块中,高斯消去的结果是对某些输入显示nan和inf,并且给出某些输入的正确解,即使某些输入的上三角矩阵对同一程序显示nan或inf。我没有得到我错过的地方。

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
float a[10][10],b[10],temp,x[10]={0};
int i,j,k,n,m;
cout<<"enter order of matrix";
cin>>m>>n;
cout<<"n enter the elements of a matrix";
for(i=0;i<m;i++)
{
    for(j=0;j<n;j++)
        cin>>a[i][j];
}
cout<<"n matrix is";
for(i=0;i<m;i++)
{       cout<<"n";
    for(j=0;j<n;j++)
        cout<<a[i][j]<<"  ";
}
// upper triangular matrix
for(k=0;k<m;k++)
{
    for(i=k+1;i<m;i++)
        {   temp=a[i][k]/a[k][k];
            for(j=0;j<n;j++)
                {a[i][j]=a[i][j]-temp*a[k][j];
        }
}
}
cout<<"n the gauss elimination matrix is";
for(i=0;i<m;i++)
{   cout<<"n";
    for(j=0;j<n;j++)
        cout<<a[i][j]<<"  ";
}
// values of variables
for(i=(m-1);i>=0;i--)
{   temp=0;
    for(j=0;j<m;j++)
       temp=temp+a[i][j]*x[j];
     x[i]=(a[i][m]-temp+a[i][i])/a[i][i];
}
cout<<"n the values of variables are";
for(i=0;i<m;i++)
{       cout<<"n";
        cout<<x[i]<<"  ";
}
}

在您的评论中(在纠正了我在原始帖子中提到的错误之后),您描述了这个输入矩阵

1 -2  -6  12
2  4  12 -17
1 -4 -12  22

生成上面的三角形:

1  -2  -6   12  
0   8  24  -41  
0   0   0  -0.25  

在原文中,你应该注意到第一行和第三行是矛盾的:将所有未知数的系数加倍,但右手边没有加倍。这意味着这个方程组没有解。在上面的三角形形式中,同样的问题被压缩到第三行:0乘以每个未知数加起来都是非零的,所以第三个未知数是-INF,另外两个未知数不能以任何有意义的方式计算。

然后你尝试这个矩阵

0 2 1 -8
1 -2 -3 0
-1 1 2 3
注意我用粗体标记了主对角线。你要除以主对角线,所以第一个零破坏了整个过程。这就是我在第一个答案中所说的需要重新排序以避免被0除。

你的第一个例子不能解决。任何重新排序都不能消除第一行和第三行之间的矛盾。

第二个例子可以通过重新排序来解决。

我在你的代码中添加了粗略的重排序:
(我的整个改变是从for(i=k; ;i++)开始的循环)

#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
int main()
{
  float a[10][10],b[10],temp,x[10]={0};
  int i,j,k,n,m;
  cout<<"enter order of matrix";
  cin>>m>>n;
  cout<<"n enter the elements of a matrix";
  for(i=0;i<m;i++)
  {
      for(j=0;j<n;j++)
      cin>>a[i][j];
  }
  cout<<"n matrix is";
  for(i=0;i<m;i++)
  {       cout<<"n";
      for(j=0;j<n;j++)
      cout<<a[i][j]<<"  ";
  }
  // upper triangular matrix
  for(k=0;k<m;k++)
  {
      for(i=k; ;i++)
      {
          if (i==m)
          {
              cout << "nThe matrix is singularn";
              return -1;
          }
          if (a[i][k] != 0)
          {
              for(j=0;j<n;j++)
                  std::swap( a[k][j], a[i][j] );
              break;
          }
      }
      for(i=k+1;i<m;i++)
      {   temp=a[i][k]/a[k][k];
          for(j=0;j<n;j++)
          {a[i][j]=a[i][j]-temp*a[k][j];
      }
  }
  }
  cout<<"n the gauss elimination matrix is";
  for(i=0;i<m;i++)
  {   cout<<"n";
      for(j=0;j<n;j++)
      cout<<a[i][j]<<"  ";
  }
  // values of variables
  for(i=(m-1);i>=0;i--)
  {   temp=0;
      for(j=0;j<m;j++)
    temp=temp+a[i][j]*x[j];
      x[i]=(a[i][m]-temp+a[i][i])/a[i][i];
  }
  cout<<"n the values of variables are";
  for(i=0;i<m;i++)
  {       cout<<"n";
      cout<<x[i]<<"  ";
  }
}

最明显的错误是您忘记在循环中修改temp

for(j=0;j<m;j++)
    a[i][j]*x[j];

这个错误给了你垃圾的答案,并隐藏了更根本的缺陷,即你不能盲目地按原始序列取输入矩阵。你需要重新排序矩阵以避免被零除。

您可能还想检测矩阵的任何重新排序都不能避免被零除的情况(这意味着原始矩阵是奇异的,系统不能唯一解)。