您的位置:首页 > 编程语言 > MATLAB

最小二乘法的应用(Matlab)

2016-09-02 19:11 197 查看

结合例子,直接放例子代码(本源代码根据Steven J.Leon编的《线性代数(原书第七版)》中的最小二乘法应用中自己打码以及修改而来)

安利:强烈推荐Steven J.Leon编的《线性代数(原书第七版)》作为线性代数入门或复习教材(均可),虽后面有一部分未看完,然而这书真的比同济的线代好太多了。

最优最小二乘法拟合曲线

其实,不需要用代码也可以快速地拟合曲线:先画出源数据散点图,在Matlab的figure弹出图框–工具(Tools)–基本拟合(Basic fitting)里面有多种插值方法,如”样条插值”、“多项式插值”等。

个人认为,通过学习《线性代数-Steven J.Leon》,发觉最小二乘法其实就是“多项式插值”

%最优最小二乘拟合曲线
%例题
%有数据表,如下:
%   p   1   2   3   4   5   6   7   8   9   10
%   T   222 227 223 233 244 253 260 266 270 266
%要求:最优最小乘法拟合曲线
%代码

p=[1:10]';
T=[222,227,223,233,244,253,260,266,270,266]';
A=vander(p);
%构建范德蒙德矩阵,即对 x=(x1,x2,...,x(n+1))',有vander(x)=  [x1^n x1^(n-1) ... x1 1             ]
%[x2^n x2^(n-1) ... x2 1                ]
%[... ... ... ... ... ...               ]
%[x(n+1)^n x(n+1)^(n-1) ... x(n+1) 1    ]
V=A(:,9:10);    %取A的第9,10列,此处可改,通过调为V=A(:,8:10)、V=A(:,7:10)等利于拟合精度提高
c=V\T;          %计算c,为拟合曲线的多项式降幂系数
q=1:0.1:10;     %建立取值区间,为1,1.1,1.2,...,10
z=polyval(c,q); %polyval函数,即有z=c(0)*q^n+c(1)*q^(n-1)+......+c(n-1)*q+c(n),即把矩阵c每个数值作为n次多项式降幂排序系数,与矩阵q的对应幂次数相乘
figure;plot(q,z,p,T,'x');       %画q-z曲线图,作为散点图的拟合曲线;同时,画p,T原题数据散点图(无曲线),如果没有'x',则是画p-T散点连线图


最小二乘圆(利用最小二乘法拟合圆方程)

%最小二乘圆(最优最小二乘法拟合圆)
%例题
%有圆参数方程:x=3+2cost,y=1+2sint
t=0:0.5:6;
x=3+2*cos(t);y=1+2*sin(t);
%以上为原来的圆
%以下为加入干扰(噪声)的圆
x=x+0.1*rand(1,13);
y=y+0.1*rand(1,13);
%以下为利用最小二乘法拟合加入干扰后的数据的圆的圆心c和半径r,Ac=B
A=[2*x',2*y',ones(size(x))'];
B=diag((diag(x.^2))+(diag(y.^2)));
c=A\B;
%以下为做散点图以及拟合圆的图
t1=0:0.1:6.3;
r=(c(3)+c(1)^2+c(2)^2)^(1/2);
x1=c(1)+r*cos(t1);
y1=c(2)+r*sin(t1);
plot(x1,y1,x,y,'x')
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息