上一篇博文讲到:《方程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这个式子构造出通解就可以啦!
————————————————
版权声明:本文为CSDN博主「奔跑的Yancy」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lyxleft/article/details/83998246

Moore-Penrose广义逆:可解决MATLAB报错“矩阵接近奇异值,或者缩放错误。结果可能不准确”相关推荐

  1. matlab使用出现矩阵为奇异值、接近奇异值或缩放错误。结果可能不准确。RCOND = NaN。

    使用griddata插值函数时出现以下错误 警告: 矩阵为奇异值.接近奇异值或缩放错误.结果可能不准确.RCOND = NaN. 原因:新输入参数维度(行数)与原表格参数维度(行数)不同造成的,导致有 ...

  2. php数据库报错1046怎么解决,DZ报错MySQL Query Error Errno:1046错误的解决办法

    这篇文章主要为大家详细介绍了DZ报错MySQL Query Error Errno:1046错误的解决办法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴. DZ报 ...

  3. 解决Matlab报错:MATLAB 先前因底层图形错误而崩溃。为避免在此会话期间再次崩溃,MATLAB 将使用软件 OpenGL 而不再使用图形硬件。

    报错如下: -----------------------------------------------------------------------Assertiondetected at We ...

  4. 解决Matlab报错:警告: MATLAB 先前因底层图形错误而崩溃。为避免在此会话期间再次崩溃,MATLAB 将使用软件 OpenGL 而不再使用图形硬件。

    这种情况下一般是显卡出现了问题,可能最基础的画图都会报错,崩溃.(本人用的是R2016a版本,之前可以正常使用) 这个时候进入设备管理器更新你电脑的显卡驱动,重启MATLAB就可以了!

  5. 解决数据库报错:Table ‘*.*‘ doesn‘t exist错误

    错误详情 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'jd_item.item' does ...

  6. 【报错解决】matlab报错:缺少动态链接库VCOMP100.DLL

    问题分析: matlab报错:缺少动态链接库VCOMP100.DLL 在编译某mexw64文件时可能出现. 原因:windows10版本的C:\Windows\System32目录下动态链接库已经是V ...

  7. MATLAB报错:未定义函数或变量解决办法

    MATLAB报错:未定义函数或变量解决办法 edit(fullfile(matlabroot,'examples','nnet','main','此处放未定义函数')) 比如: edit(fullfi ...

  8. matlab报错问题处理,函数或变量无法识别,不受支持的符号、不可见的字符或非 ASCII 字符的粘贴———卸载之前

    matlab报错问题处理,, 文本字符无效.请检查不受支持的符号.不可见的字符或非 ASCII 字符的粘贴. matlab里面缺少自带函数处理办法: 1.比较好的方法是重装. 2.也可以缺哪个文件,就 ...

  9. Matlab报错:错误使用 rgb2gray>parse_inputs (第 79 行) MAP 必须为 m x 3 的数组。请对 RGB 和灰度图像使用 im2gray。

    拟解决问题: Matlab报错:错误使用 rgb2gray>parse_inputs (第 79 行) MAP 必须为 m x 3 的数组.请对 RGB 和灰度图像使用 im2gray. 下述程 ...

最新文章

  1. python函数名字_Python每日3题-为什么函数名字可以当做参数用?
  2. DL之CNN:基于CRNN_OCR算法(keras,CNN+RNN)利用数据集(torch,mdb格式)训练来实现新图片上不定长度字符串进行识别—预测过程
  3. Netty自定义协议
  4. 使用resNet网络 进行图像分类(jupyter notebook)
  5. PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
  6. js控制 html.textboxfor,javascript - Html.TextBoxFor regex is not working - Stack Overflow
  7. 【渝粤题库】广东开放大学 商务交际听说 形成性考核
  8. MySQL删除重复数据保留1条
  9. css样式,层叠顺序属性z-index
  10. 软件体系结构期末复习总结
  11. 发展恐怖故事–邮件炸弹
  12. 最新最全的云开发入门教程,微信小程序云开发,云函数,云数据库学习,微信小程序云开发扩展功能学习
  13. 利用分析仪测量二极管的伏安特性
  14. Mixamo不仅是可商用的免费模型动画库,还是一个在线绑定蒙皮神器
  15. php sftp上传图片,SFTP远道文件上传
  16. webrtc下的媒体网络连接STUN、TURN、UDP、TCP
  17. [万字长文]使用 React 重写学成在线前端项目 I 代码完整可运行,步骤有详解
  18. zabbix连接mysql_zabbix的简单操作(监控客户端MySQL数据包库)
  19. Redis安装(完整版)
  20. cocos2d-js 游戏源码

热门文章

  1. netty框架_Netty实战:设计一个IM框架
  2. vector/list/map/set的插入、删除、遍历 - remove\erase函数
  3. Opencv3.4.1中csSaveImage
  4. Python-OpenCV 处理图像(四):图像直方图和反向投影
  5. Java中的10颗语法糖
  6. 10个实用的但偏执的Java编程技术
  7. Octave matlab中运行.m文件方式对比
  8. LDA-math-神奇的Gamma函数
  9. 深度学习Deep Learning 相关库简介
  10. Linux内存管理Linux Memory Management Notes