|
JACOBI法严格意义上讲是线性代数理论在数值分析中特征值特征向量计算里的一个应用,不完全是线性代数的问题。
你的附件里提到的是基本理论,实际计算根本不需要用什么优化算法去求该θ值,有其自己的计算方式,所以我说你看书只看了一半,或者没有自己查阅资料了解问题全貌就匆忙发问!
由于无论是多少阶的矩阵,其每次迭代的变换旋转矩阵中只有两行不同,所以是一个关于tanθ的二次方程,由jacobi法的收敛性可以证明进行一系列旋转变换最终理论上趋近于一个对角阵,该对角阵的主对角线上元素即为特征值,根据该计算方法,我简单写如下程序:
- function JacobiSolveLambda(A,t)
- % A必须为一个对称矩阵
- % t:迭代终止控制误差
- clc
- count=0;
- A1=triu(A,1);
- T1=triu(A,1)+tril(A,-1);
- T=norm(T1(:));
- while T>t
- A2=abs(A1);
- A2=A2(:);
- maxA2=max(A2);
- A2=reshape(A2,size(A,1),size(A,2));
- [i1,j1]=find(A2==maxA2);
- if length(i1)>1
- i1=i1(1);j1=j1(1);
- end
- d=(A(i1,i1)-A(j1,j1))/(2*A(i1,j1));
- if d>=0
- sd=1;
- else
- sd=-1;
- end
- tt=sd/(abs(d)+sqrt(d^2+1));
- c=1/sqrt(1+tt^2);
- s=c*tt;
- P=eye(length(A));
- P(i1,i1)=c;
- P(j1,j1)=c;
- P(i1,j1)=s;
- P(j1,i1)=-s;
- P;
- A=P*A*P';
- A1=triu(A,1);
- count=count+1;
- T1=triu(A,1)+tril(A,-1);
- T=norm(T1(:));
- end
- disp('特征值:')
- S=diag(A)
- disp(['迭代次数n=',num2str(count)])
复制代码
command windows中运行:
- A=round(10*rand(4))
- A1=triu(A,1)
- A=diag(diag(A))+A1+A1'
- JacobiSolveLambda(A,1e-2)
- eig(A)
复制代码
可以看出和eig命令得到的结果基本相同。 |
评分
-
1
查看全部评分
-
|