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

📄 特征值特征向量.txt

📁 用雅克比算法求取一个实对称矩阵的特征值和特征向量
💻 TXT
字号:
//实对称阵特征值及特征向量雅可比法
#include <iostream.h>
#include <math.h>

int  main()
{
	cout.precision(2);
	cout.setf(ios::fixed);
	float a[3][3]={
		{2.0,-1.0,0.0},
		{-1.0,2.0,-1.0},
		{0.0,-1.0,2.0}
	};
	float v[3][3];
	float eps=0.001;//精度
    int	jt=10;//迭代次数



    int j, p, q, l(1), stRank;
    float fm,cn,sn,omega,x,y,d;
	
	//if(MatrixSymmetry(a)!=true)	//不是对称阵
	//	return(0);					

//	stRank = a.GetColNum();		// 矩阵阶数
      stRank=3;
    for(int i=0; i<stRank; i++)
    {
		v[i][i]=1.0;
        for(j=0; j<stRank; j++)
          if(i!=j) v[i][j]=0.0;
    }
    while(1)
    { 
		fm=0.0;
        for(i=1; i<stRank; i++)
        for(j=0; j<i; j++)
        {
			d=fabs(a[i][j]);
            if((i!=j)&&(d>fm))
            {
				fm=d; 
				p=i;
				q=j;
			}
        }
        if(fm<eps)  
		{
			cout<<"特征向量为:"<<endl;
			for(int st=0; st<stRank; st++)
			{
        for(int tt=0; tt<stRank; tt++)
		{cout<<v[st][tt]<<"       ";
         //cout<<a[st][tt]<<"   ";
		}
		cout<<endl;
		
			}
			cout<<endl;
			cout<<"对角线为三个特征值:"<<endl;
			for(int s1t=0; s1t<stRank; s1t++)
			{
        for(int t1t=0; t1t<stRank; t1t++)
		{
         cout<<a[s1t][t1t]<<"   ";
		}
		cout<<endl;
			}
			return 1;
		}
        if(l>jt)  return(-1);
        l=l+1;
        x=-a[p][q];
		y=(a[q][q]-a[p][p])/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=float (sqrt(1.0-sn*sn));
        fm=a[p][p];
        a[p][p]=fm*cn*cn+a[q][q]*sn*sn+a[p][q]*omega;
        a[q][q]=fm*sn*sn+a[q][q]*cn*cn-a[p][q]*omega;
        a[p][q]=0.0; 
		a[q][p]=0.0;
        for(j=0; j<stRank; j++)
        if((j!=p)&&(j!=q))
        {
            fm=a[p][j];
            a[p][j]=fm*cn+a[q][j]*sn;
            a[q][j]=-fm*sn+a[q][j]*cn;
        }
        for(i=0; i<stRank; i++)
          if((i!=p)&&(i!=q))
          { 
              fm=a[i][p];
              a[i][p]=fm*cn+a[i][q]*sn;
              a[i][q]=-fm*sn+a[i][q]*cn;
          }
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
        for(i=0; i<stRank; i++)
        {
            fm=v[i][p];
            v[i][p]=fm*cn+v[i][q]*sn;
            v[i][q]=-fm*sn+v[i][q]*cn;
        }
    }
	
}

⌨️ 快捷键说明

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