MATLAB之最小二乘法

一、算法原理

给定一些列点x1,x2,.....xn,对应的函数值为y1,y2,......yn。若拟合曲线为y=ax+b,根据条件可写出线形方程组为:

[x1 1;x2 1;...;x3;1]*[a;b]=[y1;...;yn]即A*[a;b]=[y2;...;yn]

因为A不是方阵,无法求逆。故做如下变形:

方法一:

\Rightarrow A'*A*[a;b]=A'*[y1;...;yn]

\Rightarrow [a;b]=inv(A'*A)*A'*[y1,...,yn]

方法二:

对矩阵A做QR分解A=Q*R

\Rightarrow Q*R*W=[y1,...,yn]

\Rightarrow R*w=Q'*[y1,...,yn]

\Rightarrow w=inv(R)*Q'*[y1,...,yn]

二、matlab程序

%% 最小二乘法插值
%设拟合直线为y=ax+b   ax1+b=y1...axn+b=yn
%写成[x1 1;x2 1;...;x3;1]*[a;b]=[y2;...;yn]  即A*[a;b]=[y2;...;yn]
clear
clc
close
x=1:6; 
y=[1 4 5 8 10 11];%一系列插值点
plot(x,y,'o');%绘制散点图
hold on
axis([-5 10 -2 15]);%坐标轴范围

A=[1 1;2 1;3 1;4 1;5 1;6 1];%A*[a;b]=[y2;...;yn]
y=y';
% y=[1;4;5;8;10;11];  %法方方程组 A*W=Y  即 A'*A*W=A'*Y  (
w=inv(A'*A)*A'*y;      %W=inv(A'*A)*A'*Y   求得系数W=[a,b]
y1=w(1).*x+w(2);
plot(x,y1,':');
% QR分解法做最小二乘拟合
Q=orth(A);  %QR分解法  A*W=Y  A=Q*R   Q*R*W=Y  W=inv(R)*Q'*Y
R=Q'*A;
a1=inv(R)*Q'*y;
x=0:8;
y2=a1(1).*x+a1(2);
plot(x,y2);
发布了20 篇原创文章 · 获赞 31 · 访问量 633

猜你喜欢

转载自blog.csdn.net/STM89C56/article/details/105538497