lsqcurvefit函数
(least-squares curve-fitting):用于最小二乘法求解非线性曲线拟合问题。即已知输入向量xdata和输出向量ydata,并且知道输入与输出的函数关系为ydata=F(x, xdata),但不知道系数向量x。
1.语法
x = lsqcurvefit(fun,x0,xdata,ydata)
从 x0 开始,求取合适的系数 x,使非线性函数 fun(x,xdata) 对数据 ydata 的拟合最佳(基于最小二乘指标)。ydata 必须与 fun 返回的向量(或矩阵)F 大小相同。
(1)fun:符号函数句柄,如果是以m文件的形式调用的时候,别忘记加@;
(2)x0:最开始预估的值(预拟合的未知参数的估计值)。即方程系数的预估值。
(3)xdata:已有的xdata.
(4)ydata:与xdata对应的ydata.
复杂一点的结构:
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) 使用 options 所指定的优化选项执行最小化。使用 optimoptions 可设置这些选项。如果不存在边界,则为 lb 和 ub 传递空矩阵。
算法选择:
默认的 ‘trust-region-reflective’ 算法,可以通过设置改为’levenberg-marquardt’ 算法:
options = optimoptions('lsqcurvefit','Algorithm','levenberg-marquardt');
lb = [];
ub = [];
x = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
测试:
fun = @(x,xdata)x(1)*exp(x(2)*xdata);
x0 = [100,-1];
%Optimset函数:‘Gradobj’指用户自定义的目标函数梯度;‘MaxITer’指最大迭代次数,‘100’也就是最大迭代次数,这一项只能为整数。
options = optimset('MaxFunEvals',800,'MaxIter',500);
lb = [];
ub = [];
[x,resnorm,residual,exitflag,output] = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options);%返回在解 x 处的残差 fun(x,xdata)-ydata 的值、描述退出条件的值 exitflag,以及包含优化过程信息的结构体 output。
默认迭代次数:100* 拟合参数个数。
2.测试
%test
xdata = [0.9 1.5 13.8 19.8 24.1 28.2 35.2 60.3 74.6 81.3];
ydata = [455.2 428.6 124.1 67.3 43.2 28.1 13.1 -0.4 -1.3 -1.5];
fun = @(x,xdata)x(1)*exp(x(2)*xdata);
x0 = [100,-1];
x = lsqcurvefit(fun,x0,xdata,ydata)
times = linspace(xdata(1),xdata(end));
plot(xdata,ydata,'ko',times,fun(x,times),'b-')
legend('Data','Fitted exponential')
title('Data and Fitted Curve')
3.举例
(1)先创建一个函数文件myfun.m
function F = myfun(x,xdata)
F = x(1)*xdata.^2 + x(2)*sin(xdata) + x(3)*xdata.^3;
(2)重新建一个脚本文件
clc;clear;
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)
运行结果:
解释:
- x为解出的系数最优估计值;
-
resnorm为残差平方和
sum((fun(x,xdata)-ydata).^2)
。
实际运用时报错:
Function value and YDATA sizes are not equal.
(1)拟合函数形式参数x和系数参数a顺序写反了,正确的顺序为f = @(a,x);
(2)初值的选择;
(3)lsqcurvefit要求x、y向量组为列向量,所以需要将两个向量进行转置;
参考资料:
matlab-非线性拟合函数lsqcurvefit的使用和初值选取:
https://www.cnblogs.com/hyb965149985/p/10102335.html