1.3.9 特征值问题的QZ分解
函数 qz
格式 [AA,BB,Q,Z,V] = qz(A,B) %A、B为方阵,产生上三角阵AA和BB,正交矩阵Q、Z或其列变换形式,V为特征向量阵。且满足:Q*A*Z= AA 和Q*B*Z = BB。
[AA,BB,Q,Z,V] = qz(A,B,flag) %产生由flag决定的分解结果,flag取值为:'complex':表示复数分解(默认),取值为'real':表示实数分解。
1.3.10 海森伯格形式的分解
如果矩阵H的第一子对角线下元素都是0,则H为海森伯格(Hessenberg)矩阵。如果矩阵是对称矩阵,则它的海森伯格形式是对角三角阵。MATLAB可以通过相似变换将矩阵变换成这种形式。
函数 hess
格式 H = hess(A) %返回矩阵A的海森伯格形式
[P,H] = hess(A) %P为酉矩阵,满足:A = PHP' 且P'P = eye(size(A))。
例1-75
>> A=[-149 -50 -154;537 180 546;-27 -9 -25];
>> [P,H]=hess(A)
P =
1.0000 0 0
0 -0.9987 0.0502
0 0.0502 0.9987
H =
-149.0000 42.2037 -156.3165
-537.6783 152.5511 -554.9272
0 0.0728 2.4489
H的第一子对角元素是H(3,1)=0。
1.4 线性方程的组的求解
我们将线性方程的求解分为两类:一类是方程组求唯一解或求特解,另一类是方程组求无穷解即通解。可以通过系数矩阵的秩来判断:
若系数矩阵的秩r=n(n为方程组中未知变量的个数),则有唯一解;
若系数矩阵的秩r<n,则可能有无穷解;
线性方程组的无穷解 = 对应齐次方程组的通解+非齐次方程组的一个特解;其特解的求法属于解的第一类问题,通解部分属第二类问题。
1.4.1 求线性方程组的唯一解或特解(第一类问题)
这类问题的求法分为两类:一类主要用于解低阶稠密矩阵 —— 直接法;另一类是解大型稀疏矩阵 —— 迭代法。
1.利用矩阵除法求线性方程组的特解(或一个解)
方程:AX=b
解法:X=A\b
例1-76 求方程组 的解。
解:
>>A=[5 6 0 0 0
1 5 6 0 0
0 1 5 6 0
0 0 1 5 6
0 0 0 1 5];
B=[1 0 0 0 1]';
R_A=rank(A) %求秩
X=A\B %求解
运行后结果如下
R_A =
5
X =
2.2662
-1.7218
1.0571
-0.5940
0.3188
这就是方程组的解。
或用函数rref求解:
>> C=[A,B] %由系数矩阵和常数列构成增广矩阵C
>> R=rref(C) %将C化成行最简行
R =
1.0000 0 0 0 0 2.2662
0 1.0000 0 0 0 -1.7218
0 0 1.0000 0 0 1.0571
0 0 0 1.0000 0 -0.5940
0 0 0 0 1.0000 0.3188
则R的最后一列元素就是所求之解。
例1-77 求方程组 的一个特解。
解:
>>A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];
>>B=[1 4 0]';
>>X=A\B %由于系数矩阵不满秩,该解法可能存在误差。
X =[ 0 0 -0.5333 0.6000]’(一个特解近似值)。
若用rref求解,则比较精确:
>> A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];
B=[1 4 0]';
>> C=[A,B]; %构成增广矩阵
>> R=rref(C)
R =
1.0000 0 -1.5000 0.7500 1.2500
0 1.0000 -1.5000 -1.7500 -0.2500
0 0 0 0 0
由此得解向量X=[1.2500 – 0.2500 0 0]’(一个特解)。
2.利用矩阵的LU、QR和cholesky分解求方程组的解
(1)LU分解:
LU分解又称Gauss消去分解,可把任意方阵分解为下三角矩阵的基本变换形式(行交换)和上三角矩阵的乘积。即A=LU,L为下三角阵,U为上三角阵。
则:A*X=b 变成L*U*X=b
所以X=U\(L\b) 这样可以大大提高运算速度。
命令 [L,U]=lu (A)
例1-78 求方程组 的一个特解。
解:
>>A=[4 2 -1;3 -1 2;11 3 0];
>>B=[2 10 8]';
>>D=det(A)
>>[L,U]=lu(A)
>>X=U\(L\B)
显示结果如下:
D =
0
L =
0.3636 -0.5000 1.0000
0.2727 1.0000 0
1.0000 0 0
U =
11.0000 3.0000 0
0 -1.8182 2.0000
0 0 0.0000
Warning: Matrix is close to singular or badly scaled.
Results may be inaccurate. RCOND = 2.018587e-017.
> In D:\Matlab\pujun\lx0720.m at line 4
X =
1.0e+016 *
-0.4053
1.4862
1.3511
说明 结果中的警告是由于系数行列式为零产生的。可以通过A*X验证其正确性。
(2)Cholesky分解
若A为对称正定矩阵,则Cholesky分解可将矩阵A分解成上三角矩阵和其转置的乘积,即: 其中R为上三角阵。
方程 A*X=b 变成
所以
(3)QR分解
对于任何长方矩阵A,都可以进行QR分解,其中Q为正交矩阵,R为上三角矩阵的初等变换形式,即:A=QR
方程 A*X=b 变形成 QRX=b
所以 X=R\(Q\b)
上例中 [Q, R]=qr(A)
X=R\(Q\B)
说明 这三种分解,在求解大型方程组时很有用。其优点是运算速度快、可以节省磁盘空间、节省内存。
1.4.2 求线性齐次方程组的通解
在Matlab中,函数null用来求解零空间,即满足A·X=0的解空间,实际上是求出解空间的一组基(基础解系)。
格式 z = null % z的列向量为方程组的正交规范基,满足 。
% z的列向量是方程AX=0的有理基
例1-79 求解方程组的通解:
解:
>>A=[1 2 2 1;2 1 -2 -2;1 -1 -4 -3];
>>format rat %指定有理式格式输出
>>B=null(A,'r') %求解空间的有理基
运行后显示结果如下:
B =
2 5/3
-2 -4/3
1 0
0 1
或通过行最简行得到基:
>> B=rref(A)
B =
1.0000 0 -2.0000 -1.6667
0 1.0000 2.0000 1.3333
0 0 0 0
即可写出其基础解系(与上面结果一致)。
写出通解:
syms k1 k2
X=k1*B(:,1)+k2*B(:,2) %写出方程组的通解
pretty(X) %让通解表达式更加精美
运行后结果如下:
X =
[ 2*k1+5/3*k2]
[ -2*k1-4/3*k2]
[ k1]
[ k2]
% 下面是其简化形式
[2k1 + 5/3k2 ]
[ ]
[-2k1 - 4/3k2]
[ ]
[ k1 ]
[ ]
[ k2 ]
1.4.3 求非齐次线性方程组的通解
非齐次线性方程组需要先判断方程组是否有解,若有解,再去求通解。
因此,步骤为:
第一步:判断AX=b是否有解,若有解则进行第二步
第二步:求AX=b的一个特解
第三步:求AX=0的通解
第四步:AX=b的通解= AX=0的通解+AX=b的一个特解。
例1-80 求解方程组
解:在Matlab中建立M文件如下:
A=[1 -2 3 -1;3 -1 5 -3;2 1 2 -2];
b=[1 2 3]';
B=[A b];
n=4;
R_A=rank(A)
R_B=rank(B)
format rat
if R_A==R_B&R_A==n %判断有唯一解
X=A\b
elseif R_A==R_B&R_A<n %判断有无穷解
X=A\b %求特解
C=null(A,'r') %求AX=0的基础解系
else X='equition no solve' %判断无解
end
运行后结果显示:
R_A =
2
R_B =
3
X =
equition no solve
说明 该方程组无解
例1-81 求解方程组的通解:
解法一:在Matlab编辑器中建立M文件如下:
A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];
b=[1 4 0]';
B=[A b];
n=4;
R_A=rank(A)
R_B=rank(B)
format rat
if R_A==R_B&R_A==n
X=A\b
elseif R_A==R_B&R_A<n
X=A\b
C=null(A,'r')
else X='Equation has no solves'
end
运行后结果显示为:
R_A =
2
R_B =
2
Warning: Rank deficient, rank = 2 tol = 8.8373e-015.
> In D:\Matlab\pujun\lx0723.m at line 11
X =
0
0
-8/15
3/5
C =
3/2 -3/4
3/2 7/4
1 0
0 1
所以原方程组的通解为X=k1 +k2 +
解法二:用rref求解
A=[1 1 -3 -1;3 -1 -3 4;1 5 -9 -8];
b=[1 4 0]';
B=[A b];
C=rref(B) %求增广矩阵的行最简形,可得最简同解方程组。
运行后结果显示为:
C =
1 0 -3/2 3/4 5/4
0 1 -3/2 -7/4 -1/4
0 0 0 0 0
对应齐次方程组的基础解系为: , 非齐次方程组的特解为: 所以,原方程组的通解为:X=k1 +k2 + 。
1.4.4 线性方程组的LQ解法
函数 symmlq
格式 x = symmlq(A,b) %求线性方程组AX=b的解X。A必须为n阶对称方阵,b为n元列向量。A可以是由afun定义并返回A*X的函数。如果收敛,将显示结果信息;如果收敛失败,将给出警告信息并显示相对残差norm(b-A*x)/norm(b)和计算终止的迭代次数。
symmlq(A,b,tol) %指定误差tol,默认值是1e-6。
symmlq(A,b,tol,maxit) %maxit指定最大迭代次数
symmlq(A,b,tol,maxit,M) %M为用于对称正定矩阵的预处理因子
symmlq(A,b,tol,maxit,M1,M2) %M=M1×M2
symmlq(A,b,tol,maxit,M1,M2,x0) %x0为初始估计值,默认值为0。
[x,flag] = symmlq(A,b,…) %flag的取值为:0表示在指定迭代次数之内按要求精度收敛;1表示在指定迭代次数内不收敛;2表示M为坏条件的预处理因子;3表示两次连续迭代完全相同;4表示标量参数太小或太大;5表示预处理因子不是对称正定的。
[x,flag,relres] = symmlq(A,b,…) % relres表示相对误差norm(b-A*x)/norm(b)
[x,flag,relres,iter] = symmlq(A,b,…) %iter表示计算x的迭代次数
[x,flag,relres,iter,resvec] = symmlq(A,b,…) %resvec表示每次迭代的残差:norm(b-A*x0)
[x,flag,relres,iter,resvec,resveccg] = symmlq(A,b,…) %resveccg表示每次迭代共轭梯度残差的范数
1.4.5 双共轭梯度法解方程组
函数 bicg
格式 x = bicg(A,b) %求线性方程组AX=b的解X。A必须为n阶方阵,b为n元列向量。A可以是由afun定义并返回A*X的函数。如果收敛,将显示结果信息;如果收敛失败,将给出警告信息并显示相对残差norm(b-A*x)/norm(b)和计算终止的迭代次数。
bicg(A,b,tol) %指定误差tol,默认值是1e-6。
bicg(A,b,tol,maxit) %maxit指定最大迭代次数
bicg(A,b,tol,maxit,M) %M为用于对称正定矩阵的预处理因子
bicg(A,b,tol,maxit,M1,M2) %M=M1×M2
bicg(A,b,tol,maxit,M1,M2,x0) %x0为初始估计值,默认值为0。
[x,flag] = bicg(A,b,…) %flag的取值为:0表示在指定迭代次数之内按要求精度收敛;1表示在指定迭代次数内不收敛;2表示M为坏条件的预处理因子;3表示两次连续迭代完全相同;4表示标量参数太小或太大。
[x,flag,relres] = bicg(A,b,…) % relres表示相对误差norm(b-A*x)/norm(b)
[x,flag,relres,iter] = bicg(A,b,…) %iter表示计算x的迭代次数
[x,flag,relres,iter,resvec] = bicg(A,b,…) %resvec表示每次迭代的残差:norm(b-A*x0)
例1-83 调用MATLAB6.0数据文件west0479。
>> load west0479
>> A=west0479; %将数据取为系数矩阵A。
>> b=sum (A,2); %将A的各行求和,构成一列向量。
>> X=A\b; %用“\”求AX=b的解。
>> norm(b-A*X)/norm(b) %计算解的相对误差。
ans =
1.2454e-017
>> [x,flag,relres,iter,resvec] = bicg(A,b) %用bicg函数求解。
x = (全为0,由于太长,不显示出来)
flag =
1 %表示在默认迭代次数(20次)内不收敛。
relres = %相对残差relres = norm(b-A*x)/norm(b) =norm(b)/norm(b) = 1。
1
iter = %表明解法不当,使得初始估计值0向量比后来所有迭代值都好。
0
resvec = (略) %每次迭代的残差。
>> semilogy(0:20,resvec/norm(b),'-o') %作每次迭代的相对残差图形,结果如下图。
>> xlabel('iteration number') %x轴为迭代次数。
>> ylabel('relative residual') %y轴为相对残差。
图1-1 双共轭梯度法相对误差图
1.4.6 稳定双共轭梯度方法解方程组
函数 bicgstab
格式 x =bicgstab(A,b)
bicgstab(A,b,tol)
bicgstab(A,b,tol,maxit)
bicgstab(A,b,tol,maxit,M)
bicgstab(A,b,tol,maxit,M1,M2)
bicgstab(A,b,tol,maxit,M1,M2,x0)
[x,flag] = bicgstab(A,b,…)
[x,flag,relres] = bicgstab(A,b,…)
[x,flag,relres,iter] = bicgstab(A,b,…)
[x,flag,relres,iter,resvec] = bicgstab(A,b,…)
稳定双共轭梯度法解方程组,调用方式和返回的结果形式和命令bicg一样。
例1-84
>>load west0479;
>>A=west0479;
>>b=sum(A,2);
>>[x,flag]=bicgstab(A,b)
显示结果是x的值全为0,flag=1。表示在默认误差和默认迭代次数(20次)下不收敛。
若改为:
>>[L1,U1] = luinc(A,1e-5);
>>[x1,flag1] = bicgstab(A,b,1e-6,20,L1,U1)
即指定误差,并用A的不完全LU分解因子L和U作为预处理因子M=L*U,其结果是x1的值全为0,flag=2表示预处理因子为坏条件的预处理因子。
若改为
>>[L2,U2]=luinc(A,1e-6); %稀疏矩阵的不完全LU分解。
>>[x2,flag2,relres2,iter2,resvec2]=bicgstab(A,b,1e-15,10,L2,U2)
%指定最大迭代次数为10次,预处理因子M=L*U。
>>semilogy(0:0.5:iter2,resvec2/norm(b),'-o') %每次迭代的相对残差图形,见图1-2。
图1-2 稳定双共轭梯度方法的相对误差图 |
>>xlabel('iteration number')
>>ylabel('relative residual')
结果为
x2=(其值全为1,略)
flag2 =
0 %表示收敛
relres2 =
2.8534e-016 %收敛时的相对误差
iter2 =
6 %计算终止时的迭代次数
resvec2 = %每次迭代的残差
1.4.7 复共轭梯度平方法解方程组
函数 cgs
格式 x = cgs(A,b)
cgs(A,b,tol)
cgs(A,b,tol,maxit)
cgs(A,b,tol,maxit,M)
cgs(A,b,tol,maxit,M1,M2)
cgs(A,b,tol,maxit,M1,M2,x0)
[x,flag] = cgs(A,b,…)
[x,flag,relres] = cgs(A,b,…)
[x,flag,relres,iter] = cgs(A,b,…)
[x,flag,relres,iter,resvec] = cgs(A,b,…)
调用方式和返回的结果形式与命令bicg一样。
1.4.8 共轭梯度的LSQR方法
函数 lsqr
格式 x = lsqr(A,b)
lsqr(A,b,tol)
lsqr(A,b,tol,maxit)
lsqr(A,b,tol,maxit,M)
lsqr(A,b,tol,maxit,M1,M2)
lsqr(A,b,tol,maxit,M1,M2,x0)
[x,flag] = lsqr(A,b,…)
[x,flag,relres] = lsqr(A,b,…)
[x,flag,relres,iter] = lsqr(A,b,…)
[x,flag,relres,iter,resvec] = lsqr(A,b,…)
调用方式和返回的结果形式与命令bicg一样。
例1-85
>>n = 100;
>>on = ones(n,1);
>>A = spdiags([-2*on 4*on -on],-1:1,n,n); %产生一个对角矩阵
>>b = sum(A,2);
>>tol = 1e-8; %指定精度
>>maxit = 15; %指定最大迭代次数
>>M1 = spdiags([on/(-2) on],-1:0,n,n);
>>M2 = spdiags([4*on -on],0:1,n,n); %M1*M2=M,即产生预处理因子
>>[x,flag,relres,iter,resvec] = lsqr(A,b,tol,maxit,M1,M2,[])
结果显示
x的值全为1
flag =
0 %表示收敛
relres =
3.5241e-009 %表示相对残差
iter =
12 %计算终止时的迭代次数
1.4.9 广义最小残差法
函数 qmres
格式 x = gmres(A,b)
gmres(A,b,restart)
gmres(A,b,restart,tol)
gmres(A,b,restart,tol,maxit)
gmres(A,b,restart,tol,maxit,M)
gmres(A,b,restart,tol,maxit,M1,M2)
gmres(A,b,restart,tol,maxit,M1,M2,x0)
[x,flag] = gmres(A,b,…)
[x,flag,relres] = gmres(A,b,…)
[x,flag,relres,iter] = gmres(A,b,…)
[x,flag,relres,iter,resvec] = gmres(A,b,…)
除参数restart(缺省时为系数方阵A的阶数n)可以给出外,调用方式和返回的结果形式与命令bicg一样。
例1-86
>>load west0479;
>>A = west0479;
>>b = sum(A,2);
>>[x,flag] = gmres(A,b,5)
结果显示flag=1,表示在默认精度和默认迭代次数下不收敛。
若最后一行改为
>>[L1,U1] = luinc(A,1e-5);
>>[x1,flag1] = gmres(A,b,5,1e-6,5,L1,U1)
结果flag1=2,说明该方法失败,原因是U1的对角线上有0元素,构成坏条件的预处理因子。
若改为:
[L2,U2] = luinc(A,1e-6);
tol = 1e-15;
[x4,flag4,relres4,iter4,resvec4] = gmres(A,b,4,tol,5,L2,U2)
[x6,flag6,relres6,iter6,resvec6] = gmres(A,b,6,tol,3,L2,U2)
[x8,flag8,relres8,iter8,resvec8] = gmres(A,b,8,tol,3,L2,U2)
结果flag4=0,flag6=0,flag8=0表示参数restart分别取为4,6,8时收敛。
1.4.10 最小残差法解方程组
函数 minres
格式 x = minres(A,b)
minres(A,b,tol)
minres(A,b,tol,maxit)
minres(A,b,tol.maxit,M)
minres(A,b,tol,maxit,M1,M2)
minres(A,b,tol,maxit,M1,M2,x0)
[x,flag] = minres(A,b,…)
[x,flag,relres] = minres(A,b,…)
[x,flag,relres,iter] = minres(A,b,…)
[x,flag,relres,iter,resvec] = minres(A,b,…)
[x,flag,relres,iter,resvec,resveccg] = minres(A,b,…)
这里A为对称矩阵,这种方法是寻找最小残差来求x。调用方式和返回的结果形式与命令bicg一样。
例1-87
>>n = 100; on = ones(n,1);
>>A = spdiags([-2*on 4*on -2*on],-1:1,n,n);
>>b = sum(A,2);
>>tol = 1e-10;
>>maxit = 50;
>>M1 = spdiags(4*on,0,n,n);
>> [x,flag,relres,iter,resvec,resveccg] = minres(A,b,tol,maxit,M1,[],[])
结果显示:
flag =
0
relres =
4.6537e-014
iter =
49
resvec =(略)
resveccg =(略)
1.4.11 预处理共轭梯度方法
函数 pcg
格式 x = pcg(A,b)
pcg(A,b,tol)
pcg(A,b,tol,maxit)
pcg(A,b,tol,maxit,M)
pcg(A,b,tol,maxit,M1,M2)
pcg(A,b,tol,maxit,M1,M2,x0)
pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)
[x,flag] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)
[x,flag,relres] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)
[x,flag,relres,iter] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)
[x,flag,relres,iter,resvec] = pcg(A,b,tol,maxit,M1,M2,x0,p1,p2,…)
调用方式和返回的结果形式与命令bicg一样,这里A为对称正定矩阵。
1.4.12 准最小残差法解方程组
函数 qmr
格式 x = qmr(A,b)
qmr(A,b,tol)
qmr(A,b,tol,maxit)
qmr(A,b,tol,maxit,M)
qmr(A,b,tol,maxit,M1,M2)
qmr(A,b,tol,maxit,M1,M2,x0)
qmr(afun,b,tol,maxit,m1fun,m2fun,x0,p1,p2,…)
[x,flag] = qmr(A,b,…)
[x,flag,relres] = qmr(A,b,…)
[x,flag,relres,iter] = qmr(A,b,…)
[x,flag,relres,iter,resvec] = qmr(A,b,…)
调用方式和返回的结果形式与命令bicg一样,这里A为方阵。
例1-88
>>load west0479;
>>A = west0479;
>>b = sum(A,2);
>>[x,flag] = qmr(A,b)
结果显示flag=1,表示在缺省情况下不收敛
若改为
>>[L1,U1] = luinc(A,1e-5);
>>[x1,flag1] = qmr(A,b,1e-6,20,L1,U1)
结果显示 flag=2,表示是坏条件的预处理因子,不收敛。
若改为
>>[L2,U2] = luinc(A,1e-6);
>>[x2,flag2,relres2,iter2,resvec2] = qmr(A,b,1e-15,10,L2,U2)
>>semilogy(0:iter2,resvec2/norm(b),'-o') %每次迭代的相对残差图形
>>xlabel('iteration number')
>>ylabel('relative residual')
结果为
x=(全为1,略)
flag2 =
0 %表示收敛
relres2 = %表示相对残差
2.8715e-016
iter2 = %计算终止时的迭代次数
8
resvec2 = %每次迭代的残差
1.0e+005 *
7.0557
7.1773
3.4032
1.7220
0.0000
0.0000
0.0000
0.0000
0.0000
图1-3 准最小残差法相对误差图
1.5 特征值与二次型
工程技术中的一些问题,如振动问题和稳定性问题,常归结为求一个方阵的特征值和特征向量。
1.5.1 特征值与特征向量的求法
设A为n阶方阵,如果数“ ”和n维列向量x使得关系式 成立,则称 为方阵A的特征值,非零向量x称为A对应于特征值“ ”的特征向量。
详见1.3.5和1.3.6节:特征值分解问题。
例1-89 求矩阵 的特征值和特征向量
解:
>>A=[-2 1 1;0 2 0;-4 1 3];
>>[V,D]=eig(A)
结果显示:
V =
-0.7071 -0.2425 0.3015
0 0 0.9045
-0.7071 -0.9701 0.3015
D =
-1 0 0
0 2 0
0 0 2
即:特征值-1对应特征向量(-0.7071 0 -0.7071)T
特征值2对应特征向量(-0.2425 0 -0.9701)T和(-0.3015 0.9045 -0.3015)T
例1-90 求矩阵 的特征值和特征向量。
解:
>>A=[-1 1 0;-4 3 0;1 0 2];
>>[V,D]=eig(A)
结果显示为
V =
0 0.4082 -0.4082
0 0.8165 -0.8165
1.0000 -0.4082 0.4082
D =
2 0 0
0 1 0
0 0 1
说明 当特征值为1 (二重根)时,对应特征向量都是k (0.4082 0.8165 -0.4082)T,k为任意常数。
1.5.2 提高特征值的计算精度
函数 balance
格式 [T,B] = balance(A) %求相似变换矩阵T和平衡矩阵B,满足 。
B = balance(A) %求平衡矩阵B
1.5.3 复对角矩阵转化为实对角矩阵
函数 cdf2rdf
格式 [V,D] = cdf2rdf (v,d) %将复对角阵d变为实对角阵D,在对角线上,用2×2实数块代替共轭复数对。
例1-91
>> A=[1 2 3;0 4 5;0 -5 4];
>> [v,d]=eig(A)
v =
1.0000 -0.0191 - 0.4002i -0.0191 + 0.4002i
0 0 - 0.6479i 0 + 0.6479i
0 0.6479 0.6479
d =
1.0000 0 0
0 4.0000 + 5.0000i 0
0 0 4.0000 - 5.0000i
>> [V,D]=cdf2rdf(v,d)
V =
1.0000 -0.0191 -0.4002
0 0 -0.6479
0 0.6479 0
D =
1.0000 0 0
0 4.0000 5.0000
0 -5.0000 4.0000
1.5.4 正交基
命令 orth
格式 B=orth(A) %将矩阵A正交规范化,B的列与A的列具有相同的空间,B的列向量是正交向量,且满足:B'*B = eye(rank(A))。
例1-92 将矩阵 正交规范化。
解:
>>A=[4 0 0; 0 3 1; 0 1 3];
>>B=orth(A)
>>Q=B'*B
则显示结果为
P =
1.0000 0 0
0 0.7071 -0.7071
0 0.7071 0.7071
Q =
1.0000 0 0
0 1.0000 0
0 0 1.0000
1.5.5 二次型
例1-93 求一个正交变换X=PY,把二次型
化成标准形。
解:先写出二次型的实对称矩阵
在Matlab编辑器中建立M文件如下:
A=[0 1 1 -1;1 0 -1 1;1 -1 0 1;-1 1 1 0];
[P,D]=schur(A)
syms y1 y2 y3 y4
y=[y1;y2;y3;y4];
X=vpa(P,2)*y %vpa表示可变精度计算,这里取2位精度
f=[y1 y2 y3 y4]*D*y
运行后结果显示如下:
P =
780/989 780/3691 1/2 -390/1351
780/3691 780/989 -1/2 390/1351
780/1351 -780/1351 -1/2 390/1351
0 0 1/2 1170/1351
D =
1 0 0 0
0 1 0 0
0 0 -3 0
0 0 0 1
X =
[ .79*y1+.21*y2+.50*y3-.29*y4]
[ .21*y1+.79*y2-.50*y3+.29*y4]
[ .56*y1-.56*y2-.50*y3+.29*y4]
[ .50*y3+.85*y4]
f =
y1^2+y2^2-3*y3^2+y4^2
即 f =
1.6 秩与线性相关性
1.6.1 矩阵和向量组的秩以及向量组的线性相关性
矩阵A的秩是矩阵A中最高阶非零子式的阶数;向量组的秩通常由该向量组构成的矩阵来计算。
函数 rank
格式 k = rank(A) %返回矩阵A的行(或列)向量中线性无关个数
k = rank(A,tol) %tol为给定误差
例1-94 求向量组 , , , , 的秩,并判断其线性相关性。
>>A=[1 -2 2 3;-2 4 -1 3;-1 2 0 3;0 6 2 3;2 -6 3 4];
>>k=rank(A)
结果为
k =
3
由于秩为3 < 向量个数,因此向量组线性相关。
1.6.2 求行阶梯矩阵及向量组的基
行阶梯使用初等行变换,矩阵的初等行变换有三条:
1.交换两行 (第i、第j两行交换)
2.第i行的K倍
3.第i行的K倍加到第j行上去
通过这三条变换可以将矩阵化成行最简形,从而找出列向量组的一个最大无关组,Matlab将矩阵化成行最简形的命令是rref或rrefmovie。
函数 rref或rrefmovie
格式 R = rref(A) %用高斯—约当消元法和行主元法求A的行最简行矩阵R
[R,jb] = rref(A) %jb是一个向量,其含义为:r = length(jb)为A的秩;A(:, jb)为A的列向量基;jb中元素表示基向量所在的列。
[R,jb] = rref(A,tol) %tol为指定的精度
rrefmovie(A) %给出每一步化简的过程
例1-95 求向量组a1=(1,-2,2,3),a2=(-2,4,-1,3),a3=(-1,2,0,3),a4=(0,6,2,3),a5=(2,-6,3,4)的一个最大无关组。
>> a1=[1 -2 2 3]';
>>a2=[-2 4 -1 3]';
>>a3=[-1 2 0 3]';
>>a4=[0 6 2 3]';
>>a5=[2 -6 3 4]';
A=[a1 a2 a3 a4 a5]
A =
1 -2 -1 0 2
-2 4 2 6 -6
2 -1 0 2 3
3 3 3 3 4
>> [R,jb]=rref(A)
R =
1.0000 0 0.3333 0 1.7778
0 1.0000 0.6667 0 -0.1111
0 0 0 1.0000 -0.3333
0 0 0 0 0
jb =
1 2 4
>> A(:,jb)
ans =
1 -2 0
-2 4 6
2 -1 2
3 3 3
即:a1 a2 a4为向量组的一个基。
1.7 稀疏矩阵技术
1.7.1 稀疏矩阵的创建
函数 sparse
格式 S = sparse(A) %将矩阵A转化为稀疏矩阵形式,即由A的非零元素和下标构成稀疏矩阵S。若A本身为稀疏矩阵,则返回A本身。
S = sparse(m,n) %生成一个m×n的所有元素都是0的稀疏矩阵
S = sparse(i,j,s) %生成一个由长度相同的向量i,j和s定义的稀疏矩阵S,其中i,j是整数向量,定义稀疏矩阵的元素位置(i,j),s是一个标量或与i,j长度相同的向量,表示在(i,j)位置上的元素。
S = sparse(i,j,s,m,n) %生成一个m×n的稀疏矩阵,(i,j)对应位置元素为si,m = max(i)且n =max(j)。
S = sparse(i,j,s,m,n,nzmax) %生成一个m×n的含有nzmax个非零元素的稀疏矩阵S,nzmax的值必须大于或者等于向量i和j的长度。
例1-96
>> S=sparse(1:10,1:10,1:10)
S =
(1,1) 1
(2,2) 2
(3,3) 3
(4,4) 4
(5,5) 5
(6,6) 6
(7,7) 7
(8,8) 8
(9,9) 9
(10,10) 10
>> S=sparse(1:10,1:10,5)
S =
(1,1) 5
(2,2) 5
(3,3) 5
(4,4) 5
(5,5) 5
(6,6) 5
(7,7) 5
(8,8) 5
(9,9) 5
(10,10) 5
1.7.2 将稀疏矩阵转化为满矩阵
函数 full
格式 A=full(S) %S为稀疏矩阵,A为满矩阵。
例1-97
>> S=sparse(1:5,1:5,4:8)
S =
(1,1) 4
(2,2) 5
(3,3) 6
(4,4) 7
(5,5) 8
>> A=full(S)
A =
4 0 0 0 0
0 5 0 0 0
0 0 6 0 0
0 0 0 7 0
0 0 0 0 8
1.7.3 稀疏矩阵非零元素的索引
函数 find
格式 k = find(x) %按行检索X中非零元素的点,若没有非零元素,将返回空矩阵。
[i,j] = find(X) %检索X中非零元素的行标i和列标j
[i,j,v] = find(X) %检索X中非零元素的行标i和列标j以及对应的元素值v
例1-98 上例中
>> [i,j,v]=find(S)
则显示为:
I =[ 1 2 3 4 5]’
j =[ 1 2 3 4 5]’
v =[4 5 6 7 8]’
1.7.4 外部数据转化为稀疏矩阵
函数 spconvert
格式 S=spconvert(D) %D是只有3列或4列的矩阵
说明:先运用load函数把外部数据(.mat文件或.dat文件)装载于MATLAB内存空间中的变量T;T数组的行维为nnz或nnz+1,列维为3(对实数而言)或列维为4(对复数而言);T数组的每一行(以[i,j,Sre,Sim]形式)指定一个稀疏矩阵元素。
例1-99
>> D=[1 2 3;2 5 4;3 4 6;3 6 7]
D =
1 2 3
2 5 4
3 4 6
3 6 7
>> S=spconvert(D)
S =
(1,2) 3
(3,4) 6
(2,5) 4
(3,6) 7
>> D=[1 2 3 4; 2 5 4 0;3 4 6 9;3 6 7 4];
D =
1 2 3 4
2 5 4 0
3 4 6 9
3 6 7 4
>> S=spconvert(D)
S =
(1,2) 3.0000 + 4.0000i
(3,4) 6.0000 + 9.0000i
(2,5) 4.0000
(3,6) 7.0000 + 4.0000i
1.7.5 基本稀疏矩阵
1.带状(对角)稀疏矩阵
函数 spdiags
格式 [B,d] = spdiags(A) %从矩阵A中提取所有非零对角元素,这些元素保存在矩阵B中,向量d表示非零元素的对角线位置。
B = spdiags(A,d) %从A中提取由d指定的对角线元素,并存放在B中。
A = spdiags(B,d,A) %用B中的列替换A中由d指定的对角线元素,输出稀疏矩阵。
A = spdiags(B,d,m,n) %产生一个m×n稀疏矩阵A,其元素是B中的列元素放
在由d指定的对角线位置上。
例1-100
>>A = [11 0 13 0
0 22 0 24
0 0 33 0
41 0 0 44
0 52 0 0
0 0 63 0
0 0 0 74];
>>[B,d] = spdiags(A)
B =
41 11 0
52 22 0
63 33 13
74 44 24
d =
-3 %表示B的第1列元素在A中主对角线下方第3条对角线上
0 %表示B的第2列在A的主对角线上
2 %表示B的第3列在A的主对角线上方第2条对角线上
例1-101
>> B=[1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16];
>> d=[-2 0 1 3];
>> A=spdiags(B,d,4,4);
>> full(A)
ans =
2 7 0 16
0 6 11 0
1 0 10 15
0 5 0 14
2.单位稀疏矩阵
函数 speye
格式 S = speye(m,n) %生成m×n的单位稀疏矩阵
S = speye(n) %生成n×n的单位稀疏矩阵
3.稀疏均匀分布随机矩阵
函数 sprand
格式 R = sprand(S) %生成与S具有相同稀疏结构的均匀分布随机矩阵
R = sprand(m,n,density) %生成一个m×n的服从均匀分布的随机稀疏矩阵,非零元素的分布密度是density。
R = sprand(m,n,density,rc) %生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵。
4.稀疏正态分布随机矩阵
函数 sprandn
格式 R = sprandn(S) %生成与S具有相同稀疏结构的正态分布随机矩阵。
R = sprandn(m,n,density) %生成一个m×n的服从正态分布的随机稀疏矩阵,非零元素的分布密度是density。
R = sprandn(m,n,density,rc) %生成一个近似的条件数为1/rc、大小为m×n的均匀分布的随机稀疏矩阵。
5.稀疏对称随机矩阵
函数 sprandsym
格式 R = sprandsym(S) %生成稀疏对称随机矩阵,其下三角和对角线与S具有相同的结构,其元素服从均值为0、方差为1的标准正态分布。
R = sprandsym(n,density) %生成n×n的稀疏对称随机矩阵,矩阵元素服从正态分布,分布密度为density。
R = sprandsym(n,density,rc) %生成近似条件数为1/rc的稀疏对称随机矩阵
R = sprandsym(n,density,rc,kind) %生成一个正定矩阵,参数kind取值为kind=1表示矩阵由一正定对角矩阵经随机Jacobi旋转得到,其条件数正好为1/rc;kind=2表示矩阵为外积的换位和,其条件数近似等于1/rc;kind=3表示生成一个与矩阵S结构相同的稀疏随机矩阵,条件数近似为1/rc ,density被忽略。
1.7.6 稀疏矩阵的运算
1.稀疏矩阵非零元素的个数
函数 nnz
格式 n = nnz(X) %返回矩阵X中非零元素的个数
2.稀疏矩阵的非零元素
函数 nonzeros
格式 s = nonzeros(A) %返回矩阵A中非零元素按列顺序构成的列向量
例1-102
>>A =[ 2 7 0 16
0 6 11 0
1 0 10 15
0 5 0 14];
>> s=nonzeros(A)
结果为:
s =[ 2 1 7 6 5 11 10 16 15 14]’
3.稀疏矩阵非零元素的内存分配
函数 nzmax
格式 n = nzmax(S) %返回非零元素分配的内存总数n
4.稀疏矩阵的存贮空间
函数 spalloc
格式 S = spalloc(m,n,nzmax) %产生一个m×n阶只有nzmax个非零元素的稀疏矩阵,这样可以有效减少存贮空间和提高运算速度。
5.稀疏矩阵的非零元素应用
函数 spfun
格式 f = spfun('function',S) %用S中非零元素对函数'function'求值,如果'function'不是对稀疏矩阵定义的,同样可以求值。
例1-103 4阶稀疏矩阵对角矩阵
S =
(1,1) 1
(2,2) 2
(3,3) 3
(4,4) 4
f= spfun('exp',S) %即指数e的非零元素方幂。
结果为
f =
(1,1) 2.7183
(2,2) 7.3891
(3,3) 20.0855
(4,4) 54.5982
6.把稀疏矩阵的非零元素全换为1
函数 spones
格式 R = spones(S) %将稀疏矩阵S中的非零元素全换为1
1.7.7 画稀疏矩阵非零元素的分布图形
函数 spy
格式 spy(S) %画出稀疏矩阵S中非零元素的分布图形。S也可以是满矩阵。
spy(S,markersize) % markersize为整数,指定点阵大小。
spy(S,'LineSpec') %'LineSpec'指定绘图标记和颜色
spy(S,'LineSpec',markersize) %参数与上面相同
图1-4 稀疏矩阵非零元素的分布图形 |
例1-104
>> load west0479
>> A=west0479;
>> spy(A,'ro',3)
结果如图1-4所示。
1.7.8 矩阵变换
1.列近似最小度排序
函数 colamd
格式 p = colamd(S) %返回稀疏矩阵S的列的近似最小度排序向量p
2.列最小度排序
函数 colmmd
格式 p = colmmd(S) %返回稀疏矩阵S的列的最小度排序向量p,按p排列后的矩阵为S(: , p)。
例1-105 比较稀疏矩阵S与排序后的矩阵S(: , p)
>> load west0479;
>> S=west0479;
>> p=colmmd(S);
>> subplot(2,2,1),spy(S)
>> subplot(2,2,2),spy(S(:,p))
>> subplot(2,2,3),spy(lu(S))
>> subplot(2,2,4),spy(lu(S(:,p)))
图1-5 稀疏矩阵的排序图
3.非零元素的列变换
函数 colperm
格式 j = colperm(S) %返回一个稀疏矩阵S的列变换的向量。列按非0元素升序排列。有时这是LU分解前有用的变换:LU(S(:,j))。如果S是一个对称矩阵,对行和列进行排序,有利于Cholesky分解:chol(S(j,j))
4.Dulmage-Mendelsohn分解
函数 dmperm
格式 p = dmperm (A) %返回A的行排列向量p,这样,如果A满列秩,就使得A(p,:)是具有非0对角线元素的方阵。
[p,q,r] = dmperm(A) %A为方阵,p为行排列向量,q为列排列向量,使得A(p,q)
是上三角块形式,r为索引向量。
[p,q,r,s] = dmperm(A) %A不是方阵,p,q,r含义与前面相同,s也是索引向量。
例1-106
>> A=[11 0 13 0;41 0 0 44;0 22 0 24;0 0 63 0]
A =
11 0 13 0
41 0 0 44
0 22 0 24
0 0 63 0
>> [p,q,r]=dmperm(A)
p =
3 2 1 4
q =
2 4 1 3
r =
1 2 3 4 5
>> A(p,q)
ans =
22 24 0 0
0 44 41 0
0 0 11 13
0 0 0 63
5.整数的随机排列
函数 randperm
格式 p = randperm (n) %对正整数1,2,3,…,n的随机排列,可以用来创建随机变换矩阵。
例1-107
>> p=randperm(6)
p =
3 4 6 5 1 2
6.稀疏对称近似最小度排列
函数 symamd
格式 p = symamd(S) %S为对称正定矩阵,返回排列向量p。
7.稀疏逆Cuthill-McKee排序
函数 symrcm
格式 r = symrcm (S) %返回S的对称逆Cuthill-McKee排序r,使S的非0元素集中在主对角线附近。
8.稀疏对称最小度排列
函数 symmmd
格式 p = symmmd(S) %返回S的对称最小度排列向量p,S为对称正定矩阵。
例1-108
>> B = bucky+4*speye(60);
>>r = symrcm(B);
>>p = symmmd(B);
>>R = B(r,r);
>>S = B(p,p);
>>subplot(2,2,1), spy(R), title('B(r,r)')
>>subplot(2,2,2), spy(S), title('B(s,s)')
>>subplot(2,2,3), spy(chol(R)), title('chol(B(r,r))')
>>subplot(2,2,4), spy(chol(S)), title('chol(B(s,s))')
图1-6 稀疏对称最小度排列图
1.7.9 稀疏矩阵的近似欧几里得范数和条件数
命令 矩阵A条件数的1-范数估计值
函数 condest
格式 c = condest(A) %计算方阵A的1-范数中条件数的下界值c
[c,v] = condest(A) %方阵A的1-范数中条件数的下界值c和向量v,使得 ,即:
norm(A*v,1) = norm(A,1)*norm(v,1)/c。
命令 2-范数估计值
函数 normest
格式 nrm = normest(S) %返回矩阵S的2-范数的估计值,相对误差为10-6。
nrm = normest(S,tol) %tol为指定的相对误差,而不用默认误差10-6。
[nrm,count] = normest(…) %count为给出的计算范数迭代的次数
其条件数的计算与前面1.2.12相同。
1.7.10 稀疏矩阵的分解
命令 不完全的LU分解
函数 luinc
格式 [L,U] = luinc(X,'0') %X为稀疏方阵;L为下三角矩阵的置换形式;U为上三角矩阵;'0'是一种分解标准。
[L,U,P] = luinc(X,'0') %L为下三角阵,其主对角线元素为1;U为上三角阵,p为单位矩阵的置换形式。
[L,U] = luinc(X,options) %options取值为:droptol表示指定的舍入误差;milu表示改变分解以便于从上三角分解因子中抽取被去掉的列元素。ugiag为1表示用droptol值代替上三角因子中的对角线上的零元素,默认值为0。thresh为中心临界值。
[L,U] = luinc(X,droptol) %droptol表示指定不完全分解的舍入误差
[L,U,P] = luinc(X,options)
[L,U,P] = luinc(X,droptol)
例1-109
>> S=[11 0 13 0;41 0 0 44;0 22 0 24;0 0 63 0]
S =
11 0 13 0
41 0 0 44
0 22 0 24
0 0 63 0
>> S=sparse(S)
S =
(1,1) 11
(2,1) 41
(3,2) 22
(1,3) 13
(4,3) 63
(2,4) 44
(3,4) 24
>> luinc(S,'0')
ans =
(1,1) 41.0000
(4,1) 0.2683
(2,2) 22.0000
(3,3) 63.0000
(4,3) 0.2063
(1,4) 44.0000
(2,4) 24.0000
>> [L,U,p]=luinc(S,'0')
L =
(1,1) 1.0000
(4,1) 0.2683
(2,2) 1.0000
(3,3) 1.0000
(4,3) 0.2063
(4,4) 1.0000
U =
(1,1) 41
(2,2) 22
(3,3) 63
(1,4) 44
(2,4) 24
p =
(4,1) 1
(1,2) 1
(2,3) 1
(3,4) 1
命令 稀疏矩阵的不完全Cholesky分解
函数 cholinc
格式 R = (X,droptol) %稀疏矩阵X的不完全Cholesky分解,droptol为指定误差。
R = cholinc(X,options) %options取值为:droptol表示舍入误差;michol表示如果michol=1,则从对角线上抽取出被去掉的元素。rdiag表示用droptol值代替上三角分解因子中的对角线上的零元素。
R = cholinc(X,'0') %'0'是一种分解标准
[R,p] = cholinc(X,'0') %不产生任何出错信息,如果R存在,则p=0;如果R不存在,则p为正整数。
R = cholinc(X,'inf') %进行Cholesky无穷分解
1.7.11 稀疏矩阵的特征值分解
函数 eigs
格式 d = eigs(A) %求稀疏矩阵A的6个最大特征值d,d以向量形式存放。
d = eigs(A,B) %求稀疏矩阵的广义特征值问题。满足AV=BVD,其中D为特征值对角阵,V为特征向量矩阵,B必须是对称正定阵或Hermitian正定阵。
d = eigs(A,k) %返回k个最大特征值
d = eigs(A,B,k) %返回k个最大特征值
d = eigs(A,k,sigma) %sigma取值:'lm' 表示最大数量的特征值;'sm' 最小数量特征值;对实对称问题:'la'表示最大特征值;'sa'为最小特征值;对非对称和复数问题:'lr' 表示最大实部;'sr' 表示最小实部;'li' 表示最大虚部;'si'表示最小虚部。
d = eigs(A,B,k,sigma) %同上
d = eigs(A,k,sigma,options) % options为指定参数:参见eigs帮助文件。
d = eigs(A,B,k,sigma,options) %同上。以下的参数k、sigma、options相同。
d = eigs(Afun,n) %用函数Afun代替A,n为A的阶数,D为特征值。
d = eigs(Afun,n,B)
d = eigs(Afun,n,k)
d = eigs(Afun,n,B,k)
d = eigs(Afun,n,k,sigma)
d = eigs(Afun,n,B,k,sigma)
d = eigs(Afun,n,k,sigma,options)
d = eigs(Afun,n,B,k,sigma,options)
[V,D] = eigs(A,…) %D为6个最大特征值对角阵,V的列向量为对应特征向量。
[V,D] = eigs(Afun,n,…)
[V,D,flag] = eigs(A,…) %flag表示特征值的收敛性,若flag=0,则所有特征值都收敛,否则,不是所有都收敛。
[V,D,flag] = eigs(Afun,n,…)
1.7.12 稀疏矩阵的线性方程组
参见1.4节的方程组求解。