数值分析中的QR分解及其代码实现

QR分解

ACm×k 是一个列满秩的矩阵,rank(A) = k,则矩阵A 可以分解为 A=QR ,

QCm×k ,Q 的列向量为A 的列空间的标准正交基, RCk×k ,是一个可逆的上三角矩阵,

A 的列向量线性无关, A=(α1,α2,...αk) ,将这k个列向量进行Schmidt正交化,得到A 的列向量空间的标准正交基,

正交化: β1=α1

β2=α2(α2,β1)(β1,β1)β1

βk=αkk1i=1(αk,βi)(βi,βi)βi

标准化: ϵi=βiβi

把正交化方法和标准化方法结合在一起:
β1=α1 , ϵ1=β1β1

β2=α2(α2,ϵ1) , ϵ2=β2β2

…..

βn=αnn1i=1(αn,ϵi)ϵi , ϵn=βnβn

得到 Q(ϵ1,ϵ2...ϵk) ,由 A=QR 可知, R=Q1A=QTA ,得到R 矩阵为上三角矩阵,对角线主元素 rii=βi>0 ,正定矩阵,

当 A 为普通矩阵时, A=QR , 为QR分解;

ACn×n 为可逆方阵时, A=UR ,为UR分解。

QR方法是求一般矩阵全部特征值的最有效并广泛应用的方法之一,在应用中,先把一般的矩阵经过正交相似变换化成上Hessenberg矩阵(拟上三角矩阵),再应用QR方法求其特征值和特征向量。

Householder矩阵

Householder矩阵为反射变换或镜像变换的变换矩阵,将向量x映射为关于“与单位向量u正交的n-1维子空间”对称的向量y的镜像变换定义如下:

y=x2u(uTx)=(I2uuT)x=Hx

设单位向量 uRn ,称 H=I2uuT ,为Householder矩阵(初等反射矩阵),

性质:对称矩阵,正交矩阵,对合矩阵,

Hessenberg矩阵

若是矩阵 ARn×n 的次对角线下的元素均为零,即 i >j+1 时, aij=0 ,这样的矩阵称为 Hessenberg矩阵(拟上三角矩阵)

a11a21a12a22a32......a33..a1n1a2n1.....ann1a1na2na3n..ann

对任意矩阵A ,总存在正交阵Q 使得 Q^{-1}A Q 为上Hessenberg 矩阵。Householder矩阵即为这样的一个正交矩阵。

Givens矩阵

一般的,在n维空间 Rn 中,令 e1,e2,....en 为标准正交基,于是在平面 [ei,ej] 中的旋转变换定义如下:

Ti,j=1....1cs1....1sc1....1

其中c , s 满足 c2+s2=1 ,行数分别为i , j ,也可记为 Ti,j=Ti,j(c,s) ,由Givens矩阵确定的线性变换称为Givens变换(初等旋转变换)。存在角度 θ ,使得 c=cosθs=sinθ

任何n阶实非奇异矩阵 A=ai,j 可通过左连乘 Givens 矩阵化为上三角矩阵 TA=Y ;Y 为上三角矩阵

QR分解求特征值和特征向量的工程实现方法:

1)通过正交相似变换将矩阵A 化为Hessenberg矩阵 B ,其变换矩阵可用Householder矩阵H ,H矩阵均为对称正交矩阵。

A(2)=H1AH1 , A(3)=H2A(2)H2 …… A(n1)=Hn2...H2H1AH1A2...Hn2

保持A 序列变换为相似变换,所以右乘 Hi ,之所以采用Householder矩阵变换而不采用Givens矩阵,是因为可以减少运算次数。

P=H1H2...Hn2 ,所以有 A(n1)=PTAP , 因而 A(n1) 与A 相似。

A(n1) 为上Hessenberg 矩阵,记为矩阵 B ,

2)将上Hessenberg 矩阵B 进行QR 分解,运用 Givens 旋转变换方法将矩阵变换为上三角矩阵 R ,Givens矩阵 Ti,j 连乘即为标准正交矩阵 Q , 令 B1=B=Q1R1 ,QR分解得到 : B1=Q1R1

让上式右端逆序相乘,矩阵相乘令:B_2 = R_1 Q_1 ,

又对B_2 ,进行QR分解,得: B_3 = Q_2 R_2 ,

反复进行这种迭代运算,得到一个矩阵序列{ B_k },

由QR分解 B_k = Q_k R_k , 得到 R_k = Q_k^{T} B_k

