qq_25569597 2015-01-25 02:59 采纳率: 0%
浏览 1804

数值分析作业,jacobi法,为什么我的特征向量是算错的,特征值却对了,怎么改正?

以下是vc6里的代码算法在图里,求大神,qq:136620990求帮助

#include
#include
#include
#include
#define n 4
#define e 0.000001
void main()
{
int i,j,p,q,cj=0,k;
float a[n][n],sum=0.0,s,max,t,t1,t2,c,d,v[n],L[n][n],L1[n][n],L2[n][n];
a[0][0]=19.94;a[0][1]=10.50;a[0][2]=6.59;a[0][3]=8.63;
a[1][0]=10.50;a[1][1]=23.56;a[1][2]=19.71;a[1][3]=7.97;
a[2][0]=6.59;a[2][1]=19.71;a[2][2]=20.95;a[2][3]=3.93;
a[3][0]=8.63;a[3][1]=7.97;a[3][2]=3.93;a[3][3]=7.55;

for(i=0;i {
for(j=0;j {
if(j==i)
{
L[i][j]=1;
}
else
{
L[i][j]=0;
}
}
}
memcpy(L2,L,sizeof(L2));//复制数组
memcpy(L1,L,sizeof(L1));
cout for(i=0;i {
for(j=0;j {
cout }
cout }
sum=0.0;
for(i=0;i {
for(j=0;j {
if(i!=j)
{
sum=sum+a[i][j]*a[i][j];
}
}
}
while(sum>e)
{
max=fabs(a[0][1]);p=0;q=1;
for(i=0;i {
for(j=0;j {
if(i!=j)
{
if(max {
max=fabs(a[i][j]);
p=i;q=j;
}
}
}
}
s=(a[q][q]-a[p][p])/(a[p][q]*2.0);
if(s==0) { t=1;}
else{
t1=-s-sqrt(s*s+1);
t2=-s+sqrt(s*s+1);
if(fabs(t1)>fabs(t2)) {t=t2;}
else {t=t1;}
}
c=1.0/sqrt(1+t*t);
d=t/sqrt(1+t*t);
for(i=0;i<n;i++)
{
if(i!=p && i!=q)
{
a[i][p]=c*a[p][i]-d*a[q][i];
a[i][q]=c*a[q][i]+d*a[p][i];
a[q][i]=a[i][q];
a[p][i]=a[i][p];
}
}
a[p][p]=a[p][p]-t*a[p][q];
a[q][q]=a[q][q]+t*a[p][q];
a[p][q]=0;
a[q][p]=0;
sum=0.0;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(i!=j)
{
sum=sum+a[i][j]*a[i][j];
}
}
}
L2[p][p]=c;
L2[q][q]=c;
L2[p][q]=d;
L2[q][p]=-d;
//L=L1*L2;
//L1=L;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
L[i][j]=0;
for(k=0;k<n;k++)
{
L[i][j]=L[i][j]+L1[i][k]*L2[k][j];
}
}
}
memcpy(L1,L,sizeof(L1));
}
/*cout<<"矩阵为:\n";
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(10)<<L[i][j]<<"\t";
}
cout<<endl;
} */
cout<<"矩阵B为:\n";
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(10)<<a[i][j]<<"\t"; //setw(w) 读写w个字符的值
}
cout<<endl;
}
cout<<"特征值为:\n";
for(i=0;i<n;i++)
{
v[i]=a[i][i];
cout<<v[i]<<setw(10);
}
cout<<endl;

for (i = 0; i < n; i++) {
double cur = 0;
for (j = 0; j < n; j++) {
cur += pow(L[j][i], 2);
}
cur = sqrt(cur);
for (j = 0; j < n; j++)
L[j][i] /= cur;
}

cout<<"特征向量为:\n";
for(i=0;i<n;i++)
{ cout<<"(";
for(j=0;j<n;j++)
{
cout<<setw(10)<<L[j][i];
}
cout<<" )T";
cout<<endl;
}
}


图片说明](https://img-ask.csdn.net/upload/201501/25/1422154608_880286.png)图片说明](https://img-ask.csdn.net/upload/201501/25/1422154593_203848.png)

  • 写回答

1条回答 默认 最新

  • qq_25569597 2015-01-25 03:02
    关注

    图片说明

    评论

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置