1. 程式人生 > >高斯消元,全主元素法,C語言實現

高斯消元,全主元素法,C語言實現

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
double A[1010][1010];
double B[1010];
double X[1010];
int sx[1010];
void rowswap(int x,int y,int n)
{
    for(int i=1;i<=n;i++)
    {
        swap(A[x][i],A[y][i]);
    }
    swap(B[x],B[y]);
}
void colswap(int x,int y,int n)
{
    for(int i=1;i<=n;i++)
    {
        swap(A[i][x],A[i][y]);
    }
    swap(sx[x],sx[y]);
}
void init()
{
    for(int i=1;i<=1001;i++)
    {
        sx[i]=i;
    }
}
void qmax(int x,int n)
{
    double rowm,colm;
    int rowpos,colpos;
    rowm=colm=A[x][x];
    rowpos=colpos=x;
    for(int i=x+1;i<=n;i++)
    {
        if(abs(rowm)<abs(A[i][x]))
        {
            rowm=A[i][x];
            rowpos=i;
        }
        if(abs(colm)<abs(A[x][i]))
        {
            colm=A[x][i];
            colpos=i;
        }
    }
    if(abs(rowm)>abs(colm))
        rowswap(x,rowpos,n);
    else
        colswap(x,colpos,n);
}
int main()
{
    int n;
    double tmp;
    printf("請輸入係數矩陣的階數:\n");
    while(~scanf("%d",&n))
    {
        init();
        printf("請輸入係數矩陣,行元素以空格隔開,列之間用回車隔開;\n");
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                scanf("%lf",&A[i][j]);
            }
        }
        printf("請輸入B向量:\n");
        for(int i=1;i<=n;i++)
        {
            scanf("%lf",&B[i]);
        }
        for(int i=1;i<n;i++)
        {
            qmax(i,n);
            for(int j=i+1;j<=n;j++)
            {
                tmp=A[j][i]/A[i][i];
                for(int k=i;k<=n;k++)
                {
                    A[j][k]-=tmp*A[i][k];
                }
                B[j]-=tmp*B[i];
            }
        }
        for(int i=n;i>=1;i--)
        {
            for(int j=n;j>i;j--)
            {
                B[i]-=A[i][j]*X[j];
            }
            X[i]=B[i]/A[i][i];
        }
        for(int i=1;i<=n;i++)
        {
            printf("%.4f\n",X[sx[i]]);
        }
    }
    return 0;
}