matlab中lsqcurvefit怎么用
x=1:5;
y=[1 0.83 0.75 0.71 0.68];
plot(x,y)
f=@(c,x)1./(c(1)*x+c(2));
c0=[0.5 -0.1];
[c,resnorm]=lsqcurvefit(f,c0,x,y);
其运行结果为:
Optimization terminated: relative function value
changing by less than OPTIONS.TolFun.
请大神指教。。。 展开
1、首先双击MATLAB软件的快捷键,进入MATLAB的工作界面。
2、点击箭头处的“新建”,点击箭头处的“脚本”按钮,新建一个matlab脚本文件,文件的后缀为.m,也就是m文件。
3、output处填写函数的输出值,input为函数的参数,输入值。fun为函数的名称,函数名称可以自定义。末尾要加上end。
4、输入两个参数x和y,计算乘积xy,输出结果保存在f中,具体代码如下图所示,然后点击“运行”。
5、m文件的名称默认和函数名称一致,下面点击箭头处“保存”即可保存m文件。
求解曲线拟合问题的一般过程是,先通过观察曲线形状大致确定函数的形式,然后对函数的参数有个大概的估计作为初值,拟合后画出曲线来看看效果,如果效果不理想,就考虑修改初值或函数的形式再试。有时候需要经过多次尝试才能得到满意的结果。
需要特别注意以下两点:
1、与拟合函数的形式有关,如果函数形式选择不当,不可能得到理想的结果。
例如,对于反比例函数,比较一般的情况应该考虑取1/(c1*x+c2)+c3。
2、拟合问题与初值关系很大,不是随便指定什么初值都行的通的。
例如,对于本题,初值如果选择[0.5 -0.1 1],得到的结果就不太理想;但取[1 1 1]得到的结果就比较满意。
代码及拟合结果如下:
x=1:5;
y=[1 0.83 0.75 0.71 0.68];
f=@(c,x)1./(c(1)*x+c(2))+c(3);
c0=[1 1 1];
[c,resnorm]=lsqcurvefit(f,c0,x,y);
plot(x,y,'.-',x,f(c,x),'r:x')
legend('原始数据','拟合数据')
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处拟合函数值,其定义为 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矩阵。
例 求解如下最小二乘非线性拟合问题
已知输入向量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
function F = myfun(x,xdata)
F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
然后给出数据xdata和ydata
>>xdata = [3.6 7.7 9.3 4.1 8.6 2.8 1.3 7.9 10.0 5.4];
>>ydata = [16.5 150.6 263.1 24.7 208.5 9.9 2.7 163.9 325.0 54.3];
>>x0 = [10, 10, 10]; %初始估计值
>>[x,resnorm] = lsqcurvefit(@myfun,x0,xdata,ydata)
结果为:
Optimization terminated successfully:
Relative function value changing by less than OPTIONS.TolFun
x = 0.2269 0.3385 0.3021
=>即解出的系数最优估计值
resnorm = 6.2950
=>在x解值处的目标最小二乘表达式值。即所谓残差。
2、拟合问题与初值关系很大,不是随便指定什么初值都行的通的。例如,对于本题,初值如果选择[0.5 -0.1 1],得到的结果就不太理想;但取[1 1 1]得到的结果就比较满意。