又由矩阵相乘 B_{k+1} = R_k Q_k , 得到 B_{k+1} = Q_k^{T} B_k Q_k k = 1,2, …
因而 Bk+1 Bk 相似,所有的矩阵 Bk 都与矩阵 B 相似,因而也与原矩阵A 相似,它们都有相同的特征值。在迭代过程中,迭代序列 Bk 收敛与上三角矩阵,上三角矩阵的主对角线元素就是矩阵 A 的特征值,矩阵 Q 即为特征值对应的特征向量。

matlab实现QR分解代码如下:

1.构造Householder正交相似变换矩阵

function H = househ(x)
%功能:对于向量x,构造Householder变换矩阵H,
%     使得Hx = (*, 0, 0,......, 0)',其中|*|=norm(x, 2)
%输入:列向量x
%输出:Householder变换矩阵H
 n = length(x);               % x为矩阵A的对角线下部的列向量 x = A(k+1: n, k)
 I = eye(n);
 sn = sign(x(1));            %判断x向量第一个元素的符号
 if(sn == 0)
     sn=1;
 end
 z = x(2:n);
 if(norm(z,inf) == 0)
     H = I;
     return;
 end
 sigma = -sn*norm(x);                 %  sigma = -sign(x1) ||x||inf
 u = x;
 u(1) = u(1)-sigma;                 %u1 = u1 -sigma* 1; u向量中第一个元素值
 lo = sigma*(sigma-x(1));          %lo 为转换比例因子,防止计算过程中的溢出和误差累积
 H = I-u*u'/lo;

u(1) 为 x(1) 与 norm(x) 即向量 x 的范数之间的差值,最终得到Householder变换矩阵;

2.得到上Hessenberg矩阵

function A = hessen(A)
%功能:用Householder变换化矩阵A为上Hessenberg型
%输入:n阶实方阵A
%输出:A的Hessenberg型
[n, n] =size(A);
for k =1: n-2
    x = A(k+1: n, k);  % x 取为矩阵A 每列对角线下的元素组成的向量
    H =househ(x);      % 得到其Householder变换矩阵,
    A(k+1:n, k:n) = H*A(k+1:n, k:n);     
    A(1:n, k+1:n) = A(1:n, k+1:n)*H;  % A^(n-1) = HAH,经过 n-2次的变换,矩阵A变为Hessen矩阵
end

3.基于Givens旋转变换的QR分解

function A = qrtran(m, A)
%功能:对A的左上角的m阶对角块做QR变换;
%      先用Givens变换作QR分解 A=QR,再做相似变换A:= Q'AQ = RQ
%输入:n阶Hessenberg型矩阵A,其中A(m+1,m) = 0, m>2
%输出:变换后的Hessenberg型矩阵A
Q = eye(m);
for i =1:m-1
    xi = A(i, i);
    xk = A(i+1, i);
    if(xk ~=0)
        d = sqrt(xi^2 +xk^2);
        c = xi/d;
        s = xk/d;
        J = [c s; -s c];
        A(i:i+1, i:m) = J*A(i:i+1, i:m);  
% J为每次的2阶Givens矩阵,J*A的两行矩阵,得到上三角矩阵R的两行
        Q(1:m, i:i+1) = Q(1:m, i:i+1)*J';  
%将所有的Givens矩阵连乘起来,得到正交单位矩阵Q
    end
end
A(1:m, 1:m) = A(1:m, 1:m)*Q;  
% A(n+1) = R(n)*Q(n),矩阵相乘得到下一个迭代矩阵A

正定矩阵

广义定义:设M是n阶方阵,如果对任何非零向量z,都有 zTMz>0 ,其中 zT 表示 z 的转置,就称M为正定矩阵。

狭义定义:一个n阶的实对称矩阵M是正定的的条件是当且仅当对于所有的非零实系数向量 z ,都有 zTMz > 0。其中 zT 表示 z 的转置。

等价命题 :

对于n阶实对称矩阵A,下列条件是等价的:

(1)A是正定矩阵;

(2)A的一切顺序主子式均为正;

(3)A的一切主子式均为正;

(4)A的特征值均为正;

(5)存在实可逆矩阵C,使 A=CTC

(6)存在秩为n的m×n实矩阵B,使 A=BTB

(7)存在主对角线元素全为正的实三角矩阵R,使 A=RTR

猜你喜欢

转载自blog.csdn.net/chenaiyanmie/article/details/80071051