首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++中的Gauss消除

C++中的Gauss消除
EN

Stack Overflow用户
提问于 2015-09-06 19:44:51
回答 1查看 11.1K关注 0票数 6

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

代码语言:javascript
复制
#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;
}

注意:当枢轴为零时,我的代码没有考虑除法问题(每次我都选择对角线元素作为枢轴)。然而,就我所尝试的具体例子而言,没有遇到这样的情况。

增广矩阵是:

代码语言:javascript
复制
 2   1  -1    8 
-3  -1   2   -11    
-2   1   2   -3

输出矩阵是:

代码语言:javascript
复制
1   0   0    2  
0   1   0    3  
0   0   1    -1 

解决办法是:

代码语言:javascript
复制
x1 = 2

x2 = 3

x3 = -1

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

代码语言:javascript
复制
1   0   0    -0.75  
0   1   -0   8  
0   0   1    -1.5   

解决办法是:

代码语言:javascript
复制
x1 = -0.75

x2 = 8

x3 = -1.5
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-06 19:55:58

您的第4行多次从a[j][i]读取,第一次通过内部循环(当k == i时)将a[j][i]更改为0.0f,从而中断了下一个n-i迭代。

对具有写入相同位置的变量的重新排序读取是不安全的。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32427590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档