在代码块中,高斯消除的结果显示某些输入的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]<<" ";
}
}
答案 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];
该错误为您提供了垃圾回答并隐藏了更为根本的缺陷,您无法以原始顺序盲目地获取输入矩阵。您需要重新排序矩阵以避免除以零。
您可能还希望检测矩阵的重新排序不能避免被零除的情况(暗示原始矩阵是单数的,系统无法唯一解决)。