94
第第第 第第第第第第第第 • 第第 • 第第第第第第第第第第 • 第第第第第第第第第 • 第第第第第第第第第第 • 第第第第第第 • 第第第第第第第第

第四章 线性代数问题求解

  • Upload
    gitano

  • View
    152

  • Download
    1

Embed Size (px)

DESCRIPTION

第四章 线性代数问题求解. 矩阵 线性方程组的直接解法 线性方程组的迭代法 线性方程组的符号解法 稀疏矩阵技术 特征值与特征向量. 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] 区间上的均匀分布 - PowerPoint PPT Presentation

Citation preview

Page 1: 第四章  线性代数问题求解

第四章 线性代数问题求解• 矩阵• 线性方程组的直接解法• 线性方程组的迭代法• 线性方程组的符号解法• 稀疏矩阵技术• 特征值与特征向量

Page 2: 第四章  线性代数问题求解

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))

Page 3: 第四章  线性代数问题求解

– 随机元素矩阵若矩阵随机元素满足 [0,1] 区间上的均匀分布 生成 nm 阶标准均匀分布为随机数矩阵: A=rand(n,m) 生成 nn 阶标准均匀分布为随机数方阵: A=rand(n)

Page 4: 第四章  线性代数问题求解

– 对角元素矩阵

已知向量生成对角矩阵: A=diag(V) 已知矩阵提取对角元素列向量: V = diag(A) 生成主对角线上第 k 条对角线为 V 的矩阵: A=diag(V,k)

Page 5: 第四章  线性代数问题求解

• 例: 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

Page 6: 第四章  线性代数问题求解

生成三对角矩阵 :

>> 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

Page 7: 第四章  线性代数问题求解

–Hilbert 矩阵及逆 Hilbert 矩阵

生成 n 阶的 Hilbert 矩阵: A=hilb(n) 求取逆 Hilbert 矩阵: B=invhilb(n)

Page 8: 第四章  线性代数问题求解

– Hankel( 汉克 ) 矩阵

其中:第一列的各个元素定义为 C 向量,最后一行各个元素定义为 R 。 H 为对称阵。 H1=hankel(C) 由 Hankel 矩阵反对角线上元素相等得出一下三角阵均为零的 Hankel 矩阵

Page 9: 第四章  线性代数问题求解

–Vandermonde( 范德蒙 ) 矩阵

Page 10: 第四章  线性代数问题求解

–伴随矩阵

其中: P(s) 为首项系数为一的多向式。

Page 11: 第四章  线性代数问题求解

• 符号矩阵的输入 数值矩阵 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]

Page 12: 第四章  线性代数问题求解

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

Page 13: 第四章  线性代数问题求解

• 例:>> tic, A=sym(hilb(20)); det(A), toc ans = 1/23774547167685345090916442434276164401754

19837753486493033185331234419759310644585187585766816573773440565759867265558971765638419710793303386582324149811241023554489166154717809635257797836800000000000000000000000000000000000

elapsed_time = 2.3140高阶的 Hilbert 矩阵是接近奇异的矩阵。

Page 14: 第四章  线性代数问题求解

• 矩阵的迹

格式: t=trace(A)• 矩阵的秩

格式: r=rank(A) %用默认的精度求数值秩 r=rank(A , ) %给定精度下求数值秩 矩阵的秩也表示该矩阵中行列式不等于 0 的子式的最大阶次。可证行秩和列秩(线性无关的)应相等。

Page 15: 第四章  线性代数问题求解

• 例

>> 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

Page 16: 第四章  线性代数问题求解

• 矩阵范数

Page 17: 第四章  线性代数问题求解

• 矩阵的范数定义:

格式: N=norm(A) %求解默认的 2 范数 N=norm(A ,选项 ) %选项可为 1,2,inf 等

Page 18: 第四章  线性代数问题求解

• 例:求一向量、矩阵的范数>> 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( ) 函数。

Page 19: 第四章  线性代数问题求解

• 特征多项式

格式: 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

Page 20: 第四章  线性代数问题求解

• 矩阵多项式的求解

Page 21: 第四章  线性代数问题求解

• 符号多项式与数值多项式的转换

格式: f=poly2sym(P) 或 f=poly2sym(P,x)

格式: P=sym2poly(f)

Page 22: 第四章  线性代数问题求解

• 例:

>> 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

