|
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
上一篇讲到:方程AX=b的解的讨论(特解、通解、零空间向量等概念)及其MATLAB实现,程序中用到的是mldivide或者A\b的方法(二者相同)来解方程。
& T( k* I* I+ q1 c( b& @
0 M! g3 O7 f9 Q; g7 m但实际上运行过程中我们会遇到:当AX=b线性方程组是一个病态方程组;或者A是奇异矩阵(即det(A)=0,不可逆),没法求逆,用不了inv(A)方法只能用A\b,此时MATLAB会报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”…网络上很多人问这个问题怎么解决,其实不是MATLAB的问题,而是MATLAB内置算法的鲁棒性问题,直接用A\b方法无法处理这个棘手的问题。如果没有矩阵论或数值计算方法基础的同学可能会一头雾水。本文借用Moore-Penrose广义逆来解决这个问题,帮助大家理解带奇异矩阵的病态方程组如何解决。
! b/ Z4 ], ~+ x# V6 F% o" c7 r {% u2 C
首先我们先来看下mldivide, \在MATLAB中的含义:
0 r( ?* Z' u; R4 j4 B0 g. T, t2 }2 k. C
4 Q. X' T1 c2 {& `- h) [% A% R& m7 O, \2 ?) {' n M' }4 S) }, I
% S1 E9 \2 {5 i5 p
+ ~. @* N2 L. l2 Y8 o0 V0 F; k7 s: A$ E6 I! R! O9 L
$ L: {/ h8 X( ?0 ~- H7 u
也就是说,A\b的方法是可以求包含奇异矩阵的方程组的,但是可能会出错。而且错误可能非常离谱。(这个例子告诫我们,不要以为MATLAB算出来的结果都是准确的,MATLAB也不过是调用一些算法进行运算,每个算法都可能存在一些缺陷,无法处理某些极端的情况)。9 p/ z k6 S- Z; l% j
, k7 v H! F2 u8 w
" H' U; n2 ?- F! G' G) R$ X/ d/ }
这里就涉及到数值计算方法领域矩阵的性态的问题了。我们可以直观来感受一下:
6 T f% O2 S% u2 j) p# I- F/ h. X2 p% `3 x9 J5 j2 a$ |
假设如下方程组:
8 U" M# S* H' y; i$ r0 d# i5 `+ i# I
# C7 H4 C) {+ z
$ P- N8 p7 U. A( X7 j. N/ h
. L: q+ [" z7 V+ E其精确解是(1,1)。
! T4 G! Y9 x- j$ s( b' @: n
2 A. @! f0 B; e' q9 u% J- O若对左右边都做一些非常非常微小的变化:2 m. g: Y! g1 L3 G
/ z c( ?) b( H* R
0 Y1 s) }( Z" N
2 y$ z0 X" Q/ y& [$ _2 t$ X7 d4 f其精确解变为:(10,-2)。; v! W1 _4 I" ^. X; Q
6 c3 \ G+ q, _, g
一个非常非常微小的扰动就让方程的解产生巨大的变动,我们称上述方程组是病态方程组,系数矩阵A是病态矩阵。6 j2 T) ?8 E X0 A( W
. v% P2 d/ X7 \2 a如果我们遇到不是方阵的矩阵,或者不能求逆的方阵,要想求解AX=b,避免奇异值导致MATLAB产生错误的情况,我们可以采用“伪逆”来帮助我们解决这个问题。7 m+ Q6 P/ d6 }8 s$ L+ p& z
G7 ^/ A r& q: J# ?" |
广义逆矩阵:& V' J$ ~6 p) O) ~2 ?
$ `3 n( O. z& F# N
对任意一个矩阵A,提出四个条件:6 M7 ?# [* A' ?3 m' \
9 U4 p. J, s2 S. s; o
0 V8 s+ D- i" W S
% P& Q8 V, d+ b# i# p
如果存在矩阵G满足上述的一部分或全部条件,G就可以称为A的广义逆矩阵。最常用的四种广义逆矩阵定义如下:1 b$ y! B! {$ I5 }2 C
, S( b' L" i1 X: W
, T' ^+ [$ H' X
5 h7 x! v) p% d" [ C) z
MATLAB中自带的pinv方法,就可以求矩阵的M-P广义逆,即A+矩阵。
- @6 I" t& {- U" o" Z A* v! m9 r* P* p) E! `; r- w
大家可以查阅官方文档看具体应用实例。/ c9 h9 o2 I. p$ c: G5 v" [
0 c; |7 @- x! L0 x
8 `. z- F. S: u; t5 ]1 a/ H
4 `8 O, e/ A4 B- v% Q如果我们求出A+,就可以有另一种思路来解AX=b了:
1 c/ h; I+ h/ ?4 L9 P
* e, U5 r; p3 ]
& |1 r& `! G5 q" c9 s; }; k& f; ` Z8 y+ l% @+ e1 |7 F) D- ~* q$ l4 w0 F
这里,通解的表达式还是类似于X=X*+X0的形式,A+b相当于是特解,后面那一项就是带系数的自由解,y可以取任意数,注意维度匹配即可。
N: ~6 x0 m/ ^5 l; t1 V: O9 Q( W! y% k3 g/ A- C' c
所以,大家调用pinv求出M-P广义逆,然后用x=A+b + (I-A+A)y这个式子构造出通解就可以啦!- ]9 ]9 W) x7 v# B# ]8 E
+ j W+ n- t' L9 V/ n0 i% R. \: d4 u8 e% t% }' V* }6 @, \
# Y# A( y9 t8 t" e* p$ D ~: v2 |3 V! {6 ^9 |
2 k" K! [$ |$ E! T0 M8 E
|
|