一、算法原理
给定一些列点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不是方阵,无法求逆。故做如下变形:
方法一:
方法二:
对矩阵A做QR分解
二、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);