原创 (狂补数学3)用MATLAB解超定方程

2009-3-25 22:39 5298 2 2 分类: 软件与OS

  wiki解释:超定方程

///////////////////////////////////////////////// 

根据解的存在情况,线性方程可以分为:


  • 有唯一解的恰定方程组,
  • 解不存在的超定方程组,
  • 有无穷多解的欠定方程组。
//////////////////////////////////////////////////
  对于方程组Ax=b,A为n×m矩阵,如果A列满秩,且n>m。则方程组没有精确解,此时称方程组为超定方程组。线性超定方程组经常遇到的问题是数
据的曲线拟合。对于超定方程,在MATLAB中,利用左除命令(x=A\b)来寻求它的最小二乘解;还可以用广义逆来求,即x=pinv(A),所得的解
不一定满足Ax=b,x只是最小二乘意义上的解。左除的方法是建立在奇异值分解基础之上,由此获得的解最可靠;广义逆法是建立在对原超定方程直接进行
householder变换的基础上,其算法可靠性稍逊与奇异值求解,但速度较快;
//////////////////////////////
独立方程个数大于独立的未知参数的个数的方程,称为超定方程,在matlab里面有三种方法求解,
一是用伪逆法求解,x=pinv(A)*b,二是用左除法求解,x=A\b,三是用最小二乘法求解,
x=lsqnonneg(A,b)
//////////////////////////////////

(3)矩阵求逆


行数和列数相等的矩阵称为方阵,只有方阵有逆矩阵。方阵的求逆函数为:


B=inv(A)


该函数返回方阵A的逆阵。如果A不是方阵或接近奇异的,则会给出警告信息。


在实际应用中,很少显式的使用矩阵的逆。在MATLAB中不是使用逆阵x=inv(A)*B来求线性方程组Ax=B的解,而是使用矩阵除法运算x=A\B来求解。因为MATLAB设计求逆函数inv时,采用的是高斯消去法,而设计除法解线性方程组时,并不求逆,而是直接采用高斯消去法求解,有效的减小了残差,并提高了求解的速度。因此,MATLAB推荐尽量使用除法运算,少用求逆运算。


(4)除法运算


在线性代数中,只有矩阵的逆的定义,而没有矩阵除法的运算。而在MATLAB中,定义了矩阵的除法运算。矩阵除法的运算在MATLAB中是一个十分有用的运算。根据实际问题的需要,定义了两种除法命令:左除和右除。


矩阵左除:


C=A\BC=mldivide(A,B)


矩阵右除;


C=A/BC=mrdivide(A,B)


通常矩阵左除不等于右除,如果A是方阵,A\B等效于A的逆阵左乘矩阵B。也就是inv(A)*B。如果A是一个nn矩阵,B是一个n维列向量,或是有若干这样的列的矩阵,则A\B就是采用高斯消去法求得的方程AX=B的解。如果A接近奇异的,MATLAB将会给出警告信息。


如果A是一个mn矩阵,其中m不等于nB是一个m维列向量,或是由若干这样的列的矩阵,则X=A\B是不定或超定方程组AX=B的最小二乘解。通过QR分解确定矩阵A的秩k,方程组的解X每一列最多只有k个非零元素。如果k<n,方程的解是不唯一的,用矩阵除法求得的最小二乘解是这种类型解中范数最小的。


B/A大体等效于B*inv(A)
(B
右乘A的逆阵),但在计算方法上存在差异,更精确的,B/A=(AT\BT)T


输入:A=[1
2 3;4 5 7;4 7 9];B=[1
3 7;3 5 7;8 5 1];


矩阵左除。输入:A\B


显示:ans
=


 
-0.7500   -0.5000   -2.0000


  
5.7500   -3.5000  -18.0000


 
-3.2500    3.5000   15.0000


矩阵右除。输入:A/B


显示:ans
=


 
-0.0217    0.4565   -0.0435


  
0.6522    0.3043    0.3043


 
-0.5652    1.8696   -0.1304




文章评论0条评论)

登录后参与讨论
相关推荐阅读
zhangshaobing517_935512703 2011-03-21 01:28
KC24RT-300调试笔记
项目中需要使用LED驱动器,主要是为了让一串LED发出的光照一致,所以在试验中采用LED串联的方式比较好点,LED并联容易导致LED发光的 不均匀以及寿命减少。我在项目中采用金升阳公司的KC24RT-...
zhangshaobing517_935512703 2010-11-19 14:53
线程中CreateEvent和SetEvent及WaitForSingleObj
首先介绍CreateEvent是创建windows事件的意思,作用主要用在判断线程退出,程锁定方面.CreateEvent 函功能描述:创建或打开一个命名的或无名的事件对象.EVENT有两种状态:发信...
zhangshaobing517_935512703 2010-11-15 13:29
VS2008 BEGIN
Visual Studio 2008环境与VC6.0的环境存在着比较大的区别,下面就一些小小的区别在这里做一些探讨,欢迎指教!1、如果是调试控制台程序,很多时候点击“启动调试”后是一闪而过,此时可有两...
zhangshaobing517_935512703 2010-11-01 20:38
使用MFC的数组类
 MFC的数组类支持的数组类似于C++中的常规数组,可以存放任何数据类型。C++的常规数组在使用前必须将其定义成能够容纳所有可能需要的元素,而MFC数组类创建的对象可以根据需要动态地增大或减小,数组的...
zhangshaobing517_935512703 2010-09-07 13:14
循环
 循环设计的注意的事情:(1)双重循环的跳出问题,break只挑出所在的循环,如果使用双层FOR循环,单个BREAK就不可能跳出所有的双层(2)在迭代的时候,注意起始和终止的条件,尤其是终止问题(3)...
zhangshaobing517_935512703 2010-09-02 01:09
图像处理改进
1.特征点提取的算法  标志点的提取算法对结果的影响虽然没有经过试验或者计算的推算,每1个pix的偏差对结果的影响有多大,但是不可避免的,要想获得高精度的  测量结果,高精度的提取对结果的影响还是很大...
广告
EE直播间
更多
我要评论
0
2
广告
关闭 热点推荐上一条 /7 下一条