Page 23: 第四章  线性代数问题求解

• 矩阵的逆矩阵

格式: 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

Page 24: 第四章  线性代数问题求解

检验:>> H*H1ans = 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

Page 25: 第四章  线性代数问题求解

>> 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( ) ,可用符号工具箱。

Page 26: 第四章  线性代数问题求解

>> 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

Page 27: 第四章  线性代数问题求解

• 例:奇异阵求逆>> 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/invError, (in inverse) singular matrix

Page 28: 第四章  线性代数问题求解

同样适用于含有变量的矩阵求逆。例:>> 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)]

Page 29: 第四章  线性代数问题求解

• 矩阵的相似变换与正交矩阵 其中: A 为一方阵, B 矩阵非奇异。 相似变换后, X 矩阵的秩、迹、行列式与特征值等均不发生变化,其值与 A 矩阵完全一致。 对于一类特殊的相似变换满足如下条件,称为正交基矩阵。

Page 30: 第四章  线性代数问题求解

例:

>> 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

Page 31: 第四章  线性代数问题求解

例:

>> 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

Page 32: 第四章  线性代数问题求解

4.2 线性方程组直接解法4.2.1 线性方程组直接求解-矩阵除法

• 关于线性方程组的直接解法,如 Gauss 消去法、选主元消去法、平方根法、追赶法等等,在 MATLAB 中,只需用“/”或“ \”就解决问题。它内部实际包含着许许多多的自适应算法,如对超定方程用最小二乘法,对欠定方程时它将给出范数最小的一个解,解三对角阵方程组时用追赶法等等。 格式: x=A\b

Page 33: 第四章  线性代数问题求解

• 例:解方程组

>> 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

1 2 3 4

1 2 3 4

1 2 3 4

1 2 3 4

0.4096 0.1234 0.3678 0.2943 0.40430.2246 0.3872 0.4015 0.1129 0.11500.3645 0.1920 0.3781 0.0643 0.42400.1784 0.4002 0.2786 0.3927 0.2557

x x x xx x x xx x x xx x x x

Page 34: 第四章  线性代数问题求解

4.2.2 线性方程组直接求解-判定求解

Page 35: 第四章  线性代数问题求解
Page 36: 第四章  线性代数问题求解

• 例:

>> 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 = 4ans = 4>> x=inv(A)*Bx = -1.8000 2.4000 1.8667 -1.2667 3.8667 -3.2667 -2.1333 2.7333

Page 37: 第四章  线性代数问题求解

检验>> 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

Page 38: 第四章  线性代数问题求解

原方程组对应的齐次方程组的解

求取 A 矩阵的化零矩阵: 格式: Z=null(A)

求取 A 矩阵的化零矩阵的规范形式: 格式: Z=null(A, ‘ r ’)

Page 39: 第四章  线性代数问题求解

• 例:

判断可解性>> 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

1

2 3

3 4

4

2 32.5 3.51 00 1

xx xx xx

Page 40: 第四章  线性代数问题求解

>> 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

1

21 2

3

4

2 3 0.95422.5 3.5 0.73281 0 -0.07630 1 -0.2977

xx

a axx

Page 41: 第四章  线性代数问题求解

• 解析解>> 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]

Page 42: 第四章  线性代数问题求解

• 验证得出的解>> 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)+x0x = [ 2*a1+3*a2+125/131][ -5/2*a1-7/2*a2+96/131][ a1-10/131][ a2-39/131]

Page 43: 第四章  线性代数问题求解

摩尔-彭罗斯广义逆求解出的方程最小二乘解不满足原始代数方程。

Page 44: 第四章  线性代数问题求解

4.2.3 线性方程组的直接求解分析• LU 分解

Page 45: 第四章  线性代数问题求解
Page 46: 第四章  线性代数问题求解
Page 47: 第四章  线性代数问题求解

