实验7Jacobi法求实对称矩阵全部特征值Word文档格式.docx
《实验7Jacobi法求实对称矩阵全部特征值Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验7Jacobi法求实对称矩阵全部特征值Word文档格式.docx(8页珍藏版)》请在冰点文库上搜索。
1
上机实践时间:
一、目的
1.通过本实验加深对Jacobi法的构造过程的理解;
2.能对Jacobi法提出正确的算法描述编程实现,得到计算结果。
二、内容与设计思想
自选方阵,用Jacobi法求其全部特征值及其特征向量。
可使用实例:
三、使用环境
操作系统:
WindowsXP
软件环境:
MicrosoftVisualC++
四、核心代码及调试过程
#include<
stdio.h>
math.h>
voidmain()
{
floata[10][10],t[10][10],s[10][10],s1[10][10],Q[10][10],q1[10][10],lam[10];
floata1,c,s2,t1,amax,eps=0.001,d=0,r=1;
inti,j,n,p,q,m,N=100,k=1;
printf("
矩阵a的维数为:
\nn="
);
scanf("
%d"
&
n);
\n输入矩阵a:
\n"
for(i=1;
i<
n+1;
i++)
j=1;
while(j<
n+1)
a%d%d="
i,j);
%f"
a[i][j]);
j++;
}
for(j=1;
j<
j++)
if(j==i)
Q[i][j]=1;
//将初始Q[i][j]置为单位矩阵
else
Q[i][j]=0;
while(r>
=eps&
&
k<
=N)
p=1;
q=1;
amax=0;
if((j!
=i)&
fabs(a[i][j])>
amax)
amax=fabs(a[i][j]);
//找非对角元素绝对值最大的元
p=i;
q=j;
r=amax;
//重置当前误差
a1=(a[q][q]-a[p][p])/(2*a[p][q]);
if(a1>
=0)
t1=1/(fabs(a1)+sqrt(1+a1*a1));
t1=-1/(fabs(a1)+sqrt(1+a1*a1));
c=1/sqrt(1+t1*t1);
s2=t1*c;
s[i][j]=1;
s[i][j]=0;
s[p][p]=c;
s[p][q]=s2;
s[q][p]=-s2;
s[q][q]=c;
s1[i][j]=s[j][i];
//将矩阵s1[i][j]化为s[i][j]的转置
for(m=1;
m<
m++)
d=d+s1[i][m]*a[m][j];
//计算s1[i][j]*a[i][j]
t[i][j]=d;
d=0;
d=d+t[i][m]*s[m][j];
//计算t[i][j]*s[i][j]
a[i][j]=d;
d=d+Q[i][m]*s[m][j];
//计算Q[i][j]*s[i][j]
q1[i][j]=d;
Q[i][j]=q1[i][j];
//将矩阵q1[i][j]还原为q[i][j]
第%d次平面旋转矩阵s为:
k);
%10.7f"
s[i][j]);
第%d次矩阵a为:
a[i][j]);
k=k+1;
if(k>
N)
不收敛!
lam[i]=a[i][i];
矩阵a的特征值为:
lam[i]);
\n相应的特征向量为:
Q[i][j]);
运算结果:
矩阵的特征值为:
λ1=0.5601
λ2=-1.3077
λ3=17.7475
矩阵的特征向量为:
V1=[0.8938
-0.4223
0.1505]T
V2=[0.3978
0.5921
-0.7007]T
V3=[0.2068
0.6862
0.6973]T
五、总结
本次试验利用C语言实现了用Jacobi法求矩阵全部特征值及其特征向量,通过本实验加深了对Jacobi法的构造过程的理解,对c语言在计算方法中的应用有了进一步的掌握。
六、附录
参考:
《数值计算方法与算法》(第二版)