|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?我要加入
x
- #include<iostream.h>
- #include<math.h>
- #include "Matrix.h"
- void Eig(int n,Matrix a,Matrix &v,Matrix &r)
- //n is the dimension of square matrix a;
- //a is the matrix be dealed;
- //v is the arrray for returning eigenvalues
- //r is the matrix for returning eigenvectors(columns)
- {
- //preparing
- int i,j;
- Matrix b(n,n);
- Matrix s(n,n);
- //yacobi method
- int p,q,I=1;
- double v0=0,n1,eps=1e-6,n2,c,tt,sine,cosine,temp=0;
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- if(i==j)
- r(i,j)=1;
- else
- r(i,j)=0;
- }
- }
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- if(i!=j)
- temp+=a(i,j)*a(i,j);
- }
- }
- n1=sqrt(temp);
- n2=(eps/n)*n1;
- n1=n1/n;
- while(n1>n2){
- while(I){
- I=0;
- for(i=0;i<n-1;i++){
- for(j=i+1;j<n;j++){
- if(fabs(a(i,j))>=n1){
- I=1;
- c=(a(i,i)-a(j,j))/(2*a(i,j));
- if(c>=0)
- tt=1/(fabs(c)+sqrt(c*c+1));
- else
- tt=(-1)/(fabs(c)+sqrt(c*c+1));
- cosine=1/sqrt(1+tt*tt);
- sine=tt/sqrt(1+tt*tt);
- for(p=0;p<n;p++){
- for(q=0;q<n;q++){
- b(p,q)=a(p,q);
- s(p,q)=r(p,q);
- }
- }
- for(p=0;p<n;p++){
- for(q=0;q<n;q++){
- if(q==i && p!=i && p!=j)
- b(p,i)=b(i,p)=a(p,i)*cosine+a(p,j)*sine;
- if(q==j && p!=i && p!=j)
- b(p,j)=b(j,p)=a(p,j)*cosine-a(p,i)*sine;
- if(q==i)
- s(p,i)=r(p,i)*cosine+r(p,j)*sine;
- if(q==j)
- s(p,j)=r(p,j)*cosine-r(p,i)*sine;
- }
- }
- b(i,i)=a(i,i)*cosine*cosine+a(j,j)*sine*sine+2*a(i,j)*sine*cosine;
- b(j,j)=a(i,i)*sine*sine+a(j,j)*cosine*cosine-2*a(i,j)*sine*cosine;
- b(i,j)=b(j,i)=0;
- for(p=0;p<n;p++){
- for(q=0;q<n;q++){
- a(p,q)=b(p,q);
- r(p,q)=s(p,q);
- }
- }
- }
- }
- }
- }
- n1/=n;
- I=1;
- }
- //get eigenvalues from matrix a and set them to vector v as the output variable
- for(i=0;i<n;i++){
- for(j=0;j<n;j++){
- if(i==j)
- v(i,0)=a(i,j);
- }
- }
- }
复制代码
具体算法是参考浙大版《数值分析》,#include "Matrix.h" 是包含自定义的矩阵类,与matlab对比调试无误!
[ 本帖最后由 风花雪月 于 2007-12-24 11:07 编辑 ] |
评分
-
1
查看全部评分
-
|