在实际工程中,我们常会遇到这种问题:已知一组点的横纵坐标,需要绘制出一条尽可能逼近这些点的曲线(或直线),以进行进一步进行加工或者分析两个变量之间的相互关系。而获取这个曲线方程的过程就是曲线拟合。
最小二乘法直线线拟合原理
首先,我们从曲线拟合的最简单情况——直线拟合来引入问题。如果待拟合点集近似排列在一条直线上时,我们可以设直线 y=ax+b 为其拟合方程,系数 A = [ a , b ] A=[a,b]A=[a,b] 为待求解项,已知:
用矩阵形式表达为: Y=X 0A,其中:
Matlab实现代码
%by hanlestudy@163.com
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
[~,k]=size(x);
for n=1:9
X0=zeros(n+1,k);
for k0=1:k %构造矩阵X0
for n0=1:n+1
X0(n0,k0)=x(k0)^(n+1-n0);
end
end
X=X0';
ANSS=(X'*X)\X'*y';
for i=1:n+1 %answer矩阵存储每次求得的方程系数,按列存储
answer(i,n)=ANSS(i);
end
x0=0:0.01:17;
y0=ANSS(1)*x0.^n ;%根据求得的系数初始化并构造多项式方程
for num=2:1:n+1
y0=y0+ANSS(num)*x0.^(n+1-num);
end
subplot(3,3,n)
plot(x,y,'*')
hold on
plot(x0,y0)
end
suptitle('不同次数方程曲线拟合结果,从1到9阶')
运行结果
可以看出看来,当多项式的阶数过小是,曲线并不能很好地反映出样本点的分布情况;但阶数过高时,会出现过拟合的情况。
系数矩阵answer:
Matlab自带函数——polyfit
在matlab中,也有现成的曲线拟合函数polyfit,其也是基于最小二乘原理实现的,具体用法为:ans=polyfit(x,y,n). 其中x,y为待拟合点的坐标向量,n为多项式的阶数。
下面代码是用polyfit函数来做曲线拟合:
clear
clc
x=[2,4,5,6,6.8,7.5,9,12,13.3,15];
[~,k]=size(x);
y=[-10,-6.9,-4.2,-2,0,2.1,3,5.2,6.4,4.5];
for n=1:9
ANSS=polyfit(x,y,n); %用polyfit拟合曲线
for i=1:n+1 %answer矩阵存储每次求得的方程系数,按列存储
answer(i,n)=ANSS(i);
end
x0=0:0.01:17;
y0=ANSS(1)*x0.^n ; %根据求得的系数初始化并构造多项式方程
for num=2:1:n+1
y0=y0+ANSS(num)*x0.^(n+1-num);
end
subplot(3,3,n)
plot(x,y,'*')
hold on
plot(x0,y0)
end
suptitle('不同次数方程曲线拟合结果,从1到9阶')
运行结果:
用polyfit拟合的结果与第一份代码运行的结果基本一样