public class MatrixEigenValue {
public static int Hessenberg(double[][] Matrix,int n,double[][]ret)
{
int i;
int j;
int k;
double temp;
int MaxNu;
n-=1;
for(k=1;k<=n-1;k++)
{
i=k-1;
MaxNu=k;
temp=Math.abs(Matrix[k][i]);
for(j=k+1;j<=n;j++)
{
if(Math.abs(Matrix[j][i])>temp)
{
MaxNu=j;
}
}
ret[0][0]=Matrix[MaxNu][i];
i=MaxNu;
if(ret[0][0]!=0)
{
if(i!=k)
{
for(j=k-1;j<=n;j++)
{
temp=Matrix[i][j];
Matrix[i][j]=Matrix[k][j];
Matrix[k][j]=temp;
}
for(j=0;j<=n;j++)
{
temp=Matrix[j][i];
Matrix[j][i]=Matrix[j][k];
Matrix[j][k]=temp;
}
}
for(i=k+1;i<=n;i++)
{
temp=Matrix[i][k-1]/ret[0][0];
Matrix[i][k-1]=0;
for(j=k;j<=n;j++)
{
Matrix[i][j]-=temp*Matrix[k][j];
}
for(j=0;j<=n;j++)
{
Matrix[j][k]+=temp*Matrix[j][i];
}
}
}
}
for(i=0;i<=n;i++)
{
for(j=0;j<=n;j++)
{
ret[i][j]=Matrix[i][j];
}
}
return n+1;
}
////////////
public static boolean EigenValue(double[][]Matrix,int n,int LoopNu,int Erro,double[][]Ret)
{
int i=Matrix.length;
if(i!=n)
{
return false;
}
int j;
int k;
int t;
int m;
double[][]A=new double[n][n];
double erro=Math.pow(0.1, Erro);
double b;
double c;
double d;
double g;
double xy;
double p;
double q;
double r;
double x;
double s;
double e;
double f;
double z;
double y;
int loop1=LoopNu;
Hessenberg(Matrix,n,A);//将方阵K1转化成上Hessenberg矩阵A
m=n;
while(m!=0)
{
t=m-1;
while(t>0)
{
if(Math.abs(A[t][t-1])>erro*(Math.abs(A[t-1][t-1])+Math.abs(A[t][t])))
{
t-=1;
}
else
{
break;
}
}
if(t==m-1)
{
Ret[m-1][0]=A[m-1][m-1];
Ret[m-1][1]=0;
m-=1;
loop1=LoopNu;
}
else if(t==m-2)
{
b=-(A[m-1][m-1]+A[m-2][m-2]);
c=A[m-1][m-1]*A[m-2][m-2]-A[m-1][m-2]*A[m-2][m-1];
d=b*b-4*c;
y=Math.pow(Math.abs(d), 0.5);
if(d>0)
{
xy=1;
if(b<0)
{
xy=-1;
}
Ret[m-1][0]=-(b+xy*y)/2;
Ret[m-1][1]=0;
Ret[m-2][0]=c/Ret[m-1][0];
Ret[m-2][1]=0;
}
else
{
Ret[m-1][0]=-b/2;
Ret[m-2][0]=Ret[m-1][0];
Ret[m-1][1]=y/2;
Ret[m-2][1]=-Ret[m-1][1];
}
m-=2;
loop1=LoopNu;
}
else
{
if(loop1<1)
{
return false;
}
loop1-=1;
j=t+2;
while(j<m)
{
A[j][j-2]=0;
j+=1;
}
j=t+3;
while(j<m)
{
A[j][j-3]=0;
j+=1;
}
k=t;
while(k<m-1)
{
if(k!=t)
{
p=A[k][k-1];
q=A[k+1][k-1];
if(k!=m-2)
{
r=A[k+2][k-1];
}
else
{
r=0;
}
}
else
{
b=A[m-1][m-1];
c=A[m-2][m-2];
x=b+c;
y=c*b-A[m-2][m-1]*A[m-1][m-2];
p=A[t][t]*(A[t][t]-x)+A[t][t+1]*A[t+1][t]+y;
q=A[t+1][t]*(A[t][t]+A[t+1][t+1]-x);
r=A[t+1][t]*A[t+2][t+1];
}
if(p!=0||q!=0||r!=0)
{
if(p<0)
{
xy=-1;
}
else
{
xy=1;
}
s=xy*Math.pow(p*p+q*q+r*r, 0.5);
if(k!=t)
{
A[k][k-1]=-s;
}
e=-q/s;
f=-r/s;
x=-p/s;
y=-x-f*r/(p+s);
g=e*r/(p+s);
z=-x-e*q/(p+s);
for(j=k;j<=m-1;j++)
{
b=A[k][j];
c=A[k+1][j];
p=x*b+e*c;
q=e*b+y*c;
r=f*b+g*c;
if(k!=m-2)
{
b=A[k+2][j];
p+=f*b;
q+=g*b;
r+=z*b;
A[k+2][j]=r;
}
A[k+1][j]=q;
A[k][j]=p;
}
j=k+3;
if(j>=m-1)
{
j=m-1;
}
for(i=t;i<=j;i++)
{
b=A[i][k];
c=A[i][k+1];
p=x*b+e*c;
q=e*b+y*c;
r=f*b+g*c;
if(k!=m-2)
{
b=A[i][k+2];
p+=f*b;
q+=g*b;
r+=z*b;
A[i][k+2]=r;
}
A[i][k+1]=q;
A[i][k]=p;
}
}
k+=1;
}
}
}
return true;
}
public static void main(String[]args)//测试
{
double[][] TestMatrix = {
{1, 22, 34,22},
{1, 11,5,21} ,
{0,1,5,11},
{7,2,13,19}};
double[][] TMatrix1={
{1,2,3},{2,1,1},{2,2,2}
};
double[][]TMatrix2={
{1,2},{2,3}
};
double[][] GetEV=new double[3][2];
EigenValue(TMatrix2,2,400,4,GetEV);
String Strr=new String("");
for(int i=0;i<2;i++)
{
String str=String.valueOf(GetEV[i][0]);//
Strr+=str;
Strr+=" ";
String str1=String.valueOf(GetEV[i][1]);
Strr+=str1;
Strr+="\n";
}
System.out.println(Strr);
}
}
运行结果如下: