最小二乘拟合
- 线性最小二乘拟合
- 非线性最小二乘法
线性最小二乘拟合
1、polyfit
例:a= polyfit(x0,y0,m)
其中,输入参数x0,y0为要拟合的数据,m为拟合多项式的次数(一般不超过3次),输出参数a为拟合多项式的次数(从0次开始)
%例:
clc;clear
x=[19,25,31,38,44];
y=[19.0,32.3,49.0,73.3,97.8];
ab=polyfit(x,y,2)
x0=19:0.1:44;
y0=ab(3)+ab(2)*x0+ab(1)*x0.^2;
plot(x,y,'o',x0,y0,'r')
2、polyval
例:y=polyval(a,x)
其中,输入参数a为拟合多项式的次数,输入参数x为所要求y值的x值,输出参数y为所要求的值。
例:某乡镇企业1990-1996年的生产利润如下
年份 1990 1991 1992 1993 1994 1995 1996
利润(万元) 70 122 144 152 174 196 202
试预测1997和1998年的利润。
%代码如下
x0=[1990 1991 1992 1993 1994 1995 1996];
y0=[70 122 144 152 174 196 202];
a=polyfit(x0,y0,1)
y97=polyval(a,1997)
y98=polyval(a,1998)
非线性最小二乘法
1、lsqcurvefit
已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数关系为ydata=F(x, xdata),求系数向量x(当然对于不同的函数用法可以求得别的东西)
%格式
x = lsqcurvefit ('fun',x0,xdata,ydata);
x =lsqcurvefit ('fun',x0,xdata,ydata,options);
x = lsqcurvefit ('fun',x0,xdata,ydata,options,'grad');
[x, options] = lsqcurvefit ('fun',x0,xdata,ydata,…);
[x, options,funval] = lsqcurvefit ('fun',x0,xdata,ydata,…);
[x, options,funval, Jacob] = lsqcurvefit ('fun',x0,xdata,ydata,…);
参数说明:
x0为初始解向量;xdata,ydata为满足关系ydata=F(x, xdata)的数据;
lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[ ],ub=[ ];
options为指定的优化参数;
fun为待拟合函数,计算x处拟合函数值,其定义为 function F = myfun(x,xdata)
resnorm=sum ((fun(x,xdata)-ydata).^2),即在x处残差的平方和;
residual=fun(x,xdata)-ydata,即在x处的残差;
exitflag为终止迭代的条件;
output为输出的优化信息;
lambda为解x处的Lagrange乘子;
jacobian为解x处拟合函数fun的jacobian矩阵。
2、lsqnonlin
已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数关系为ydata=F(x, xdata),求系数向量x(当然对于不同的函数用法可以求得别的东西) (差不多,感觉一般会用lsqcurvefit)
%格式x=lsqnonlin('fun',x0);x= lsqnonlin ('fun',x0,options);x= lsqnonlin ('fun',x0,options,'grad');[x,options]= lsqnonlin ('fun',x0,…);[x,options,funval]= lsqnonlin ('fun',x0,…);
%用lsqcurvefit函数
%先编写函数文件fun.m
function f=fun(x,tdata,cdata)
f=x(1)+x(2)*exp(-0.02*x(3)*tdata)-cdata
%其中x(1)=a,x(2)=b,x(3)=k;
%输入命令
tdata=[100:100:1000]
cdata=1e-3*[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50,6.59];
x0=[0.2,0.05,0.05];
x=lsqcurvefit('fun',x0,tdata,cdata)
f=fun(x,tdata,cdata)
end
%用lsqnonlin
%编写函数文件fun.m
function f=fun(x)
tdata=100:100:1000;
cdata=1e-3*[4.54,4.99,5.35,5.65,5.90,6.10,6.26,6.39,6.50,6.59];
f=x(1)+x(2)*exp(-0.02*x(3)*tdata)-cdata
%输入命令:
x0=[0.2,0.05,0.05];
x=lsqnonlin('fun',x0)
f=fun(x)
end