非线性曲线拟合是已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数关系为ydata=F(x,xdata),但不知道系数向量x。今进行曲线拟合,求x使得输出的如下最小二乘表达式成立:
minΣ(F(x,xdatai)-ydatai)^2
函数lsqcurvefit
格式x=lsqcurvefit(fun,x0,xdata,ydata)
x=lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
x=lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
[x,resnorm]=lsqcurvefit(…)
[x,resnorm,residual]=lsqcurvefit(…)
[x,resnorm,residual,exitflag]=lsqcurvefit(…)
[x,resnorm,residual,exitflag,output]=lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda]=lsqcurvefit(…)
[x,resnorm,residual,exitflag,output,lambda,jacobian]=lsqcurvefit(…)
参数说明:
x0为初始解向量;xdata,ydata为满足关系ydata=F(x,xdata)的数据;
lb、ub为解向量的下界和上界lb≤x≤ub,若没有指定界,则lb=[],ub=[];
options为指定的优化参数;
fun为待拟合函数,计算x处拟合函数值,其定义为functionF=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矩阵。
例求解如下最小二乘非线性拟合问题
已知输入向量xdata和输出向量ydata,且长度都是n,待拟合函数的表达式为
ydata(i)=x(1)-xdata(i)^2+x(2)-sin(xdata(i))+x(3)-xdata^3
即目标函数为minΣ(F(x,xdata(i))-ydata(i))^2
其中:F(x,xdata)=x(1)*xdata^2+x(2)*sin(xdata)+x(3)*xdata^3
初始解向量为x0=[0.3,0.4,0.1],即表达式的个参数[x(1),x(2),x(3)]。
先建立拟合函数文件,并保存为myfun.m
functionF=myfun(x,xdata)
F=x(1)*xdata.^2+x(2)*sin(xdata)+x(3)*xdata.^3;
然后给出数据xdata和ydata
>>xdata=[3.67.79.34.18.62.81.37.910.05.4];
>>ydata=[16.5150.6263.124.7208.59.92.7163.9325.054.3];
>>x0=[10,10,10];%初始估计值
>>[x,resnorm]=lsqcurvefit(@myfun,x0,xdata,ydata)
结果为:
Optimizationterminatedsuccessfully:
RelativefunctionvaluechangingbylessthanOPTIONS.TolFun
x=0.22690.33850.3021
=>即解出的系数最优估计值
resnorm=6.2950
=>在x解值处的目标最小二乘表达式值。即所谓残差。
