高斯消元


高斯消元 - qhn999 - 码代码的猿猿




#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

const double eps=1e-9;

double a[4][5]={{1,-1,-2,-5,10},{-2,7,6,-12,6},{3,-2,-5,-17,31},{-5,-2,9,27,-63}};
double ans[10];
bool l[10];

int solve(double a[][5],bool l[],double ans[],const int &n)
{
    int res=0,r=0;
    for(int i=0;i<n;i++)
    {
        l=false;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=r;j<n;j++)
            if(fabs(a[j])>eps)
            {
                for(int k=i;k<=n;k++)
                         swap(a[j][k],a
[k]);

                break;
            }
        if(fabs(a
)<eps)
        {
             res++; continue;
        }
        for(int j=0;j<n;j++)
            if(j!=r&&fabs(a[j])>eps)
            {
                double tmp=a[j]/a
;
                for(int k=i;k<=n;k++)
                    a[j][k]-=tmp*a
[k];
            }
        l=true; r++;
    }

    for(int i=0;i<n;i++)
    {
        if(l)
            for(int j=0;j<n;j++)
            if(fabs(a[j])>eps)
               ans=a[j][n]/a[j];
    }

    return res;
}

int main()
{
    cout<<solve(a,l,ans,4)<<endl;

    for(int i=0;i<4;i++,putchar(10))
        for(int j=0;j<5;j++)
        {
           if(fabs(a[j])<eps) a[j]=0;
           cout<<a[j]<<" ";
        }

    for(int i=0;i<4;i++,putchar(10))
        cout<<"x"<<i<<"  "<<ans;

    return 0;
}


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>

using namespace std;

const double eps=1e-8;

void gauss(double a[][101],double ans[],const int n)
{
    int r=0;
    for(int i=0;i<n;i++)
    {
        for(int j=r;j<n;j++)
        {
            if(fabs(a[j])>eps)
            {
                for(int k=i;k<=n;k++)
                {
                    swap(a[j][k],a
[k]);
                }
                break;
            }
        }
        if(fabs(a
)<eps) continue;
        for(int j=0;j<n;j++)
        {
            if(j!=r&&fabs(a[j])>eps)
            {
                double tmp=a[j]/a
;
                for(int k=i;k<=n;k++)
                {
                    a[j][k]-=tmp*a
[k];
                }
            }
        }
        r++;
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
           if(fabs(a[j])>eps)
           {
               ans=a[j][n]/a[j];
               if(fabs(ans)<eps)
                  ans=0;
           }
    }
}

int main()
{
    int n;double a[103][101],ans[101];
    cin>>n;
    for(int i=0;i<n;i++)
        for(int j=0;j<=n;j++)
          cin>>a[j];
    gauss(a,ans,n);

    for(int i=0;i<n;i++,putchar(10))
        cout<<i<<" : "<<ans;

    return 0;
}

/*
3
2 1 -1 8
-3 -1 2 -11
-2 1 2 -3
*/

* This source code was highlighted by YcdoiT. ( style: Default )
原文地址:https://www.cnblogs.com/CKboss/p/3350921.html