使用总旋转编程高斯消除(在c中)

时间:2014-05-23 09:00:51

标签: c math gaussian

我使用矩阵nxn的总旋转来编程高斯消除,但是当我解决系统时,它出现了很多错误(如果解决方案是5.23,它会写我4.88,因为例)。数字是近似的,但不正确。我认为错误在高斯消除代码中,而不是在系统的解决方案中(向后和向前替换)。无论如何,我会发布它,也许我错了,错误在那里:

void eliminaciogaussianapivotatgetotal(int n, double a[][max], double m[][max], double p[][max], double q[][max])
{
    int i,j,k,c,f;
    double l,t,auxi;
    for(k=0;k<(n-1);k++)
    {
            f=k;
            c=k;
            for (i=k;i<n;i++)
            {
                for (j=k;j<n;j++)
                {
                    if (fabs(a[i][j])>a[f][c])
                    {
                        f=i;
                        c=j;
                    }
                }
            }
        printf("%d,%d\n",f,c);
            for (j=0;j<n;j++) //Canvia la fila de la matriu introduïda
            {
                l=0.;
                l=a[k][j];
                a[k][j]=a[f][j];
                a[f][j]=l;

            }
            for (j=0;j<n;j++) //Canvia la fila de la matriu P
            {
                t=0;
                t=p[k][j];
                p[k][j]=p[f][j];
                p[f][j]=t;
            }

            for (i=0; i<n; i++)//Canvia la columna de la matriu introduïda
            {
                l=0;
                l=a[i][k];
                a[i][k]=a[i][c];
                a[i][c]=l;
            }
            for (i=0; i<n; i++)//Canvia la columna de la matriu Q
            {
                t=0;
                t=q[i][k];
                q[i][k]=q[i][c];
                q[i][c]=t;
            }
            if (fabs(a[k][k])<=tol)//Algun pivot pel camí és 0.
            {
                printf("____________________________________________________\n");
                printf("ERROR: S'ha trobat un pivot massa petit o 0.\n");
                exit(0);
            }

            for(i=k+1;i<n;i++)
            {
                auxi=0;
                auxi=(a[i][k]/a[k][k]);
                for (j=k; j<n; j++)
                {
                    a[i][j]=a[i][j]-(auxi*a[k][j]);
                }
                m[i][k]=auxi;
            }
        if (k>0)
        {
            for (j=0;j<n;j++) //Canvia la fila de la matriu introduïda
            {
                l=0;
                l=m[k][j];
                m[k][j]=m[f][j];
                m[f][j]=l;
            }
            for (i=0;i<n;i++) //Canvia la fila de la matriu introduïda
            {
                l=0;
                l=m[i][k];
                m[i][k]=m[i][c];
                m[i][c]=l;
            }
        }
    }
//    if(fabs(a[n-1][n-1])<=tol) //El sistema no és CD (no té solució o en té infinites).
//    {
//        printf("____________________________________________________\n");
//        printf("ERROR: La matriu no és invertible => El sistema no té solució única!\n");
//        exit(0);
//    }
}

这里是向前和向前的替代:

void resoluciosistematriangularinferior(int n, double a[][max], double b[], double x[])
{
    int i, j;
    double sum;
    x[0]=b[0]/a[0][0];
    for (i=1; i<n; i++)
    {
        sum=0;
        for(j=0; j<i; j++)
        {
            sum=sum+((a[i][j])*(x[j]));
        }
        x[i]=1/a[i][i]*(b[i]-sum);
    }
}

void resoluciosistematriangularsuperior(int n, double a[][max], double b[], double x[])
{
    int i, j;
    double sum;
    x[n-1]=b[n-1]/a[n-1][n-1];
    for (i=(n-2); i>=0; i--)
    {
        sum=0;
        for(j=i+1; j<n; j++)
        {
            sum=sum+((a[i][j])*(x[j]));
        }
        x[i]=1/a[i][i]*(b[i]-sum);
    }
}

所有矩阵都声明为nameofmatrix [max] [max],其中max是预处理器上的150的定义。谢谢你的帮助,我不知道该怎么做。

0 个答案:

没有答案