执行高斯消除程序时结果出错

时间:2015-09-04 16:02:16

标签: c++

在代码块中,高斯消除的结果显示某些输入的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]<<"  ";
}
}

2 个答案:

答案 0 :(得分:1)

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

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  

在原文中,你应该观察到第一行和第三行是矛盾的:将未知数的所有系数加倍但右边不加倍。这意味着系统没有解决方案。在上三角形中,同样的问题已被压缩到第三行:每个未知的零次加起来为非零,因此第三个未知是-INF而另外两个不能以任何有意义的方式计算。

然后你尝试了这个矩阵

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

你的第一个例子无法解决。没有重新排序会消除第一行和第三行之间的矛盾。

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

我在你的代码中添加了粗略的重新排序:
(我的整个变化是循环开始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 singular\n";
              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]<<"  ";
  }
}

答案 1 :(得分:0)

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

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

该错误为您提供了垃圾回答并隐藏了更为根本的缺陷,您无法以原始顺序盲目地获取输入矩阵。您需要重新排序矩阵以避免除以零。

您可能还希望检测矩阵的重新排序不能避免被零除的情况(暗示原始矩阵是单数的,系统无法唯一解决)。