经典Jacobi方法求解对称矩阵特征值(MATLAB描述)2007年07月04日 星期三 13:29下面是m文件Jacobi1.m的代码,以经典Jacobi的的方法计算特征值
function D=Jacobi1(A,epsilon)
% -本函数使用经典Jacobi方法来计算一个对称矩阵的特征值
% -A 是一个 n*n 矩阵的形参,由用户输入
% -epsilon 是允许误差,由用户输入,用来控制第k次的Givens矩阵的F范数
% -D是经过一些列的迭代后满足允许误差的矩阵的对角元素
i=1;
D=A;
[n,n]=size(A);
flag=1; %设定标志位
E=abs(D-diag(diag(D))); %E是第n次迭代以后矩阵除去对角元的矩阵
[m1,p]=max(E); %寻找矩阵E中最大元
[m2,q]=max(m1);
p=p(q);
if p==q %处理矩阵本身就是一个对角阵的特殊情况
D=diag(D);
else
while(flag==1)
y=abs(D(q,q)-D(p,p));
if y==0 %处理D(p,p)=D(q,q)的特殊情况
x=2*D(p,q);
c=sin(pi/4);
s=sign(x)*c;
else
x=sign(D(p,p)-D(q,q))*2*D(p,q);
c=sqrt((1+y/(sqrt(x^2+y^2)))/2);
s=x/(2*c*(sqrt(x^2+y^2)));
end
G=eye(n);
G(p,p)=c; %利用cos和sin的值来构造Givens变换阵
G(q,q)=c;
G(p,q)=s;
G(q,p)=-s;
D=G*D;
D=D*G';
E=abs(D-diag(diag(D)));
[m1 p]=max(abs(D-diag(diag(D))));
[m2 q]=max(m1);
p=p(q);
k(i)=i;
temp=sqrt(sum(sum(E.^2)));
r(i)=temp;
i=i+1;
if(temp<epsilon)
flag=0;
end
end
D=diag(D);
end
plot(k,r);
- 1
- 2
前往页