爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5739|回复: 0

[源程序] matlab对古典Jaccobi方法计算实对称矩阵A的特征值和向量

[复制链接]

新浪微博达人勋

发表于 2013-7-29 11:41:56 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
转自:http://user.qzone.qq.com/4556816 ... &pos=1267440804


函数如下:

function [V,D,iter]=eigcj(A,tol,itermax)

% 古典Jaccobi方法计算实对称矩阵A的特征值和向量

% (eigen value and vector of classical Jaccobi algorithm)

%

% 参数说明

% A:实对称矩阵

% tol:精度,非对角元素平方和

% itermax:最大迭代次数

% V:特征值

% D:特征向量

% iter:实际迭代次数

%

% 实例说明

% A=[-12 3 3;3 1 -2;3 -2 7];

% [V,D,iter]=eigcj(A,1e-10,20)

% [V2,D2]=eig(A) % 使用MATLAB自带eig函数进行验证

%

% 基础知识

% 1、对于实对称矩阵A,古典雅克比算法必定收敛矩阵的全部特征根

% 2、实对称矩阵的特征值均为实数,且存在标准正交的特征向量系

% 3、对任意实对称矩阵A,总存在正交矩阵Q,使得QAQ'=diag(λ1,λ2,...)

%    λ为A的特征根,Q各列对应其特征向量

% 4、设A为实对称矩阵,Q为正交矩阵,则||A||=||QA||=||AQ||=||QAQ'||=特征根平方和

%    其中||X||表示X的F范数

%

% 算法说明

% 0、赋初值H=I,A0=A

% 1、选非对角线主元素|a(p,q)|=max(|a(i,j)|)

% 2、构造Givens矩阵R

% 3、对主元素a(p,q)进行Givens变换

% 3.1 更新H=R*H

% 3.2 更新A=H*A0*H'

% 4、计算SA,矩阵A的非对角元素平方和

% 5、SA是否到达指定精度,是否达到最大迭代次数

% 6、否,继续循环;是,退出

%

% 参考资料

% 封建湖《数值分析原理》.2005年7月.科学出版社.Page238-243

%

[m,n]=size(A);

H=eye(m,n);

A0=A;

SA=sum(A(:).^2)-sum(diag(A).^2);

iter=0;

while SA>tol && iter<itermax

    iter=iter+1;

    % 选主元素a(p,q)

    T=triu(A,1);

    [tmp,idx]=max(abs(T(:)));

    % 计算Givens矩阵中的cos,sin值

    [p,q]=ind2sub([m,n],idx);

    % 计算非对角元素平方和SA

    SA=SA-2*A(p,q).^2;

    if A(p,p)==A(q,q)

        cos=sqrt(2)/2;

        sin=sign(A(p,q))*cos;

    else

        d=(A(p,p)-A(q,q))/(2*A(p,q));

        tan=sign(d)/(abs(d)+sqrt(d^2+1));

        cos=1/sqrt(1+tan^2);

        sin=tan*cos;

    end

    % 计算Givens矩阵

    R=eye(m,n);

    R(p,p)=cos;

    R(p,q)=sin;

    R(q,p)=-sin;

    R(q,q)=cos;

    % 更新H矩阵

    H=R*H;

    % 更新A矩阵

    A=H*A0*H';

end

V=diag(A); % 特征根

D=H'; % 特征向量





调用主程序如下:
clc;
clear;
A=[-12 3 3;3 1 -2;3 -2 7];
[V,D,iter]=eigcj(A,1e-10,20)
[V2,D2]=eig(A) % 使用MATLAB自带eig函数进行验证





运算结果如下:


V =

  -13.2202
    1.3913
    7.8289


D =

    0.9602    0.2566    0.1107
   -0.2257    0.9456   -0.2342
   -0.1648    0.1999    0.9659


iter =

     6


V2 =

    0.9602    0.2566    0.1107
   -0.2257    0.9456   -0.2342
   -0.1648    0.1999    0.9659


D2 =

  -13.2202         0         0
         0    1.3913         0
         0         0    7.8289

密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表