我需要求行列式的值,我现在用的方法是清华大学出版社的徐士良主编的《C常用算法程序集》中的全选主元高斯消去法(bsdet())求行列式的值。这个方法在阶数大于6或7后算法就不稳定,计算出的结果为0。
现高分求一稳定的行列式值的计算方法,要求在高阶(10阶以上)情况下算法稳定,望高手们不吝赐教。多谢了!

解决方案 »

  1.   

    我搜的,你看看能不能用
    #include <stdio.h>
    #include <time.h>void main()
    {long now,before;
    int b,p,d,i,n,q,t,w;
    float a[500][500],e[500],k,num,v;
    char *strnow;
    n=1;
    printf("\t\t\t★☆行列式计算程序☆★\n\n");
        
        while (n==1)
      { 
    w=0;d=1;num=1;n=1;
    time(&now);
    before=now;
    strnow=ctime(&now);printf("请选择(1,2):  1.自行输入元素  2.计算连续自然数行列式:");
    scanf("%d",&n);   
    switch (n)
    {
    case 1:
    {  
       printf("\n请输入行列式的阶数:");
       scanf("%d",&n);   for (p=1;p<=n;p++)
       {
              for (i=1;i<=n;i++)
      {
            printf("请输入第%d行第%d个元素\t",p,i);
            scanf("%f",&a[p][i]);
      }
       }
       break;
    }
        case 2:
    {
       printf("\n请输入n(n<500): ");
       scanf("%d",&n);   for (i=0;i<=n;i++)
       {
       for (p=1;p<=n;p++)
       {
     a[i][p]=(float)(n*(p-1)+i);
       }
       }
    }
    }
    printf("\t正在对行列式进行计算!\n");
    for (p=1;p<=n;p++)
    {
    for (i=1;i<=n;i++)
    {
    if (i==1)
    {
    printf("\n\t\t┃\t");
    }
       printf("%2.2f ",a[p][i]);if (i==n)
    {printf("\t┃");}
    }
        }
    if (a[1][1]==0)
    {
    for (i=2;i<=n;i++)
    {
    if (a[i][1]!=0)
    {
    for (t=1;t<=n;t++)
    {
    e[t]=a[1][t];
    a[1][t]=a[i][t];
    a[i][t]=e[t];
    }
    w=1;
    break;
    }}
       if (w!=1)
    {
    d=0;
    }

           printf("\n");    for (b=1;b<=n-1;b++)
    {  
         if (a[b][b]==0)
    {
    for (i=b+1;i<=n;i++)
    {
    if (a[i][b]!=0)
    {
    for (t=b;t<=n;t++)
    {
    e[t]=a[b][t];
    a[b][t]=a[i][t];
    a[i][t]=e[t];
    }
    w++;
    break;
    }}
       
    }for (p=b+1;p<=n;p++)
       {   
       if (a[b][b]!=0)
       {
       k=a[p][b]/a[b][b];
           for (i=b;i<=n;i++)
       {
              a[p][i]=a[p][i]-a[b][i]*k;
      
       }
       }
       }  
       q=100*(b+1)/n;
       printf("─────────────已经完成%d%%────────────\r",q);   for (p=1;p<=n;p++)
       {
      for (i=1;i<=n;i++)
      {
    if (i==1)
    {}
             
      }
       }
    }
        printf("\n最后主对角线上的元素分别为:\n");for (p=1;p<=n;p++)
    {
    printf("a%d%d=%f\t",p,p,a[p][p]);
    //fprintf(fp,"a%d%d=%f\t",p,p,a[p][p]);
    num=a[p][p]*num;
    }if (w%2==0){v=1;}
    else {v=-1;}
     printf("\n请选择(1,2)  1.继续  2.退出: ");
    scanf("%d",&n);
      
      }
     
    }
      

  2.   

    高阶时,若行列式中有几个很大的数,则返回0
    8,9阶时返回值常为零。原版拷贝的程序。
    程序很难读a[]中存放行列式,n为行列式的阶数
    double bsdet(double a[],int n)
    {
    int i,j,k,is,js,l,u,v;
        double f,det,q,d;
        f=1.0; det=1.0;
        for (k=0; k<=n-2; k++)
          { q=0.0;
            for (i=k; i<=n-1; i++)
            for (j=k; j<=n-1; j++)
              { l=i*n+j; d=fabs(a[l]);
        if (d>q) { q=d; is=i; js=j;}
              }
            if (q+1.0==1.0)
              { det=0.0; 
    return(det);}
            if (is!=k)
              { f=-f;
                for (j=k; j<=n-1; j++)
                  { u=k*n+j; v=is*n+j;
                    d=a[u]; a[u]=a[v]; a[v]=d;
                  }
              }
            if (js!=k)
              { f=-f;
                for (i=k; i<=n-1; i++)
                  { u=i*n+js; v=i*n+k;
                    d=a[u]; a[u]=a[v]; a[v]=d;
                  }
              }
            l=k*n+k;
            det=det*a[l];
            for (i=k+1; i<=n-1; i++)
              { d=a[i*n+k]/a[l];
                for (j=k+1; j<=n-1; j++)
                  { u=i*n+j;
                    a[u]=a[u]-d*a[k*n+j];
                  }
              }
          }
        det=f*det*a[n*n-1];
        return(det);
    }
      

  3.   

    运行结果计算a1的行列式值为0出错代码如下:
    #include "stdio.h"
    #include "math.h"double bsdet(double a[],int n);int main(int argc, char* argv[])
    {
    double a1[] = {1, 0, 0, 0, 0, 2e7, 0,
       0, 1, 1.1e7, 0, 0, 0, 0,
       0, 0, 1, 0, 0, 0, 0,
       0, 0, 0, 1, 0, 0, 0,
       0 ,0 ,0, 0, 1, 0, 1.2e6,
       0, 0, 0, 0 ,0, 1, 0,
       0, 0, 0, 0, 0, 0, 1};

    double b1[] = {11, 2, 31, 41, 5, 6,
       7, 81, 9, 10, 111, 12,
       13, 133, 14, 15, 16, 171,
       18, 19, 201, 21, 22, 23,
       24 ,25 ,261, 27, 28, 29,
       30, 31, 321, 33 ,34, 35
       }; double d1[] = {11, 2, 31, 41, 5, 234, 125,456,4576,
       0, 81, 9, 10, 111, 23541452,346,4567,456,
       0, 0, 14, 15, 164, 171,32234546,25,23675,
       0, 0, 0, 21, 232, 23,6,25,23,
       0 ,0 ,0, 0, 28, 2925,457,3564,25678,
       0, 0, 0, 0 ,0, 35,23,379,257,
       0, 0, 0, 0, 0, 0, 1, 3454,243,
       0, 0, 0, 0, 0, 0, 0, 1, 23466,
       0, 0, 0, 0, 0, 0, 0, 0, 1
       }; double c1[] ={1, 2, 3, 4,
      2, 3, 4, 5,
      7, 8, 8, 9,
      10, 9, 8, 6};
    double d = bsdet(a1, 7);
    printf("det(A)=%13.7e\n", d); d = bsdet(b1, 6);
    printf("det(B)=%13.7e\n", d); printf("det(c)=%13.7e\n", bsdet(c1, 4));
    printf("det(d)=%13.7e\n", bsdet(d1, 9));
    return 0;
    }double bsdet(double a[],int n)
    {
    int i,j,k,is,js,l,u,v;
        double f,det,q,d;
        f=1.0; det=1.0;    for (k=0; k<=n-2; k++)
    {
    q=0.0;
            for (i=k; i<=n-1; i++)
    {
    for (j=k; j<=n-1; j++)
    {
    l=i*n+j;
    d=fabs(a[l]);
    if (d>q)
    {
    q=d;
    is=i;
    js=j;
    }
    }
    }
            //if (q+1.0==1.0)
    if (fabs(q)<1.0e-7)
    {
    det=0.0; 
    return(det);
    }
            if (is!=k)
    {
    f=-f;
                for (j=k; j<=n-1; j++)
    {
    u=k*n+j;
    v=is*n+j;
                    d=a[u];
    a[u]=a[v];
    a[v]=d;
    }
    }
            if (js!=k)
    {
    f=-f;
                for (i=k; i<=n-1; i++)
    {
    u=i*n+js;
    v=i*n+k;
                    d=a[u];
    a[u]=a[v];
    a[v]=d;
    }
    }
            l=k*n+k;
            det=det*a[l];
            for (i=k+1; i<=n-1; i++)
    {
    d=a[i*n+k]/a[l];
                for (j=k+1; j<=n-1; j++)
    {
    u=i*n+j;
                    a[u]=a[u]-d*a[k*n+j];
    }
    }
    }    det=f*det*a[n*n-1];
        return(det);
    }
      

  4.   

    建议使用matlab现成的工具,一个函数完事!