matlab-lsqcurvefit函数

  • Post author:
  • Post category:其他



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



版权声明:本文为qq_32649321原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。