赞
踩
上一篇博文讲到:《方程AX=b的解的讨论(特解、通解、零空间向量等概念)及其MATLAB实现》,程序中用到的是mldivide或者A\b的方法(二者相同)来解方程。
但实际上运行过程中我们会遇到:当AX=b线性方程组是一个病态方程组;或者A是奇异矩阵(即det(A)=0,不可逆),没法求逆,用不了inv(A)方法只能用A\b,此时MATLAB会报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”…网络上很多人问这个问题怎么解决,其实不是MATLAB的问题,而是MATLAB内置算法的鲁棒性问题,直接用A\b方法无法处理这个棘手的问题。如果没有矩阵论或数值计算方法基础的同学可能会一头雾水。本文借用Moore-Penrose广义逆来解决这个问题,帮助大家理解带奇异矩阵的病态方程组如何解决。
首先我们先来看下mldivide, \在MATLAB中的含义:
也就是说,A\b的方法是可以求包含奇异矩阵的方程组的,但是可能会出错。而且错误可能非常离谱。(这个例子告诫我们,不要以为MATLAB算出来的结果都是准确的,MATLAB也不过是调用一些算法进行运算,每个算法都可能存在一些缺陷,无法处理某些极端的情况)。大家可以看一下它内置算法原理:https://ww2.mathworks.cn/help/matlab/ref/mldivide_full_zh_CN.png
这里就涉及到数值计算方法领域矩阵的性态的问题了。我们可以直观来感受一下:
假设如下方程组:
其精确解是(1,1)。
若对左右边都做一些非常非常微小的变化:
其精确解变为:(10,-2)。
一个非常非常微小的扰动就让方程的解产生巨大的变动,我们称上述方程组是病态方程组,系数矩阵A是病态矩阵。
如果我们遇到不是方阵的矩阵,或者不能求逆的方阵,要想求解AX=b,避免奇异值导致MATLAB产生错误的情况,我们可以采用“伪逆”来帮助我们解决这个问题。
广义逆矩阵:
对任意一个矩阵A,提出四个条件:
如果存在矩阵G满足上述的一部分或全部条件,G就可以称为A的广义逆矩阵。最常用的四种广义逆矩阵定义如下:
MATLAB中自带的pinv方法,就可以求矩阵的M-P广义逆,即A+矩阵。官方文档:
https://ww2.mathworks.cn/help/matlab/ref/pinv.html?searchHighlight=pinv&s_tid=doc_srchtitle
大家可以查阅官方文档看具体应用实例。
如果我们求出A+,就可以有另一种思路来解AX=b了:
这里,通解的表达式还是类似于X=X*+X0的形式,A+b相当于是特解,后面那一项就是带系数的自由解,y可以取任意数,注意维度匹配即可。
所以,大家调用pinv求出M-P广义逆,然后用x=A+b + (I-A+A)y这个式子构造出通解就可以啦!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。