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


也就是说,A \ b A\backslash bA\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 AA为病态矩阵。
若遇到非方阵,或不可求逆的方阵,要求解A X = b AX = bAX=b并避免奇异值导致 MATLAB 产生错误,可采用“伪逆”解决该挑战。
广义逆矩阵:
对任意矩阵 A AA,提出四个条件:
- A B A = A ABA = AABA=A
- B A B = B BAB = BBAB=B
- ( A B ) ∗ = A B (AB)^* = AB(AB)∗=AB(其中 ∗ *∗表示共轭转置)
- ( B A ) ∗ = B A (BA)^* = BA(BA)∗=BA
若存在矩阵 G GG满足上述部分或全部条件,则G GG 可称为 A AA的广义逆矩阵。最常用的四种广义逆矩阵定义如下:
- 1 - 逆:仅满足条件 1 的矩阵G GG,记为 A ( 1 ) A^{(1)}A(1)
- 2 - 逆:满足条件 1 和 2 的矩阵G GG,记为 A ( 1 , 2 ) A^{(1,2)}A(1,2)
- 3 - 逆:满足条件 1 和 3 的矩阵G GG,记为 A ( 1 , 3 ) A^{(1,3)}A(1,3)
- 4 - 逆(Moore-Penrose 广义逆):同时满足上述四个条件的矩阵G GG,记为 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 = bAX=b可有另一种思路:当方程组A X = b AX = bAX=b 有解时,x = A + b x = A^+bx=A+b是其中一个特解;当方程组无解时,x = A + b x = A^+bx=A+b 是使残差 ∥ A X − b ∥ \|AX - b\|∥AX−b∥最小的最小二乘解,且在所有解中其范数∥ x ∥ \|x\|∥x∥ 最小。
此处,通解的表达式仍类似于X = X ∗ + X 0 X = X^* + X_0X=X∗+X0 的形式,A + b A^+bA+b相当于特解,后一项为带系数的自由解,y yy可取任意数,注意维度匹配即可。
因此,调用 pinv \text{pinv}pinv求出 M-P 广义逆后,利用x = A + b + ( I − A + A ) y x = A^+b + (I - A^+A)yx=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 报错 “矩阵接近奇异值,或者缩放错误。结果可能不准确”_矩阵接近奇异值,或者缩放错误。结果可能不准确对吗 - CSDN 博客
https://blog.csdn.net/lyxleft/article/details/83998246在使用 matlab 对矩阵求逆时出现了 “警告:矩阵接近奇异值,或者缩放错误。结果可能不准确_matlab 矩阵求逆接近奇异值 - CSDN 博客
https://blog.csdn.net/weixin_41692946/article/details/120912551警告:矩阵接近奇异值,或者缩放错误。结果可能不准确_矩阵接近奇异值或缩放错误如何解决 - CSDN 博客
https://blog.csdn.net/weixin_42599354/article/details/129999786matlab 使用出现矩阵为奇异值、接近奇异值或缩放错误。结果可能不准确。RCOND = NaN。 - 知乎
https://zhuanlan.zhihu.com/p/674691392

浙公网安备 33010602011771号