多阶函数最小二乘拟合

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-');


拟合结果对比:



  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值