实验7Jacobi法求实对称矩阵全部特征值.docx
《实验7Jacobi法求实对称矩阵全部特征值.docx》由会员分享,可在线阅读,更多相关《实验7Jacobi法求实对称矩阵全部特征值.docx(8页珍藏版)》请在冰豆网上搜索。
![实验7Jacobi法求实对称矩阵全部特征值.docx](https://file1.bdocx.com/fileroot1/2023-2/25/7568b79b-54ae-4534-85c5-2b2e3f82d9a1/7568b79b-54ae-4534-85c5-2b2e3f82d9a11.gif)
实验7Jacobi法求实对称矩阵全部特征值
西华数学与计算机学院上机实践报告
课程名称:
计算方法A
年级:
上机实践成绩:
指导教师:
严常龙
姓名:
上机实践名称:
Jacobi法求实对称矩阵特征值
学号:
上机实践日期:
上机实践编号:
1
上机实践时间:
一、目的
1.通过本实验加深对Jacobi法的构造过程的理解;
2.能对Jacobi法提出正确的算法描述编程实现,得到计算结果。
Jacobi法求实对称矩阵特征值
二、内容与设计思想
自选方阵,用Jacobi法求其全部特征值及其特征向量。
可使用实例:
三、使用环境
操作系统:
WindowsXP
软件环境:
MicrosoftVisualC++
四、核心代码及调试过程
#include
#include
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);
printf("\n输入矩阵a:
\n");
for(i=1;i{
j=1;
while(j{
printf("a%d%d=",i,j);
scanf("%f",&a[i][j]);
j++;
}
}
for(i=1;i{
for(j=1;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;
for(i=1;i{
for(j=1;j{
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));
else
t1=-1/(fabs(a1)+sqrt(1+a1*a1));
c=1/sqrt(1+t1*t1);
s2=t1*c;
for(i=1;i{
for(j=1;j{
if(j==i)
s[i][j]=1;
else
s[i][j]=0;
}
}
s[p][p]=c;s[p][q]=s2;
s[q][p]=-s2;s[q][q]=c;
for(i=1;i{
for(j=1;j{
s1[i][j]=s[j][i];//将矩阵s1[i][j]化为s[i][j]的转置
}
}
for(i=1;i{
for(j=1;j{
for(m=1;md=d+s1[i][m]*a[m][j];//计算s1[i][j]*a[i][j]
t[i][j]=d;
d=0;
}
}
for(i=1;i{
for(j=1;j{
for(m=1;md=d+t[i][m]*s[m][j];//计算t[i][j]*s[i][j]
a[i][j]=d;
d=0;
}
}
for(i=1;i{
for(j=1;j{
for(m=1;md=d+Q[i][m]*s[m][j];//计算Q[i][j]*s[i][j]
q1[i][j]=d;
d=0;
}
}
for(i=1;i{
for(j=1;j{
Q[i][j]=q1[i][j];//将矩阵q1[i][j]还原为q[i][j]
}
}
printf("第%d次平面旋转矩阵s为:
\n",k);
for(i=1;i{
for(j=1;jprintf("%10.7f",s[i][j]);
printf("\n");
}
printf("第%d次矩阵a为:
\n",k);
for(i=1;i{
for(j=1;jprintf("%10.7f",a[i][j]);
printf("\n");
}
k=k+1;
}
if(k>N)
printf("不收敛!
\n");
else
for(i=1;ilam[i]=a[i][i];
printf("矩阵a的特征值为:
\n");
for(i=1;iprintf("%10.7f",lam[i]);
printf("\n相应的特征向量为:
\n");
for(i=1;i{
for(j=1;jprintf("%10.7f",Q[i][j]);
printf("\n");
}
}
运算结果:
矩阵的特征值为:
λ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语言在计算方法中的应用有了进一步的掌握。
六、附录
参考:
《数值计算方法与算法》(第二版)