详细介绍: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 中的含义:

img

img

也就是说,A \ b A\backslash bA\b调用若干算法进行运算,每种算法都可能存在一定缺陷,无法处理某些极端情况。)可参考其内置算法原理:就是的方法行求解囊括奇异矩阵的方程组,但可能会出错,且误差可能非常大。(此例告诫大家,不应认为 MATLAB 计算的结果均为准确,MATLAB 不过

这里涉及数值计算方法领域中矩阵的性态问题。我们可直观感受如下:

假设如下方程组:

{ 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,提出四个条件:

  1. A B A = A ABA = AABA=A
  2. B A B = B BAB = BBAB=B
  3. ( A B ) ∗ = A B (AB)^* = AB(AB)=AB(其中 ∗ *表示共轭转置)
  4. ( 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+矩阵。官方文档:

可查阅官方文档查看具体应用实例。

若求出 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\|AXb最小的最小二乘解,且在所有解中其范数∥ 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+(IA+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}invpinv \text{pinv}pinvx − 1 x^{-1}x1均会出现该问题,此时可考虑用以下代码解算:

function invM = invbc(M)
D = sqrt(diag(M));
K = max(D)./D;
K = diag(K);
invM = K/(K*M*K)*K;
return

参考

严恭敏老师工具箱,里面可下载工具箱 matlab [源码]。

此处感谢严老师无私分享!


via:

posted @ 2026-01-14 21:58  yangykaifa  阅读(13)  评论(0)    收藏  举报