• 格式 [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

Page 48: 第四章  线性代数问题求解

• 例:对 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.0000u = 4.0000 6.0000 7.0000 0 1.0000 -2.5000 0 0 2.5000p = 0 0 1 0 1 0 1 0 0

1 2 32 4 14 6 7

A

Page 49: 第四章  线性代数问题求解

>> [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

Page 50: 第四章  线性代数问题求解

• QR 分解 将矩阵 A 分解成一个正交矩阵与一个上三角矩阵的乘积。

求得正交矩阵 Q 和上三角阵 R , Q 和 R 满足 A=QR 。

格式: [Q,R] = qr(A)

Page 51: 第四章  线性代数问题求解

• 例:>> A =[ 1 2 3;4 5 6; 7 8 9; 10 11 12];>> [Q,R] = qr(A)Q = -0.0776 -0.8331 0.5456 -0.0478 -0.3105 -0.4512 -0.6919 0.4704 -0.5433 -0.0694 -0.2531 -0.7975 -0.7762 0.3124 0.3994 0.3748R = -12.8841 -14.5916 -16.2992 0 -1.0413 -2.0826 0 0 -0.0000 0 0 0

Page 52: 第四章  线性代数问题求解

• Cholesky(乔里斯基 ) 分解 若矩阵 A 为 n 阶对称正定阵 ,则存在唯一的对角元素为正的三角阵 D ,使得

Page 53: 第四章  线性代数问题求解

格式: D=chol(A)

Page 54: 第四章  线性代数问题求解

例:进行 Cholesky 分解。>> A=[16 4 8; 4 5 -4; 8 -4 22];

>> D=chol(A)

D =

4 1 2

0 2 -3

0 0 3

16 4 84 5 48 4 22

A

Page 55: 第四章  线性代数问题求解

利用矩阵的 LU 、 QR 和 cholesky 分解求方程组的解 ( 1 ) LU 分解: A*X=b 变成 L*U*X=b所以 X=U\(L\b) 这样可以大大提高运算速度。

例:求方程组 的一个特解。解:>> A=[4 2 -1;3 -1 2;11 3 0];>> B=[2 10 8]';>> D=det(A)D = 0

1 2 3

1 2 3

1 2

4x 2x x 23x x 2x 10

11x 3x 8

Page 56: 第四章  线性代数问题求解

>> [L,U]=lu(A)L = 0.3636 -0.5000 1.0000 0.2727 1.0000 0 1.0000 0 0U = 11.0000 3.0000 0 0 -1.8182 2.0000 0 0 0.0000

Page 57: 第四章  线性代数问题求解

>> X=U\(L\B)Warning: Matrix is close to singular or badly scaled. Results may be inaccurate. RCOND = 2.018587e-017.X = 1.0e+016 * % 结果中的警告是由于系数行列式为零产生的。 -0.4053 % 可以通过 A*X 验证其正确性。 1.4862 1.3511>> A*Xans = 0 8 8

Page 58: 第四章  线性代数问题求解

( 2 ) Cholesky 分解 若 A 为对称正定矩阵,则 Cholesky 分解可将矩阵A 分解成上三角矩阵和其转置的乘积,方程 A*X=b 变成 R’*R*X=b所以 X=R\(R’\b) ( 3 ) QR 分解 对于任何长方矩阵 A ,都可以进行 QR 分解,其中Q 为正交矩阵, R 为上三角矩阵的初等变换形式,即:A=QR方程 A*X=b 变形成 QRX=b所以 X=R\(Q\b)

这三种分解,在求解大型方程组时很有用。其优点是运算速度快、可以节省磁盘空间、节省内存。

Page 59: 第四章  线性代数问题求解

• 三个变换 在线性方程组的迭代求解中,要用到系数矩阵 A 的上三角矩阵、对角阵和下三角矩阵。此三个变换在 MATLAB 中可由以下函数实现。

– 上三角变换: 格式 triu(A,1)– 对角变换: 格式 diag(A)– 下三角变换: 格式 tril(A,-1)

例:对此矩阵做三种变换。1 2 21 1 12 2 1

A

Page 60: 第四章  线性代数问题求解

>> A=[1 2 -2;1 1 1;2 2 1]; %>> triu(A,1)ans = 0 2 -2 0 0 1 0 0 0>> tril(A,-1)ans = 0 0 0 1 0 0 2 2 0>> b=diag(A); b'ans = 1 1 1

1 2 21 1 12 2 1

A

Page 61: 第四章  线性代数问题求解

4.3 迭代解法的几种形式5.3.1 Jacobi 迭代法

• 方程组 Ax=b A 可写成 A=D-L-U 其中 :D=diag[a11,a22,…,ann], -L 、 -U 分别为 A的严格下、上三角部分(不包括对角线元素) . 由 Ax=b = > x=Bx+f 由此可构造迭代法: x(k+1)=Bx(k)+f 其中: B=D-1(L+U)=I-D-1A, f=D-1b.

Page 62: 第四章  线性代数问题求解

function y=jacobi(a,b,x0)D=diag(diag(a)); U=-triu(a,1); L=-tril(a,-1);B=D\(L+U); f=D\b;y=B*x0+f;n=1;while norm(y-x0)>=1.0e-6 x0=y; y=B*x0+f; n=n+1;endn

Page 63: 第四章  线性代数问题求解

• 例:用 Jacobi 方法求解,设 x(0)=0, 精度为 10-6 。>> a=[10 -1 0; -1 10 -2; 0 -2 10];>> b=[9; 7; 6];>> jacobi(a,b,[0;0;0])n = 11ans = 0.9958 0.9579 0.7916

1 2

1 2 3

2 3

10 910 2 72 10 6

x xx x x

x x

Page 64: 第四章  线性代数问题求解

4.3.2 Gauss-Seidel 迭代法由原方程构造迭代方程 x(k+1)=G x(k)+f

其中: G=(D-L)-1 U, f=(D-L)-1 b D=diag[a11,a22,…,ann],

-L 、 -U 分别为 A 的严格下、上三角部分(不包括对角线元素) .

Page 65: 第四章  线性代数问题求解

function y=seidel(a,b,x0)D=diag(diag(a));U=-triu(a,1);L=-tril(a,-1);G=(D-L)\U ;f=(D-L)\b;y=G*x0+f; n=1;while norm(y-x0)>=1.0e-6 x0=y; y=G*x0+f; n=n+1;endn

Page 66: 第四章  线性代数问题求解

• 例:对上例用 Gauss-Seidel 迭代法求解>> a=[10 -1 0; -1 10 -2; 0 -2 10];>> b=[9; 7; 6];>> seidel(a,b,[0;0;0])n = 7ans = 0.9958 0.9579 0.7916例:分别用 Jacobi 和 G-S法迭代求解 ,看是否收敛。

1

2

3

1 2 2 91 1 1 72 2 1 6

xxx

Page 67: 第四章  线性代数问题求解

>> a=[1 2 -2; 1 1 1; 2 2 1]; b=[9; 7; 6];>> jacobi(a,b,[0;0;0])n = 4ans = -27 26 8>> seidel(a,b,[0;0;0])n = 1011ans = 1.0e+305 * -Inf Inf -1.7556

Page 68: 第四章  线性代数问题求解

4.3.3 SOR 迭代法 在很多情况下, J 法和 G-S 法收敛较慢,所以考虑对 G-S 法进行改进。于是引入一种新的迭代法-逐次超松弛迭代法( Succesise Over-Relaxation),记为 SQR法。 迭代公式为: X(k+1)= (D-wL)-1((1-w)D+wU)x(k) + w(D-wL)-1 b 其中: w最佳值在 [1, 2 )之间,不易计算得到,因此 w 通常有经验给出。

Page 69: 第四章  线性代数问题求解

function y=sor(a,b,w,x0)D=diag(diag(a));U=-triu(a,1);L=-tril(a,-1);M=(D-w*L)\((1-w)*D+w*U); f=(D-w*L)\b*w;y=M*x0+f; n=1;while norm(y-x0)>=1.0e-6 x0=y; y=M*x0+f; n=n+1;endn

Page 70: 第四章  线性代数问题求解

例:上例中,当 w=1.103时,用 SOR 法求解原方程。>> a=[10 -1 0; -1 10 -2; 0 -2 10];>> b=[9; 7; 6];>> sor(a,b,1.103,[0;0;0])n = 8ans = 0.9958 0.9579 0.7916

Page 71: 第四章  线性代数问题求解

4.3.4 两步迭代法 当线性方程系数矩阵为对称正定时,可用一种特殊的迭代法来解决,其迭代公式为: ( D-L ) x(k+1/2) =U x(k) +b ( D-U ) x(k+1)=Lx(k+1/2) +b=> x(k+1/2) =(D-L)-1 U x(k) + (D-L)-1 b x(k+1)= (D-U)-1 Lx(k+1/2) + (D-U)-1 b

Page 72: 第四章  线性代数问题求解

function y=twostp(a,b,x0)D=diag(diag(a));U=-triu(a,1);L=-tril(a,-1);G1==(D-L)\U; f1=(D-L)\b;G2==(D-U)\L; f1=(D-U)\b;y=G1*x0+f1; y=G2*y+f2; n=1;while norm(y-x0)>=1.0e-6 x0=y; y=G1*x0+f1; y=G2*y+f2; n=n+1;endn

Page 73: 第四章  线性代数问题求解

• 例:求解方程组

>> a=[10 -1 2 0; -1 11 -1 3; 2 -1 10 3; 0 3 -1 8];>> b=[6; 25; -11; 15];>> twostp(a, b, [0; 0; 0; 0])n = 7ans = 1.0791 1.9824 -1.4044 0.9560

1

2

3

4

10 1 2 0 61 11 1 3 25

2 1 10 1 110 3 1 8 15

xxxx

Page 74: 第四章  线性代数问题求解

4.4 线性方程组的符号解法 在 MATLAB 的 Symbolic Toolbox 中提供了线性方程的符号求解函数,如 linsolve(A,b) 等同于 X = sym(A)\sym(b).

solve('eqn1','eqn2',...,'eqnN','var1,var2,...,varN ')

Page 75: 第四章  线性代数问题求解

• 例:>> A=sym('[10,-1,0;-1,10,-2;0,-2,10]') ;>> b=('[9; 7; 6]') ;>> linsolve(A,b)ans =[ 473/475][ 91/95][ 376/475]>> vpa(ans)ans =[ .99578947368421052631578947368421][ .95789473684210526315789473684211][ .79157894736842105263157894736842]

Page 76: 第四章  线性代数问题求解

例:>> [x,y] = solve('x^2 + x*y + y = 3','x^2

- 4*x + 3 = 0','x','y') x = [ 1] [ 3] y = [ 1] [ -3/2]

Page 77: 第四章  线性代数问题求解

4.5 稀疏矩阵技术• 稀疏矩阵的建立:

– 格式 S=sparse(i,j,s,m,n)生成一 mxn 阶的稀疏矩阵,以向量 i 和 j 为坐标的位置上对应元素值为 s 。– 例:>> n=5; a1=sparse(1:n, 1:n, 4*ones(1,n), n, n)a1 = (1,1) 4 (2,2) 4 (3,3) 4 (4,4) 4 (5,5) 4

Page 78: 第四章  线性代数问题求解

– 例:>> a2=sparse(2:n, 1:n-1,ones(1,n-1),n,n)a2 = (2,1) 1 (3,2) 1 (4,3) 1 (5,4) 1>> full(a2)ans = 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0

Page 79: 第四章  线性代数问题求解

• 例: n=5, 建立主对角线上元素为 4 ,两条次对角线为 1 的三对角阵。>> n=5; a1=sparse(1:n,1:n,4*ones(1,n),n,n);>> a2=sparse(2:n,1:n-1,ones(1,n-1),n,n);>> a=a1+a2+a2'a = (1,1) 4 (2,1) 1 (1,2) 1 (2,2) 4 (3,2) 1 (2,3) 1 (3,3) 4 (4,3) 1

Page 80: 第四章  线性代数问题求解

(3,4) 1 (4,4) 4 (5,4) 1 (4,5) 1 (5,5) 4>> full(a)ans = 4 1 0 0 0 1 4 1 0 0 0 1 4 1 0 0 0 1 4 1 0 0 0 1 4

Page 81: 第四章  线性代数问题求解

– 格式 A=spdiags(B,d,m,n) 生成一 mxn 阶的稀疏矩阵,使得 B 的列放在由 d指定的位置。– 例:>> n=5>> b=spdiags([ones(n,1),4*ones(n,1),ones(n,1)],…[-1,0,1],n,n);>> full(b)ans = 4 1 0 0 0 1 4 1 0 0 0 1 4 1 0 0 0 1 4 1 0 0 0 1 4

Page 82: 第四章  线性代数问题求解

– 格式: spconvert(dd) 对于无规律的稀疏矩阵,可使用此命令由外部数据转化为稀疏矩阵。– 调用形式为:先用 load 函数加载以行表示对应位置和元素值的 .dat文本文件,再用此命令转化为稀疏矩阵。– 例:无规律稀疏矩阵的建立。首先编制文本文件 sp.dat 如下:5 1 5.003 5 8.004 4 2.005 5 0

Page 83: 第四章  线性代数问题求解

>> load sp.dat>> spconvert(sp)ans = (5,1) 5 (4,4) 2 (3,5) 8>> full(ans)ans = 0 0 0 0 0 0 0 0 0 0 0 0 0 0 8 0 0 0 2 0 5 0 0 0 0

Page 84: 第四章  线性代数问题求解

• 稀疏矩阵的计算: 同满矩阵比较,稀疏矩阵在算法上有很大的不同。具体表现在存储空间减少,计算时间减少。例:比较求解下面方程组 n = 1000时两种方法的差别。

1

2

4 1 11 4 1

11 4 1n

xx

x

Page 85: 第四章  线性代数问题求解

>> n=1000;>> a1=sparse(1:n,1:n,4*ones(1,n),n,n);>> a2=sparse(2:n,1:n-1,ones(1,n-1),n,n);>> a=a1+a2+a2';>> b=ones(1000,1);>> tic; x=a\b; t1=toct1 = 0.4800>> a=full(a);>> tic; x=a\b; t2=toct2 = 1.3220

Page 86: 第四章  线性代数问题求解

4.6 矩阵的特征值问题 4.6.1 一般矩阵的特征值与特征向量

• 格式: d=eig (A) 只求解特征值。• 格式: [V, D]=eig (A) 求解特征值和特征向量。

Page 87: 第四章  线性代数问题求解

• 例:

直接求解:>> A=[16 2 3 13; 5 11 10 8; 9 7 6 12; 4 14 15 1]; >> eig(A)ans = 34.0000 8.9443 -8.9443 0.0000

Page 88: 第四章  线性代数问题求解

精确解:>> eig(sym(A))ans =[ 0][ 34][ 4*5^(1/2)][ -4*5^(1/2)]高精度数值解:>> vpa(ans,70)ans =[ 0][ 34.][ 8.9442719099991587856366946749251049417624734384461028

97083588981642084][ -8.9442719099991587856366946749251049417624734384461028 97083588981642084]

Page 89: 第四章  线性代数问题求解

• 同时求出特征值与特征向量:直接求解:>> [v, d] = eig(A)v = -0.5000 -0.8236 0.3764 -0.2236 -0.5000 0.4236 0.0236 -0.6708 -0.5000 0.0236 0.4236 0.6708 -0.5000 0.3764 -0.8236 0.2236d = 34.0000 0 0 0 0 8.9443 0 0 0 0 -8.9443 0 0 0 0 0.0000

Page 90: 第四章  线性代数问题求解

解析解:>> [v,d]=eig(sym(A))v =[ -1, 1, -8*5^(1/2)-17, 8*5^(1/2)-17 ][ -3, 1, 4*5^(1/2)+9, -4*5^(1/2)+9 ][ 3, 1, 1, 1 ][ 1, 1, 4*5^(1/2)+7, -4*5^(1/2)+7 ]

d =[ 0, 0, 0, 0][ 0, 34, 0, 0][ 0, 0, 4*5^(1/2), 0][ 0, 0, 0, -4*5^(1/2)]

Page 91: 第四章  线性代数问题求解

4.6.2 矩阵的广义特征向量问题 若 B=I ,则化成普通矩阵特征值问题。• 格式: d=eig (A , B) 求解广义特征值。• 格式: [V, D]=eig (A , B) 求解广义特征值和特征向量。

Page 92: 第四章  线性代数问题求解

• 例:

直接求解:>> A=[5,7,6,5; 7,10,8,7; 6,8,10,9; 5,7,9,10];>> B=[2,6,-1,-2; 5,-1,2,3; -3,-4,1,10; 5,-2,-3,8];>> [V, D] = eig(A, B)V = 0.3697 -0.3741 + 0.6259i -0.3741 - 0.6259i 1.0000 0.9948 -0.0674 - 0.2531i -0.0674 + 0.2531i -0.6090 0.7979 0.9239 + 0.0264i 0.9239 - 0.0264i -0.2316 1.0000 -0.6599 - 0.3263i -0.6599 + 0.3263i 0.1319

Page 93: 第四章  线性代数问题求解

D = 4.7564 0 0 0 0 0.0471 + 0.1750i 0 0 0 0 0.0471 - 0.1750i 0 0 0 0 -0.0037

检验:>> norm(A*V-B*V*D)ans = 1.3897e-014

符号运算工具箱中的 eig( ) 函数不支持广义特征值的运算。

Page 94: 第四章  线性代数问题求解