注:本文为 “ MATLAB 报错” 相关合辑。
略作重排,未整理去重。
如有内容异常,请看原文。
Moore-Penrose 广义逆:可解决 MATLAB 报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”
奔跑的 Yancy 于 2018-11-12 21:38:15 发布
当
A
X
=
b
AX = b
AX=b 线性方程组是一个病态方程组,或者
A
A
A 是奇异矩阵(即
det
(
A
)
=
0
\det(A) = 0
det(A)=0,不可逆),没法求逆,用不了
inv
(
A
)
\text{inv}(A)
inv(A) 方法只能用
A
\
b
A\backslash b
A\b,此时 MATLAB 会报错 “矩阵接近奇异值,或者缩放错误。结果可能不准确”。
这并非 MATLAB 本身的问题,而是其内置算法的鲁棒性局限所致,直接使用 A \ b A\backslash b A\b 方法无法处理这一棘手问题。缺乏矩阵论或数值计算方法基础的同学可能对此难以理解。
本文借助 Moore-Penrose 广义逆解决该问题,帮助理解带奇异矩阵的病态方程组的求解方法。
首先我们来看 mldivide、\ 在 MATLAB 中的含义:


也就是说, A \ b A\backslash b A\b 的方法可以求解包含奇异矩阵的方程组,但可能会出错,且误差可能非常大。(此例告诫我们,不应认为 MATLAB 计算的结果均为准确,MATLAB 不过是调用若干算法进行运算,每种算法都可能存在一定缺陷,无法处理某些极端情况。)可参考其内置算法原理:
- mldivide - 求解关于 x 的线性方程组 Ax = B - MATLAB
https://ww2.mathworks.cn/help/matlab/ref/double.mldivide.html
这里涉及数值计算方法领域中矩阵的性态问题。我们可直观感受如下:
假设如下方程组:
{ 0.1 x 1 + 0.2 x 2 = 0.3 0.2 x 1 + 0.4001 x 2 = 0.6001 \begin{cases} 0.1x_1 + 0.2x_2 = 0.3 \\ 0.2x_1 + 0.4001x_2 = 0.6001 \end{cases} {0.1x1+0.2x2=0.30.2x1+0.4001x2=0.6001
其精确解是 ( 1 , 1 ) (1, 1) (1,1)。
若对等式两边做极其微小的变化:
{ 0.1 x 1 + 0.2 x 2 = 0.3 0.2 x 1 + 0.4001 x 2 = 0.6002 \begin{cases} 0.1x_1 + 0.2x_2 = 0.3 \\ 0.2x_1 + 0.4001x_2 = 0.6002 \end{cases} {0.1x1+0.2x2=0.30.2x1+0.4001x2=0.6002
其精确解变为: ( 10 , − 2 ) (10, -2) (10,−2)。
极其微小的扰动导致方程的解产生巨大变动,我们称上述方程组为病态方程组,系数矩阵 A A A 为病态矩阵。
若遇到非方阵,或不可求逆的方阵,要求解 A X = b AX = b AX=b 并避免奇异值导致 MATLAB 产生错误,可采用“伪逆”解决该问题。
广义逆矩阵:
对任意矩阵 A A A,提出四个条件:
- A B A = A ABA = A ABA=A
- B A B = B BAB = B BAB=B
- ( A B ) ∗ = A B (AB)^* = AB (AB)∗=AB(其中 ∗ * ∗ 表示共轭转置)
- ( B A ) ∗ = B A (BA)^* = BA (BA)∗=BA
若存在矩阵 G G G 满足上述部分或全部条件,则 G G G 可称为 A A A 的广义逆矩阵。最常用的四种广义逆矩阵定义如下:
- 1 - 逆:仅满足条件 1 的矩阵 G G G,记为 A ( 1 ) A^{(1)} A(1)
- 2 - 逆:满足条件 1 和 2 的矩阵 G G G,记为 A ( 1 , 2 ) A^{(1,2)} A(1,2)
- 3 - 逆:满足条件 1 和 3 的矩阵 G G G,记为 A ( 1 , 3 ) A^{(1,3)} A(1,3)
- 4 - 逆(Moore-Penrose 广义逆):同时满足上述四个条件的矩阵 G G G,记为 A + A^+ A+,其具有唯一性
MATLAB 中自带的 pinv \text{pinv} pinv 方法可求解矩阵的 M-P 广义逆,即 A + A^+ A+ 矩阵。官方文档:
- pinv - 摩尔-彭罗斯伪逆 - MATLAB
https://ww2.mathworks.cn/help/matlab/ref/pinv.html
可查阅官方文档查看具体应用实例。
若求出 A + A^+ A+,则求解 A X = b AX = b AX=b 可有另一种思路:当方程组 A X = b AX = b AX=b 有解时, x = A + b x = A^+b x=A+b 是其中一个特解;当方程组无解时, x = A + b x = A^+b x=A+b 是使残差 ∥ A X − b ∥ \|AX - b\| ∥AX−b∥ 最小的最小二乘解,且在所有解中其范数 ∥ x ∥ \|x\| ∥x∥ 最小。
此处,通解的表达式仍类似于 X = X ∗ + X 0 X = X^* + X_0 X=X∗+X0 的形式, A + b A^+b A+b 相当于特解,后一项为带系数的自由解, y y y 可取任意数,注意维度匹配即可。
因此,调用 pinv \text{pinv} pinv 求出 M-P 广义逆后,利用 x = A + b + ( I − A + A ) y x = A^+b + (I - A^+A)y x=A+b+(I−A+A)y 构造通解即可。
在使用 matlab 对矩阵求逆时出现了“警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确
BUAA_YBX 于 2021-10-22 20:07:09 发布
在使用 matlab 对矩阵求逆时出现“警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确”
此时可用 pinv \text{pinv} pinv 代替 inv \text{inv} inv,即可解决该问题。
警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确
进击的 INS_er 于 2023-04-06 21:31:22 发布
用 MATLAB 求矩阵的逆的运算时,有时会出现“警告: 矩阵接近奇异值,或者缩放错误。结果可能不准确”的情况,使用 inv \text{inv} inv、 pinv \text{pinv} pinv、 x − 1 x^{-1} x−1 均会出现该问题,此时可考虑用以下代码解算:
function invM = invbc(M)
D = sqrt(diag(M));
K = max(D)./D;
K = diag(K);
invM = K/(K*M*K)*K;
return
参考
严恭敏老师工具箱,里面可下载工具箱 matlab [源码]。
- PSINS(高精度捷联惯导算法)-PSINS
https://www.psins.org.cn/
此处感谢严老师无私分享!
via:
-
Moore-Penrose 广义逆:可解决 MATLAB 报错 “矩阵接近奇异值,或者缩放错误。结果可能不准确”_矩阵接近奇异值,或者缩放错误。结果可能不准确对吗 - 优快云 博客
https://blog.youkuaiyun.com/lyxleft/article/details/83998246 -
在使用 matlab 对矩阵求逆时出现了 “警告:矩阵接近奇异值,或者缩放错误。结果可能不准确_matlab 矩阵求逆接近奇异值 - 优快云 博客
https://blog.youkuaiyun.com/weixin_41692946/article/details/120912551 -
警告:矩阵接近奇异值,或者缩放错误。结果可能不准确_矩阵接近奇异值或缩放错误如何解决 - 优快云 博客
https://blog.youkuaiyun.com/weixin_42599354/article/details/129999786 -
matlab 使用出现矩阵为奇异值、接近奇异值或缩放错误。结果可能不准确。RCOND = NaN。 - 知乎
https://zhuanlan.zhihu.com/p/674691392
8868

被折叠的 条评论
为什么被折叠?



