24小时热门版块排行榜    

查看: 259  |  回复: 1

sleefd

新虫 (初入文坛)

[求助] 求讲解一下,下面jacobi算法代码的具体实现思路

int jcb(double a[][200],double tzz[200],double v[][200],double eps,int jt,int rows)
  
//jacobi求实对称矩阵的特征值和特征向量
//a 为原矩阵,v为特征向量,tzz为特征值,eps为精度,jt为最大迭代次数
{
        int i,j,p,q,l;
        double fm,cn,sn,omega,x,y,d;
//        double temp;
        l=1;       
        for(i=0;i         {
                v=1.0;
                for(j=0;j                         if(i!=j) v[j]=0;
        }
        while(true)
        {               
                fm=0.0;
                for(i=0;i<=rows-1;i++)
                        for(j=0;j<=i-1;j++)
                        {
                                d=fabs(a[j]);
                                if((i!=j)&&(d>fm))   //取最大的a[p][q]
                                {
                                        fm=d;p=i;q=j;}
                        }
            if(fm                 {  
                       
                        for(i=0;i                         {
                       tzz=a;
                       //printf("%lf \n",a);
                        }
                        return(1);
                        break;
                }
                if(l>jt) //如果不能求解
                {
                        for(i=0;i                         {
                       tzz=a;
                       //printf("%lf \n",a);
                        }
                        return(-1);
                    break;
                }               
                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=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]=y*omega+a[p][q]*(2*cn*cn-1);
                a[q][p]=a[p][q];
                for(j=0;j<=rows-1;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<=rows-1;i++)
                        if((i!=p)&&(i!=q))
                        {
                                fm=a[p];
                                a[p]=fm*cn+a[q]*sn;
                                a[q]=-fm*sn+a[q]*cn;
                        }
                for(i=0;i<=rows-1;i++)
                {
                        fm=v[p];
                        v[p]=fm*cn+v[q]*sn;
                        v[q]=-fm*sn+v[q]*cn;
                               
                }
        }
}
回复此楼

» 猜你喜欢

» 本主题相关价值贴推荐,对您同样有帮助:

已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sleefd

新虫 (初入文坛)

我感觉好像是松弛迭代的写法。
但是我不知道那个omega是什么意思,是怎么估计的
还有正弦,余弦的作用。
求前辈们指点一下。
2楼2012-05-22 17:56:10
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 sleefd 的主题更新
信息提示
请填处理意见