gpt4 book ai didi

c++ - C++ 中的 Gauss-Jordan 消去法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:14 27 4
gpt4 key购买 nike

我在 C++ 中使用 Gauss-Jordan 消去法求解线性方程组。代码工作正常。想知道为什么 void gauss() 中的第 1、2、3 行不能被第 4 行替换(这样做后得到不正确的输出)?

#include <iostream>
using namespace std;
class Gauss
{
float a[50][50];
int n;
public:
void accept()
{
cout<<"Enter no. of variables: ";
cin>>n;
for(int i=0;i<n;i++)
{
for(int j=0;j<n+1;j++)
{
if(j==n)
cout<<"Constant no."<<i+1<<" = ";
else
cout<<"a["<<i+1<<"]["<<j+1<<"] = ";
cin>>a[i][j];
}
}
}
void display()
{
for(int i=0;i<n;i++)
{
cout<<"\n";
for(int j=0;j<n+1;j++)
{
if(j==n)
cout<<" ";
cout<<a[i][j]<<"\t";
}
}
}

void gauss()//converting augmented matrix to row echelon form
{
float temp;//Line 1
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
temp=a[j][i]/a[i][i];//Line 2
for(int k=i;k<n+1;k++)
{
a[j][k]-=temp*a[i][k];//Line 3
//a[j][k]-=a[j][i]*a[i][k]/a[i][i];//Line 4
}
}
}
}

void EnterJordan()//converting to reduced row echelon form
{
float temp;
for(int i=n-1;i>=0;i--)
{

for(int j=i-1;j>=0;j--)
{
temp=a[j][i]/a[i][i];
for(int k=n;k>=i;k--)
{
a[j][k]-=temp*a[i][k];
}
}
}

float x[n];
for(int i=0;i<n;i++)//making leading coefficients zero
x[i]=0;
for(int i=0;i<n;i++)
{
for(int j=0;j<n+1;j++)
{
if(x[i]==0&&j!=n)
x[i]=a[i][j];
if(x[i]!=0)
a[i][j]/=x[i];
}
}
}
void credits()
{
for(int i=0;i<n;i++)
{
cout<<"\nx"<<i+1<<" = "<<a[i][n]<<endl;
}
}

};

int main()
{
Gauss obj;
obj.accept();
cout<<"\n\nAugmented matrix: \n\n\n";
obj.display();
obj.gauss();
cout<<"\n\nRow Echelon form: \n\n\n";
obj.display();
obj.EnterJordan();
cout<<"\n\nReduced row echelon form:\n\n\n";
obj.display();
cout<<"\n\nSolution: \n\n\n";
obj.credits();
return 0;
}

Note: My code doesn't take into consideration the problem of division when the pivot is zero (I'm choosing the diagonal element as the pivot every time). For the particular example I tried however, such a case was not encountered.

增广矩阵是:

 2   1  -1    8 
-3 -1 2 -11
-2 1 2 -3

输出矩阵是:

1   0   0    2  
0 1 0 3
0 0 1 -1

解决方案是:

x1 = 2

x2 = 3

x3 = -1

使用第 4 行,输出矩阵为:

1   0   0    -0.75  
0 1 -0 8
0 0 1 -1.5

解决方案是:

x1 = -0.75

x2 = 8

x3 = -1.5

最佳答案

您的第 4 行多次从 a[j][i] 读取,并且第一次通过内部循环,当 k == i 时,更改 a[j][i] 到 0.0f,从而打破下一个 n-i 迭代。

通过对同一位置的写入重新排序变量的读取是不安全的。

关于c++ - C++ 中的 Gauss-Jordan 消去法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32427590/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com