执行高斯消去程序时结果错误
Error in results while executing gauss elimination program
在代码块中,高斯消去的结果是对某些输入显示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];
这个错误给了你垃圾的答案,并隐藏了更根本的缺陷,即你不能盲目地按原始序列取输入矩阵。你需要重新排序矩阵以避免被零除。
您可能还想检测矩阵的任何重新排序都不能避免被零除的情况(这意味着原始矩阵是奇异的,系统不能唯一解)。
相关文章:
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- Static_cast转换为错误的数据类型,但结果仍然正确?
- C++ 犰狳库中的sort_index()函数给出了错误的结果
- C++:使用类在向量中搜索特定元素时,我得到了错误的结果
- 检查 n2 是否是 n1 的倍数后结果错误,但根本没有错误
- 为什么我的性能基准给了我错误的结果?
- 使用具有默认参数的函数模板进行 decltype 会使结果混乱(一个有趣的问题或 gcc 的错误)
- 斐波那契检验(C++)的结果错误
- 在发布版本中划分两个双精度的结果错误
- 2D FFT后的图像结果错误
- 计算文本文件中的单个字母并打印结果 - 错误的输出 C++
- C++字符和 int 之间的转换,结果错误
- char*与std字符串的比较结果错误
- 斯波吉购物结果错误
- 超载"+"操作员,结果错误?
- 执行高斯消去程序时结果错误
- hash_djb2 PHP结果错误
- 按位操作比较结果错误
- 使用'if'语句和"<<"时的结果错误,'>>'运算符比较 3 个整数