MATLAB 报错 | “矩阵接近奇异值,或者缩放错误。结果可能不准确”

注:本文为 “ 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 中的含义:

img

img

也就是说, A \ b A\backslash b A\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 A A 为病态矩阵。

若遇到非方阵,或不可求逆的方阵,要求解 A X = b AX = b AX=b 并避免奇异值导致 MATLAB 产生错误,可采用“伪逆”解决该问题。

广义逆矩阵:

对任意矩阵 A A A,提出四个条件:

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

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

若求出 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\| AXb 最小的最小二乘解,且在所有解中其范数 ∥ 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+(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} inv pinv \text{pinv} pinv x − 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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值