矩阵的逆及求逆矩阵的方法,可逆矩阵定理与判定方法,(非)奇异矩阵,方程Ax=b解法,Hilbert矩阵及其逆的求法,条件数(Condition Number)及其计算方法
矩阵的逆的定义:一个n×nn\times nn×n的矩阵AAA是可逆的,如果存在一个n×nn\times nn×n的矩阵CCC使得:
CA=I,且AC=ICA=I, 且 AC=ICA=I,且AC=I
其中I=InI=I_nI=In为n×nn\times nn×n的单位矩阵,此时矩阵CCC就是矩阵AAA的逆,矩阵AAA的逆记为矩阵A−1A^{-1}A−1。若矩阵AAA可逆,那么它的逆是唯一的。
奇异矩阵与非奇异矩阵:
不可逆矩阵有时也叫奇异矩阵,可逆矩阵有时也成为非奇异矩阵。
求矩阵逆的方法:
把n×nn\times nn×n的方阵AAA与同样是n×nn\times nn×n的单位矩阵III排在一起,构成增广矩阵[AI][A \qquad I][AI],对此增广矩阵进行初等行变换,直到化简为[IA−1][I \qquad A^{-1}][IA−1],这样矩阵AAA的逆A−1A^{-1}A−1就出现在增广矩阵右边。如果不能做如上化简,则表明矩阵AAA没有逆。
可逆矩阵定理
假设矩阵AAA为n×nn\times nn×n的方阵,以下命题是等价的,即它们同时为真或同时为假:
- AAA是可逆矩阵;
- AAA行等价于nnn阶单位阵(即AAA经过若干次初等行变换可以变成nnn阶的III);
- A有nnn个主元位置;
- 方程Ax=0Ax=0Ax=0仅有平凡解;
- AAA的各列线性无关;
- 线性变换x∣→Axx|\rightarrow Axx∣→Ax是一对一的;
- 对RnR^nRn中任意bbb,方程Ax=bAx=bAx=b至少有一个解;
- AAA的各列生成RnR^nRn;
- 线性变换x∣→Axx|\rightarrow Axx∣→Ax把RnR^nRn映射到RnR^nRn;
- 存在n×nn\times nn×n矩阵CCC使得CA=ICA=ICA=I ;
- 存在n×nn\times nn×n矩阵DDD使得AD=IAD=IAD=I;
- ATA^TAT是可逆矩阵;
- AAA的列向量构成RnR^nRn的一个基;
- ColA=RnCol\space A=R^nCol A=Rn;
- dimColA=ndimCol\space A=ndimCol A=n;
- rankA=nrankA=nrankA=n;
- NulA={0}NulA=\{0\}NulA={0};
- dimNulA=0dimNul\space A=0dimNul A=0;
判断矩阵可逆的方法:
判断矩阵可逆的方法有很多,例如:
- 行列式判别法:若一个矩阵行列式不为零,则可逆;若行列式等于零,则不可逆。
- 若n×nn\times nn×n的矩阵AAA是可逆的,则对每一RnR^nRn中的bbb,方程Ax=bAx=bAx=b有唯一解x=A−1bx=A^{-1}bx=A−1b。
解方程Ax=bAx=bAx=b三种方法:
- 如果n×nn\times nn×n的矩阵AAA是可逆的,那么可以用MATLAB中的反斜杠求解:x=A\bx=A \backslash bx=A\b
A =1 24 7>> [n,n] = size(A)
n =2
n =2>> b = rand(n,1)
b =0.54690.9575>> x1= A\b //MATLAB中使用反斜杠“\”法直接求x
x1 =-1.91321.2300
- (此方法通用性好)不论矩阵AAA是否可逆的,可以先把矩阵AAA和矩阵bbb构成增广矩阵[Ab][A \qquad b][Ab],再把此增广矩阵化简为简化阶梯阵即可。
>> C = [A b]
C =1.0000 2.0000 0.54694.0000 7.0000 0.9575>> rref(C) // MATLAB中rref函数将矩阵化简为简化阶梯阵。
ans =1.0000 0 -1.91320 1.0000 1.2300
可见,化简得到的简化阶梯阵最后一列[−1.91321.2300]\begin{bmatrix}-1.9132\\1.2300\end{bmatrix}[−1.91321.2300]即为方程的解,与方法1结果相同。
- 如果n×nn\times nn×n的矩阵AAA是可逆的,可以求矩阵AAA的逆A−1A^{-1}A−1,则方程的解为:x=A−1bx=A^{-1}bx=A−1b
A =1 24 7>> Ai = inv(A) //函数inv求矩阵A的逆
Ai =-7 24 -1>> x2 = Ai * b
x2 =-1.91321.2300
可见解得的结果与上面两种方法相同。
关于Hilbert矩阵及其逆的求法:
该矩阵为方阵,中任意元素表示为Aij=1i+j−1A_{ij}=\frac {1}{i+j-1}Aij=i+j−11。Hilbert矩阵是高度病态的,任何一个元素发生一点变动,整个矩阵的行列式的值和逆矩阵都会发生巨大变化,病态程度和阶数相关。
Hilbert矩阵(HHH)阶数越大,其病态程度越严重,使用浮点数计算来解方程Hx=bHx=bHx=b的误差就越大。
MATLAB里面有内置函数invhilb(n)
来计算n阶Hilbert矩阵的逆,输出的解为精确解,如下:
>> H = hilb(5) //生成5阶Hilbert矩阵
H =1 1/2 1/3 1/4 1/5 1/2 1/3 1/4 1/5 1/6 1/3 1/4 1/5 1/6 1/7 1/4 1/5 1/6 1/7 1/8 1/5 1/6 1/7 1/8 1/9 >> invhilb(5) //求5阶Hilbert矩阵逆的精确解
ans =25 -300 1050 -1400 630 -300 4800 -18900 26880 -12600 1050 -18900 79380 -117600 56700 -1400 26880 -117600 179200 -88200 630 -12600 56700 -88200 44100
病态矩阵与良态矩阵:
一个可逆矩阵是病态的(ill-conditioned),即中的某些元素稍作改变就会变成奇异矩阵(不可逆矩阵),矩阵的逆和以其为系数矩阵的方程组的解对微小的扰动十分敏感,这类矩阵叫病态矩阵,或接近奇异的矩阵。这类矩阵会给数值求解带来很大困难。
矩阵病态的反面是良态(well-conditioned),关于良态矩阵与病态矩阵的判断,可以使用条件数(Condition Number)作为依据,见下文。
在MATLAB中实现上面三种方法,对于求解存在该类矩阵的方程(如Ax=bAx=bAx=b中AAA为Hilbert矩阵),精确度都是不太够的,可能会有warning。
>> A = hilb(20) //生成20阶的Hilbert矩阵
A =Columns 1 through 51 1/2 1/3 1/4 1/5 1/2 1/3 1/4 1/5 1/6 1/3 1/4 1/5 1/6 1/7 1/4 1/5 1/6 1/7 1/8 1/5 1/6 1/7 1/8 1/9 1/6 1/7 1/8 1/9 1/10 1/7 1/8 1/9 1/10 1/11 1/8 1/9 1/10 1/11 1/12 1/9 1/10 1/11 1/12 1/13 1/10 1/11 1/12 1/13 1/14 1/11 1/12 1/13 1/14 1/15 1/12 1/13 1/14 1/15 1/16 1/13 1/14 1/15 1/16 1/17 1/14 1/15 1/16 1/17 1/18 1/15 1/16 1/17 1/18 1/19 1/16 1/17 1/18 1/19 1/20 1/17 1/18 1/19 1/20 1/21 1/18 1/19 1/20 1/21 1/22 1/19 1/20 1/21 1/22 1/23 1/20 1/21 1/22 1/23 1/24 Columns 6 through 101/6 1/7 1/8 1/9 1/10 1/7 1/8 1/9 1/10 1/11 1/8 1/9 1/10 1/11 1/12 1/9 1/10 1/11 1/12 1/13 1/10 1/11 1/12 1/13 1/14 1/11 1/12 1/13 1/14 1/15 1/12 1/13 1/14 1/15 1/16 1/13 1/14 1/15 1/16 1/17 1/14 1/15 1/16 1/17 1/18 1/15 1/16 1/17 1/18 1/19 1/16 1/17 1/18 1/19 1/20 1/17 1/18 1/19 1/20 1/21 1/18 1/19 1/20 1/21 1/22 1/19 1/20 1/21 1/22 1/23 1/20 1/21 1/22 1/23 1/24 1/21 1/22 1/23 1/24 1/25 1/22 1/23 1/24 1/25 1/26 1/23 1/24 1/25 1/26 1/27 1/24 1/25 1/26 1/27 1/28 1/25 1/26 1/27 1/28 1/29 Columns 11 through 151/11 1/12 1/13 1/14 1/15 1/12 1/13 1/14 1/15 1/16 1/13 1/14 1/15 1/16 1/17 1/14 1/15 1/16 1/17 1/18 1/15 1/16 1/17 1/18 1/19 1/16 1/17 1/18 1/19 1/20 1/17 1/18 1/19 1/20 1/21 1/18 1/19 1/20 1/21 1/22 1/19 1/20 1/21 1/22 1/23 1/20 1/21 1/22 1/23 1/24 1/21 1/22 1/23 1/24 1/25 1/22 1/23 1/24 1/25 1/26 1/23 1/24 1/25 1/26 1/27 1/24 1/25 1/26 1/27 1/28 1/25 1/26 1/27 1/28 1/29 1/26 1/27 1/28 1/29 1/30 1/27 1/28 1/29 1/30 1/31 1/28 1/29 1/30 1/31 1/32 1/29 1/30 1/31 1/32 1/33 1/30 1/31 1/32 1/33 1/34 Columns 16 through 201/16 1/17 1/18 1/19 1/20 1/17 1/18 1/19 1/20 1/21 1/18 1/19 1/20 1/21 1/22 1/19 1/20 1/21 1/22 1/23 1/20 1/21 1/22 1/23 1/24 1/21 1/22 1/23 1/24 1/25 1/22 1/23 1/24 1/25 1/26 1/23 1/24 1/25 1/26 1/27 1/24 1/25 1/26 1/27 1/28 1/25 1/26 1/27 1/28 1/29 1/26 1/27 1/28 1/29 1/30 1/27 1/28 1/29 1/30 1/31 1/28 1/29 1/30 1/31 1/32 1/29 1/30 1/31 1/32 1/33 1/30 1/31 1/32 1/33 1/34 1/31 1/32 1/33 1/34 1/35 1/32 1/33 1/34 1/35 1/36 1/33 1/34 1/35 1/36 1/37 1/34 1/35 1/36 1/37 1/38 1/35 1/36 1/37 1/38 1/39 >> b = rand(20,1) //生成b向量
b =687/712 589/3737 6271/6461 581/607 614/1265 1142/1427 689/4856 407/965 1065/1163 61/77 1966/2049 3581/5461 489/13693 439/517 283/303 1481/2182 979/1292 541/728 1645/4194 1406/2145 >> x1 = A\b //反斜杠法求解x=A\b
Warning: Matrix is close to singular or badly scaled. Results may be
inaccurate. RCOND = 5.231543e-20. //此处为Warning,x1 =
-3424659463
528255780716
-19975903782848
321018859628437
-2688760131266522
12761814815871434
-34399090053517208
45897097341921456
-7254237859641766
-37322034685407312
-49284163552153728
217508096052998944
-205446702755182752
64773453754244512
-105964986075521504
193373000517961920
-30851727609549800
-163776311038511840
135720005301748528
-33347024092943792 R = rref([A b]); x3 = R(:,21) //方法2求解,化简阶梯阵的方法,此方法最通用,没有warning。
x3 =0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 >> x2=inv(A)*b //方法3求解,矩阵A的逆乘b
Warning: Matrix is close to singular or badly scaled. Results may be
inaccurate. RCOND = 9.542396e-20. x2 =
-3095618963
478515839234
-18128046963749
291709089884240
-2443748498671269
11565944181737902
-30772016457394916
38422934259310336
6062876912518655
-64009870499747464
-815625744960023
161923881096513024
-174734421275108320
49731260512141016
-57082196217625456
111820626128154624
24957912964649792
-173285108058004640
129261793086585504
-30878300969326916
误差讨论:
上面的Warning中的“RCOND”表示条件数的倒数(reciprocal),如果这个值很小,则表示条件数很大,也就是说矩阵求解的误差越大。
条件数很大的矩阵是病态矩阵,对矩阵中元素很小的扰动会对结果产生很大影响。上面对含有Hilbert矩阵的方程进行求解过程中得到的RCOND = 9.542396e-20
或RCOND = 5.231543e-20
都是很小的,表示条件数都非常大,所以,产生上面报警的计算是非常不精确的。
由于MATLAB中的反斜杠求解Ax=bAx=bAx=b(矩阵AAA是可逆方阵)算法是使用了部分主元法的LU分解法,使用部分主元法的算法计算量较小,且舍入误差较小。所以这种方法误差总体来说较小。
如果使用inv(A)先求A的逆,再x2=inv(A)*b的话,MATLAB先计算inv(A),也就是求解Ax=eiAx=e_iAx=ei,eie_iei是单位矩阵III中的每一列向量,这样每一列向量eie_iei对应的解向量xxx求出后,拼合起来就是矩阵AAA的逆A−1A^{-1}A−1,最后计算A−1bA^{-1}bA−1b。可见此种计算方法的计算量很大,所以每步的误差积累更多,总体误差更大。
对于使用rref( )求增广矩阵的简化阶梯式的方法,由于这种算法不检测矩阵是病态还是良态(所以不会提示矩阵是否是近奇异的或者病态的),仅在小的矩阵中比较精确,矩阵很大则计算很慢,但是这并不是说这种方法就最精确,其误差和上述两种方法在一个量级,但是一般不使用这种方法。
关于条件数(Condition Number)
条件数越大,矩阵越接近于奇异。单位矩阵的条件数是1,奇异矩阵的条件数为无穷大。在极端情况下,矩阵计算程序可能无法区别奇异矩阵与病态矩阵。
当条件数很大时,矩阵计算可能产生很大的误差。
定义:矩阵AAA的条件数(Condition Number)为∣∣A∣∣∣∣A−1∣∣||A||\space ||A^{-1}||∣∣A∣∣ ∣∣A−1∣∣。
计算方法有很多种,如:矩阵AAA是可逆矩阵,其最大奇异值和最小奇异值之比σ1σn\frac {\sigma_1}{\sigma_n}σnσ1就是矩阵AAA的条件数。
MATLAB中计算矩阵条件数的函数:cond( )。例如:
A =0.7060 0.8235 0.4387 0.4898 0.27600.0318 0.6948 0.3816 0.4456 0.67970.2769 0.3171 0.7655 0.6463 0.65510.0462 0.9502 0.7952 0.7094 0.16260.0971 0.0344 0.1869 0.7547 0.1190>> cond(A) //计算矩阵A的条件数
ans =7.4466
矩阵的逆及求逆矩阵的方法,可逆矩阵定理与判定方法,(非)奇异矩阵,方程Ax=b解法,Hilbert矩阵及其逆的求法,条件数(Condition Number)及其计算方法相关推荐
- c语言求逆程序,求逆矩阵的C语言源程序CINV
详细的求逆矩阵的算法,可以直接使用 /*文件名 CINV.C,徐士良编写 复矩阵求逆,其中ar为复矩阵实部对应的二维数组首地址,ai为虚部数组的首地址, 求逆矩阵后的结果覆盖原数组*/ #includ ...
- 线性代数 --- 用条件数(condition number)来判断矩阵是否可逆
条件数(condition number) 在很长的一段时间里,我们判断一个矩阵是否可逆,都是根据矩阵的行列式det是否为0,来判断的.如果行列式的值为0,则我们认定该矩阵为奇异矩阵,即不可逆矩阵.如 ...
- 7-1 sdut-求一个3*3矩阵对角线元素之和7-2 求矩阵各行元素之和7-3 sdut- 对称矩阵的判定7-4 sdut- 杨辉三角7-5 sdut- 鞍点计算7-6 矩阵转置
7-1 sdut-C语言实验-求一个3*3矩阵对角线元素之和 分数 12 全屏浏览题目 切换布局 作者 马新娟 单位 山东理工大学 给定一个3*3的矩阵,请你求出对角线元素之和. 输入格式: 按照行优 ...
- 怎么用计算机求逆矩阵,计算机是怎么求解线性方程的(矩阵乘和求逆)
上回我们说到,高斯老哥用消元法解线性方程,大致步骤呢就是给系数矩阵消元,运气好点呢直接整出上三角系数矩阵,得到方程组的唯一解,运气不行呢,消着消着发现整不出上三角,这时就得再讨论方程是有多解还是无解. ...
- matlab中的a逆怎么使用方法,Matlab求逆矩阵怎么操作?求逆矩阵方法详解
现在使用Matlab的朋友越来越多,而接下里的这篇文章小编就带来了Matlab求逆矩阵的操作方法,感兴趣的朋友就跟小编一起来学习一下吧. Matlab求逆矩阵的操作方法 方法一:用inv()函数求矩阵 ...
- 下三角矩阵的逆矩阵_上三角或下三角矩阵的逆矩阵能否简便方法求出??只有主副对角线不为0的矩阵能否直接写出逆矩阵。...
1.上三角矩阵的逆矩阵 将上三角矩阵划分成块矩阵,如上图所示,则其逆矩阵结果如下回图.答 2.下三角矩阵的逆矩阵 将下三角矩阵划分成块矩阵,如上图所示,则其逆矩阵结果如下图. 3.只有主对角线不为零的 ...
- C++设计矩阵,实现矩阵相乘和求逆矩阵
矩阵变换是机器人学的基础,所以Jungle把这一节内容划分到"工业机器人"栏目.这一节Jungle用C++设计了矩阵的类Matrix,并设计了3个方法: 矩阵相加add 矩阵相乘m ...
- python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵
原标题:Python使用numpy计算矩阵特征值.特征向量与逆矩阵 Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv() ...
- C语言 n*n矩阵求值及求逆矩阵
求出矩阵的值以及输出逆矩阵,英语不好,略拗口. 上代码: #include<stdio.h> #include<string.h> #include<math.h> ...
- 机器学习常见求逆矩阵的方法
机器学习的常见求解逆矩阵的方法 高斯消元法 LU分解法 SVD分解法 QR分解法 高斯消元法 高斯消元法是最经典也是最广为人知的一种矩阵求逆方法,但是在现实应用中很少用到高斯消元法来进行矩阵的逆矩阵的 ...
最新文章
- Android 自定义View (入门 篇) 的使用
- linux的帮助命令及区别,Linux命令及帮助
- 源代码管理的新15条建议
- 使用Logstash filter grok过滤日志文件
- Angular rxjs operators 笔记
- centos7 docker安装和使用_入门教程
- 《Go 语言程序设计》读书笔记 (五) 协程与通道
- 中望cad能编写lisp吗_宁水集团:中望CAD解决方案增强设计创新力,加速转型促发展...
- HackingTeam重磅炸弹: 估值超1000万美金带有军火交易性质的木马病毒以及远控源码泄露
- 数学建模-灰色预测模型基本原理及其编程实现
- java反应器构型_27种反应器的结构及原理,你想了解的都在这里
- 重装系统之制作U盘启动盘 - 一盘通装
- 【集合论】关系闭包 ( 关系闭包求法 | 关系图求闭包 | 关系矩阵求闭包 | 闭包运算与关系性质 | 闭包复合运算 )
- spring mvc 扫描与注解
- Pyghon文件操作
- mysql 集群 运维_【MySQL运维】Canal集群模式与多数据库同步部署
- ixgbe 如何开启vf
- 轻量的web框架Bottle
- 使用 Vert.x Maven 插件快速创建项目
- ThinkCMF知识点汇总
热门文章
- 安卓Systrace工具使用流程
- 【永恒之蓝】最新勒索软件WannaCrypt病毒感染前后应对措施
- STM32CUBEIDE USB下载总是连接不上 总是USBD_BUSY
- 磊科linux无线网卡驱动安装步骤,磊科nw360无线网卡安装教程(附磊科nw360驱动下载)...
- adprw指令通讯案例_S71200 ModbusTCP 通讯配置向导说明
- 搭建自己的wiki系统
- jenkins下载安装及环境搭建
- Hive beeline连接hiveserver2报错:User: root is not allowed to impersonate root
- JUCE入门级教程01——界面设计(细分12块)
- 晨曦记账本记账收支,统计结余