多阶函数最小二乘拟合
1.问题提出:
给出一堆数据,假设有n组(x,y),求一个k阶拟合,使拟合后的曲线,最接近给出的数据趋势,如下图公式(0)。
2.解决方案:
这里给出三种拟合方案:
1)绝对值之和最小,见公式(1)。
2)差值平方和最小,见公式(2)。(即最小二乘拟合)。
3)使差值绝对值最大的数据值最小,见公式(3)。
3.最小二乘拟合
3.1 思想
对ai求偏导,i=1~k。
整理之后:
以上范德蒙矩阵化简之后:
X*A=Y=>A=(inv(X'*X))*X'*Y;
由以上,即可以把拟合的系数定下来了。
切记,拟合的过程中,不能过拟合,也不能欠拟合。阶数,要根据实际情况拟定。
示例:
%%最小二乘模拟,
%%N阶
clc;clear;close all;
%%确定阶数
order=9;
x=-1:0.02:1;
i=1;
for a=-1:0.02:1
y(i)=((a*a-1)*(a*a-1)*(a*a-1)+0.5)*sin(2*a);
i=i+1;
end
% plot(x,y,'r-');
grid on;
%%%对曲线加噪
W=randn(length(x))/20;
for i=1:1:101
y1(i)=y(i)+W(i);
end
hold on;
plot(x,y1,'b.')
legend('real','jiazao',-1);
%%plot(x,'g*')
%%%对曲线进行拟合
%%X*A=Y;A=[inv(X'*X)*X']*Y;
lenRow=length(x);
lenCol=order+1;
matrixX=zeros(lenRow,lenCol);
%%往matriX里面填 值
for i=1:1:lenRow
for j=1:1:lenCol
matXTemp=1;
for k=j-1
matXTemp=1*x(i)^k;
end
matrixX(i,j)=matXTemp;
end
end
matrixY=y1';
%%solve A
matrixTemp1=matrixX'*matrixX;
invmatrixTemp=inv(matrixTemp1);
matrixATemp=invmatrixTemp*matrixX';
matrixA=matrixATemp*matrixY;
% matrixA=inv(matrixX'.*matrixX).*matrixX'.*matrixY;
matrixY0=zeros(1,length(y1));
for i=1:1:length(y1)
matrixTemp=1;
matrixY0(i)=0;
for k=1:1:order+1
matrixY0(i)=matrixY0(i)+matrixA(k)*x(i)^(k-1);
end
end
%%
plot(a,matrixY0,'r-');
拟合结果对比: