本文针对n个未知数,大于n个方程组。求解未知数的问题,matlab代码。
一、首先,请注意,本文说的是线性超定方程组,方程组是线性的,不含有未知数的出发以及乘方。
求线性超定方程组,有这么几种方法:
1. 直接法
2. QR分解
3. SVD分解
4. 迭代法
本文首先选用直接法求解线性方程组,计算效率快,运行方便,代码短。
二、以2个未知数,四个方程为例。也可以是n个未知数,大于n个方程组求解。
随意一个方程组:
上式可写:
代码如下所示:Matlab
clc;
clear;
close all;
A=[2,4;3,-7;10,-15;4,11]; %方程组系数矩阵
B=[11;-14;-29;31]; %方程组右边的列向量
X=A\B;
运行结果如下所示:
0.8440
2.4779
matlab能使用左除运算智能选择算法解线性方程组(若无解,则求得的是最小二乘意义下的解);
此外,还可以利用广义逆求解:
程序代码如下所示:
clc;
clear;
close all;
A=[2,4;3,-7;10,-15;4,11]; %方程组系数矩阵
B=[11;-14;-29;31]; %方程组右边的列向量
X=pinv(A)*B;
运行结果也是:
0.8440
2.4779
广义逆求解也是一个满足最小二乘意义的解。
三、对于左除求解和广义逆求解两个结果,我们来看看残差的2范数是否最小
分别求得两个方法的残差二范数:
norm(B-A*X1) norm(B-A*X2)
将求得的残差二范数进行相减:
norm(B-A*X1)-norm(B-A*X2)
即可得到残差的二范数大小。
可以得出如下结论:
左除求解和广义逆求解超定方程解:两个解都是最小二乘意义下的最优解,不过用广义逆求的解更佳,因为其中0元素较多(即最小二乘意义下的所有解中欧式范数最小的解),但是,左除计算效率较快,矩阵求逆的效率太慢。利用广义逆求解时间花费更长。
四、另外需要知道的是:
最小二乘法求解的是最优解,并不是解析解。只是的取最小的时候的最优解。
最小二乘法的英文是The least square method,二乘指的是平方。可以很好的理解最小的定义。
五、选用SVD分解求矩阵的最小二乘解
上述理解来自于https://blog.csdn.net/liyuanbhu/article/details/53240209
svd函数代码的理解来自于:https://blog.csdn.net/qq278672818/article/details/62038635:如下
代码如下:
clc;
clear;
close all;
A=[2,4;3,-7;10,-15;4,11];%方程组系数矩阵
B=[11;-14;-29;31];%方程组右边的列向量
[U,S,V]=svd(A,0);
C=V*(inv(S))*U'; %A的逆
X=C*B;
输出结果X为: