⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cjcbi_5.cpp

📁 Jacobi法求取特征值的C程序. 试验验证过了。
💻 CPP
字号:
//求实对称矩阵特征值与特征向量的雅可比法

  #include "math.h"
  #include "stdio.h"
  #include "conio.h"
  int cjcbi(double a[],int n,double v[],double eps,int jt);  
  main()
  { int i,j;
    double eps;
    static double v[5][5];
    static double a[5][5]={ {10.0,1.0,2.0,3.0,4.0},
                            {1.0,9.0,-1.0,2.0,-3.0},
                            {2.0,-1.0,7.0,3.0,-5.0},
                            {3.0,2.0,3.0,12.0,-1.0},
                            {4.0,-3.0,-5.0,-1.0,15.0}};
    eps=0.000001;
    i=cjcbi(*a,5,*v,eps,1000);
    if (i>0)
      { for (i=0; i<=4; i++)
          printf("%13.7e  ",a[i][i]);
        printf("\n\n");
        for (i=0; i<=4; i++)
          { for (j=0; j<=4; j++)
              printf("%13.7e  ",v[i][j]);
            printf("\n");
          }
        printf("\n");
      }
   getch( );
  }
  
//求实对称矩阵特征值与特征向量的雅可比法
  int cjcbi(double a[],int n,double v[],double eps,int jt)
  { int i,j,p,q,u,w,t,s,l;
    double fm,cn,sn,omega,x,y,d;
    l=1;
    for (i=0; i<=n-1; i++)
      { v[i*n+i]=1.0;
        for (j=0; j<=n-1; j++)
          if (i!=j) v[i*n+j]=0.0;
      }
    while (1==1)
      { fm=0.0;
        for (i=1; i<=n-1; i++)
        for (j=0; j<=i-1; j++)
          { d=fabs(a[i*n+j]);
            if ((i!=j)&&(d>fm))
              { fm=d; p=i; q=j;}
          }
        if (fm<eps)  return(1);
        if (l>jt)  return(-1);
        l=l+1;
        u=p*n+q; w=p*n+p; t=q*n+p; s=q*n+q;
        x=-a[u]; y=(a[s]-a[w])/2.0;
        omega=x/sqrt(x*x+y*y);
        if (y<0.0) omega=-omega;
        sn=1.0+sqrt(1.0-omega*omega);
        sn=omega/sqrt(2.0*sn);
        cn=sqrt(1.0-sn*sn);
        fm=a[w];
        a[w]=fm*cn*cn+a[s]*sn*sn+a[u]*omega;
        a[s]=fm*sn*sn+a[s]*cn*cn-a[u]*omega;
        a[u]=0.0; a[t]=0.0;
        for (j=0; j<=n-1; j++)
        if ((j!=p)&&(j!=q))
          { u=p*n+j; w=q*n+j;
            fm=a[u];
            a[u]=fm*cn+a[w]*sn;
            a[w]=-fm*sn+a[w]*cn;
          }
        for (i=0; i<=n-1; i++)
          if ((i!=p)&&(i!=q))
            { u=i*n+p; w=i*n+q;
              fm=a[u];
              a[u]=fm*cn+a[w]*sn;
              a[w]=-fm*sn+a[w]*cn;
            }
        for (i=0; i<=n-1; i++)
          { u=i*n+p; w=i*n+q;
            fm=v[u];
            v[u]=fm*cn+v[w]*sn;
            v[w]=-fm*sn+v[w]*cn;
          }
      }
    return(1);
  }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -