950 likes | 1.26k Views
第四章 线性代数问题求解. 矩阵 线性方程组的直接解法 线性方程组的迭代法 线性方程组的符号解法 稀疏矩阵技术 特征值与特征向量. 4.1 矩阵 4.1.1 特殊矩阵的输入. 数值矩阵的输入 零矩阵、幺矩阵及单位矩阵 生成 n n 方阵: A=zeros(n), B=ones(n), C=eye(n) 生成 m n 矩阵: A=zeros(m,n), B=ones(m,n), C=eye(m,n) 生成和矩阵 B 同样位数的矩阵: A=zeros(size(B)). 随机元素矩阵 若矩阵随机元素满足 [0,1] 区间上的均匀分布
E N D
第四章 线性代数问题求解 • 矩阵 • 线性方程组的直接解法 • 线性方程组的迭代法 • 线性方程组的符号解法 • 稀疏矩阵技术 • 特征值与特征向量
4.1 矩阵4.1.1特殊矩阵的输入 • 数值矩阵的输入 • 零矩阵、幺矩阵及单位矩阵 生成nn方阵: A=zeros(n), B=ones(n), C=eye(n) 生成mn矩阵: A=zeros(m,n), B=ones(m,n), C=eye(m,n) 生成和矩阵B同样位数的矩阵: A=zeros(size(B))
随机元素矩阵 若矩阵随机元素满足[0,1]区间上的均匀分布 生成nm阶标准均匀分布为随机数矩阵: A=rand(n,m) 生成nn阶标准均匀分布为随机数方阵: A=rand(n)
对角元素矩阵 已知向量生成对角矩阵: A=diag(V) 已知矩阵提取对角元素列向量: V=diag(A) 生成主对角线上第k条对角线为V的矩阵: A=diag(V,k)
例:diag( )函数的不同调用格式 >> C=[1 2 3]; V=diag(C) % 生成对角矩阵 V = 1 0 0 0 2 0 0 0 3 >> V1=diag(V)' % 将列向量通过转置变换成行向量 V1 = 1 2 3 >> C=[1 2 3]; V=diag(C,2) % 主对角线上第 k条对角线为C的矩阵 V = 0 0 1 0 0 0 0 0 2 0 0 0 0 0 3 0 0 0 0 0 0 0 0 0 0
生成三对角矩阵: >> V=diag([1 2 3 4])+diag([2 3 4],1)+diag([5 4 3],-1) V = 1 2 0 0 5 2 3 0 0 4 3 4 0 0 3 4
Hilbert矩阵及逆Hilbert矩阵 生成n阶的Hilbert矩阵: A=hilb(n) 求取逆Hilbert矩阵: B=invhilb(n)
Hankel(汉克 ) 矩阵 其中:第一列的各个元素定义为C向量,最后一行各个元素定义为R。H为对称阵。 H1=hankel(C) 由 Hankel矩阵反对角线上元素相等得出一下三角阵均为零的Hankel矩阵
伴随矩阵 其中:P(s)为首项系数为一的多向式。
符号矩阵的输入 数值矩阵A转换成符号矩阵: B=sym(A) 例: >> A=hilb(3) A = 1.0000 0.5000 0.3333 0.5000 0.3333 0.2500 0.3333 0.2500 0.2000 >> B=sym(A) B = [ 1, 1/2, 1/3] [ 1/2, 1/3, 1/4] [ 1/3, 1/4, 1/5]
4.1.2 矩阵基本概念与性质 • 行列式 格式 :d=det(A) 例:求行列式 >> A=[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]; det(A) ans = 0
例: >> tic, A=sym(hilb(20)); det(A), toc ans = 1/2377454716768534509091644243427616440175419837753486493033185331234419759310644585187585766816573773440565759867265558971765638419710793303386582324149811241023554489166154717809635257797836800000000000000000000000000000000000 elapsed_time = 2.3140 高阶的Hilbert矩阵是接近奇异的矩阵。
矩阵的迹 格式: t=trace(A) • 矩阵的秩 格式:r=rank(A) %用默认的精度求数值秩 r=rank(A, ) %给定精度下求数值秩 矩阵的秩也表示该矩阵中行列式不等于0的子式的最大阶次。可证行秩和列秩(线性无关的)应相等。
例 >> A=[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]; rank(A) ans = 3 该矩阵的秩为3,小于矩阵的阶次,故为非满秩矩阵。 • 例 >> H=hilb(20); rank(H) %数值方法 ans = 13 >> H=sym(hilb(20)); rank(H) % 解析方法,原矩阵为非奇异矩阵 ans = 20
矩阵的范数定义: 格式: N=norm(A)%求解默认的2范数 N=norm(A,选项)%选项可为1,2,inf等
例:求一向量、矩阵的范数 >> a=[16 2 3 13]; >> [norm(a), norm(a,2), norm(a,1), norm(a,Inf)] ans = 2.092844953645635e+001 2.092844953645635e+001 3.400000000000000e+001 1.600000000000000e+001 >> A=[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]; >> [norm(A), norm(A,2), norm(A,1), norm(A,Inf)] ans = 34 34 34 34 符号运算工具箱未提供norm( )函数,需先用double( )函数转换成双精度数值矩阵,再调用norm( )函数。
特征多项式 格式: C=poly(A) 例:>> A=[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]; >> poly(A) %直接求取 ans = 1.000000000000000e+000 -3.399999999999999e+001 -7.999999999999986e+001 2.719999999999999e+003 -2.819840539024018e-012 >> A=sym(A); poly(A) %运用符号工具箱 ans = x^4-34*x^3-80*x^2+2720*x
符号多项式与数值多项式的转换 格式: f=poly2sym(P)或 f=poly2sym(P,x) 格式: P=sym2poly(f)
例: >> P=[1 2 3 4 5 6]; % 先由系数按降幂顺序排列表示多项式 >> f=poly2sym(P,'v') % 以 v 为算子表示多项式 f = v^5+2*v^4+3*v^3+4*v^2+5*v+6 >> P=sym2poly(f) P = 1 2 3 4 5 6
矩阵的逆矩阵 格式: C=inv(A) 例: >> format long; H=hilb(4); H1=inv(H) H1 = 1.0e+003 * 0.01600000000000 -0.11999999999999 0.23999999999998 -0.13999999999999 -0.11999999999999 1.19999999999990 -2.69999999999976 1.67999999999984 0.23999999999998 -2.69999999999976 6.47999999999940 -4.19999999999961 -0.13999999999999 1.67999999999984 -4.19999999999961 2.79999999999974
检验: >> H*H1 ans = 1.00000000000001 0.00000000000023 -0.00000000000045 0.00000000000023 0.00000000000001 1.00000000000011 -0.00000000000011 0.00000000000011 0.00000000000001 0 1.00000000000011 0 0.00000000000000 0.00000000000011 -0.00000000000011 1.00000000000011 计算误差范数: >> norm(H*inv(H)-eye(size(H))) ans = 6.235798190375727e-013 >> H2=invhilb(4); norm(H*H2-eye(size(H))) ans = 5.684341886080802e-014
>> H=hilb(10); H1=inv(H); norm(H*H1-eye(size(H))) ans = 0.00264500826202 >> H2=invhilb(10); norm(H*H2-eye(size(H))) ans = 1.612897415528547e-005 >> H=hilb(13); H1=inv(H); norm(H*H1-eye(size(H))) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.339949e-018. ans = 53.23696008570294 >> H2=invhilb(13); norm(H*H2-eye(size(H))) ans = 11.37062973181391 对接近于奇异矩阵,高阶一般不建议用inv( ),可用符号工具箱。
>> H=sym(hilb(7)); inv(H) ans = [ 49, -1176, 8820, -29400, 48510, -38808, 12012] [-1176, 37632, -317520, 1128960, -1940400, 1596672, -504504] [8820, -317520, 2857680, -10584000, 18711000, -15717240, 5045040] [-29400, 1128960, -10584000, 40320000, -72765000, 62092800, -20180160] [48510, -1940400, 18711000, -72765000, 133402500, -115259760, 37837800] [-38808, 1596672, -15717240, 62092800, -115259760, 100590336, -33297264] [12012, -504504, 5045040, -20180160, 37837800, -33297264, 11099088] >> H=sym(hilb(30)); norm(double(H*inv(H)-eye(size(H)))) ans = 0
例:奇异阵求逆 >> A=[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]; >> format long; B = inv(A) Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 1.306145e-017. B = 1.0e+014 * 0.93824992236885 2.81474976710656 -2.81474976710656 -0.93824992236885 2.81474976710656 8.44424930131968 -8.44424930131968 -2.81474976710656 -2.81474976710656 -8.44424930131968 8.44424930131968 2.81474976710656 -0.93824992236885 -2.81474976710656 2.81474976710656 0.93824992236885 >> norm(A*B-eye(size(A))) %检验 ans = 1.64081513306419 >> A=sym(A); inv(A)%奇异矩阵不存在一个相应的逆矩阵,用符号工具箱的函数也不行 ??? Error using ==> sym/inv Error, (in inverse) singular matrix
同样适用于含有变量的矩阵求逆。 例: >> syms a1 a2 a3 a4; >> C=[a1 a2;a3 a4]; >> inv(C) ans = [ -a4/(-a1*a4+a2*a3), a2/(-a1*a4+a2*a3)] [ a3/(-a1*a4+a2*a3), -a1/(-a1*a4+a2*a3)]
矩阵的相似变换与正交矩阵 其中:A为一方阵,B矩阵非奇异。 相似变换后,X矩阵的秩、迹、行列式与特征值等均不发生变化,其值与A矩阵完全一致。 对于一类特殊的相似变换满足如下条件,称为正交基矩阵。
例: >> A=[5,9,8,3; 0,3,2,4; 2,3,5,9; 3,4,5,8]; >> Q=orth(A) Q = -0.6197 0.7738 -0.0262 -0.1286 -0.2548 -0.1551 0.9490 0.1017 -0.5198 -0.5298 -0.1563 -0.6517 -0.5300 -0.3106 -0.2725 0.7406 >> norm(Q'*Q-eye(4)) ans = 4.6395e-016 >> norm(Q*Q'-eye(4)) ans = 4.9270e-016
例: >> A=[16,2,3,13; 5,11,10,8; 9,7,6,12; 4,14,15,1]; >> Q=orth(A) %A为奇异矩阵,故得出的Q为长方形矩阵 Q = -0.5000 0.6708 0.5000 -0.5000 -0.2236 -0.5000 -0.5000 0.2236 -0.5000 -0.5000 -0.6708 0.5000 >> norm(Q'*Q-eye(3)) ans = 1.0140e-015
4.2 线性方程组直接解法4.2.1线性方程组直接求解-矩阵除法 • 关于线性方程组的直接解法,如Gauss消去法、选主元消去法、平方根法、追赶法等等,在MATLAB中,只需用“/”或“\”就解决问题。它内部实际包含着许许多多的自适应算法,如对超定方程用最小二乘法,对欠定方程时它将给出范数最小的一个解,解三对角阵方程组时用追赶法等等。 格式: x=A\b
例:解方程组 >> A=[.4096,.1234,.3678,.2943;.2246,.3872,.4015,.1129; .3645,.1920,.3781,.0643;.1784,.4002,.2786,.3927]; >> b=[0.4043 0.1550 0.4240 -0.2557]'; >> x=A\b; x' ans = -0.1819 -1.6630 2.2172 -0.4467
例: >> A=[1 2 3 4; 4 3 2 1; 1 3 2 4; 4 1 3 2]; B=[5 1; 4 2; 3 3; 2 4]; >> C=[A B]; rank(A), rank(C) ans = 4 ans = 4 >> x=inv(A)*B x = -1.8000 2.4000 1.8667 -1.2667 3.8667 -3.2667 -2.1333 2.7333
检验 >> norm(A*x-B) ans = 7.4738e-015 精确解 >> x1=inv(sym(A))*B x1 = [ -9/5, 12/5] [ 28/15, -19/15] [ 58/15, -49/15] [ -32/15, 41/15] 检验 >> norm(double(A*x1-B)) ans = 0
原方程组对应的齐次方程组的解 求取A矩阵的化零矩阵: 格式: Z=null(A) 求取A矩阵的化零矩阵的规范形式: 格式: Z=null(A, ‘ r ’)
例: 判断可解性 >> A=[1 2 3 4; 2 2 1 1; 2 4 6 8; 4 4 2 2]; B=[1;3;2;6]; >> C=[A B]; [rank(A), rank(C)] ans = 2 2 >> Z=null(A,'r') % 解出规范化的化零空间 Z = 2.0000 3.0000 -2.5000 -3.5000 % 1.0000 0 0 1.0000
>> x0=pinv(A)*B % 得出一个特解 x0 = 0.9542 0.7328 %全部解 -0.0763 -0.2977 验证得出的解 >> a1=randn(1); a2=rand(1); % 取不同分布的随机数 >> x=a1*Z(:,1)+a2*Z(:,2)+x0; norm(A*x-B) ans = 4.4409e-015
解析解 >> Z=null(sym(A)) Z = [ 2, 3] [ -5/2, -7/2] [ 1, 0] [ 0, 1] >> x0=sym(pinv(A)*B) x0 = [ 125/131] [ 96/131] [ -10/131] % [ -39/131]
验证得出的解 >> a1=randn(1); a2=rand(1); % 取不同分布的随机数 >> x=a1*Z(:,1)+a2*Z(:,2)+x0; norm(double(A*x-B)) ans = 0 • 通解 >> syms a1 a2; >> x=a1*Z(:,1)+a2*Z(:,2)+x0 x = [ 2*a1+3*a2+125/131] [ -5/2*a1-7/2*a2+96/131] [ a1-10/131] [ a2-39/131]
摩尔-彭罗斯广义逆求解出的方程最小二乘解不满足原始代数方程。摩尔-彭罗斯广义逆求解出的方程最小二乘解不满足原始代数方程。
4.2.3 线性方程组的直接求解分析 • LU分解
格式 [l,u,p]=lu(A) L是一个单位下三角矩阵,u是一个上三角矩阵, p是代表选主元的置换矩阵。 故:Ax=y => PAx=Py => LUx=Py => PA=LU [l,u]=lu(A) 其中l等于P-1 L,u等于U,所以(P-1 L)U=A
例:对A进行LU分解 >> A=[1 2 3; 2 4 1; 4 6 7]; >> [l,u,p]=lu(A) l = 1.0000 0 0 0.5000 1.0000 0 0.2500 0.5000 1.0000 u = 4.0000 6.0000 7.0000 0 1.0000 -2.5000 0 0 2.5000 p = 0 0 1 0 1 0 1 0 0
>> [l,u]=lu(A) % l=P-1 L l = 0.2500 0.5000 1.0000 0.5000 1.0000 0 1.0000 0 0 u = 4.0000 6.0000 7.0000 0 1.0000 -2.5000 0 0 2.5000
QR分解 将矩阵A分解成一个正交矩阵与一个上三角矩阵的乘积。 求得正交矩阵Q和上三角阵R,Q和R满足A=QR。 格式: [Q,R] = qr(A)