|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
上一篇讲到:方程AX=b的解的讨论(特解、通解、零空间向量等概念)及其MATLAB实现,程序中用到的是mldivide或者A\b的方法(二者相同)来解方程。# R' z4 m+ ~: W+ y
3 h M( g# J j0 ~ A
但实际上运行过程中我们会遇到:当AX=b线性方程组是一个病态方程组;或者A是奇异矩阵(即det(A)=0,不可逆),没法求逆,用不了inv(A)方法只能用A\b,此时MATLAB会报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”…网络上很多人问这个问题怎么解决,其实不是MATLAB的问题,而是MATLAB内置算法的鲁棒性问题,直接用A\b方法无法处理这个棘手的问题。如果没有矩阵论或数值计算方法基础的同学可能会一头雾水。本文借用Moore-Penrose广义逆来解决这个问题,帮助大家理解带奇异矩阵的病态方程组如何解决。5 Q% s- }& s! T; K9 y
3 A- i3 P& |- ?& {' S1 m$ h8 D
首先我们先来看下mldivide, \在MATLAB中的含义:9 f* R ^5 l$ s! ~. D
$ g1 \- t2 D4 Y- h0 s; p4 {1 Q/ \4 d+ o
3 s/ f' |0 S) n' P0 P1 d( D
1 e- ]* d4 D% x# ~
; j; Y3 \8 S& Z) r0 ^7 u% M
3 C$ p, g, V. n& Y1 @: M1 K/ A0 Q g1 A' ]' [& i2 {
4 C% H# M [$ q8 ~: ?5 Z也就是说,A\b的方法是可以求包含奇异矩阵的方程组的,但是可能会出错。而且错误可能非常离谱。(这个例子告诫我们,不要以为MATLAB算出来的结果都是准确的,MATLAB也不过是调用一些算法进行运算,每个算法都可能存在一些缺陷,无法处理某些极端的情况)。
g ^, N% M: f' P, \# g% t3 I) y7 t! Y; e
5 {0 g; p" i/ ~! M! g7 G这里就涉及到数值计算方法领域矩阵的性态的问题了。我们可以直观来感受一下:
# D- t. F+ X& f& E
) M) m' o" A# x0 t假设如下方程组:% P4 ~5 X+ [& U& S; R
/ ^9 U$ {' y: ]/ Q
H) I* t2 ]2 J$ ^0 M) I, E7 }4 Z$ d, n5 S
其精确解是(1,1)。
( n9 B* Z! @# ~8 L/ `$ c/ t( E% Y5 z! J* T0 s
若对左右边都做一些非常非常微小的变化:6 d9 y* q1 j. }! u8 R
3 @3 a: c! Q' N p: `- F0 D. m
- l2 v7 i4 h1 I- c% A5 G
% K3 A* Q$ W2 v
其精确解变为:(10,-2)。5 G I" }7 ?2 u7 u m
! \& I6 ~0 g/ d- N2 I4 |0 { N( c$ D一个非常非常微小的扰动就让方程的解产生巨大的变动,我们称上述方程组是病态方程组,系数矩阵A是病态矩阵。' Q" P' C: X" a& t
+ i+ e- h& e' q v2 g' A# G! L如果我们遇到不是方阵的矩阵,或者不能求逆的方阵,要想求解AX=b,避免奇异值导致MATLAB产生错误的情况,我们可以采用“伪逆”来帮助我们解决这个问题。% u. v; h' p. R; t: {5 m' R( ]% S% j+ s
* |$ L h$ z1 H7 Z8 G2 X' f/ D
广义逆矩阵:
6 [: A- V$ m) e/ y D
' d6 X+ h0 u% G% E对任意一个矩阵A,提出四个条件:0 T( w$ G- l) b, @% J9 u
5 u! s, u. Q6 r: \/ r. t2 {/ X
% `4 L; J7 |+ h, q, w" R
% i; `' S3 t, h: d3 T4 @如果存在矩阵G满足上述的一部分或全部条件,G就可以称为A的广义逆矩阵。最常用的四种广义逆矩阵定义如下:: X' X0 E m' u" `
3 w+ A7 Q3 ~, e9 J1 P; b5 |
5 S' ~' z$ c/ A
. F' u5 Y" M$ T; `
MATLAB中自带的pinv方法,就可以求矩阵的M-P广义逆,即A+矩阵。
) P2 T$ s# g4 o. _2 u
- |! b _, E2 I1 y大家可以查阅官方文档看具体应用实例。
! f3 |7 ?$ @- z1 X/ P) J
6 @2 X" x. t7 f3 U, N: f
& P S; |3 B; B2 y. ~- _) ~% ]
. b& \8 b, R- A# C/ t+ c% z
如果我们求出A+,就可以有另一种思路来解AX=b了:
' p4 n- W( i8 N( g) V% q3 o
- s$ d" Q" r8 ?' S% x \$ q
& ^' Q- g/ R% r
P( S# B8 J6 O; V5 t这里,通解的表达式还是类似于X=X*+X0的形式,A+b相当于是特解,后面那一项就是带系数的自由解,y可以取任意数,注意维度匹配即可。1 O9 ^+ Q* ^! z2 d2 a3 {6 |
' t1 t; ]- M. j3 ?5 h! d0 n所以,大家调用pinv求出M-P广义逆,然后用x=A+b + (I-A+A)y这个式子构造出通解就可以啦!
. ]8 B2 _$ T/ I/ `- F/ ?$ m& T: N0 K! J* t) x1 E% g
( u9 H" N3 w$ ^! B" r! s
7 \% }; l7 R9 Q3 ?/ I3 y
, { |( r- o3 l* d( w- M { |5 h8 I% ^6 h2 b& g5 _
|
|