在研究的过程中,往往会需要根据采样得到的数据,拟合指定函数,获得函数参数。
常见的拟合有两种,一种是多项式拟合,一元线性回归就属于这种拟合;另一种在MATLAB帮助文档上叫非线性拟合,我称为指定函数拟合。本文介绍如何使用MATLAB进行函数拟合。
本文涉及到的函数:
polyfiglsqcurvefit写作格式说明:
代码块中的
>是matlab的命令提示符,后面接命令。
本文参考了:多项式曲线拟合 - MATLAB polyfit - MathWorks 中国
1> p = polyfit(x,y,n)传入变量说明:
x是自变量y是因变量n设定几阶多项式,如一元线性回归就设定n=1传出变量说明:
p是多项式系数组成的向量,按照降幂顺序排列,即p的最后一个元素p(end)是常数项的系数。因为包含了常数项,所以p的元素个数是求出参数后,可以通过画图来比较拟合的效果:
x1% 首先根据拟合的参数写出多项式函数,这里使用匿名函数.假设拟合的是四次幂的多项式函数:2> F=@(p,x)p(1).*x.^4 + p(2).*x.^3 + P(3).*x.^2 + p(4).*x.^1 +p(5);3% 求出根据拟合函数求得的因变量,此处的p是前面通过polyfit获得的。4> y_fit=F(p,x)5
6% 绘制散点图,进行比较7> plot(x,y,'o')8> hold on9> plot(x,y_fit)匿名函数其实是一种函数句柄,定义简单,可作为其他函数的输入,具体可以参考匿名函数 - MATLAB & Simulink - MathWorks 中国。
本文参考了:非线性数据拟合 - MATLAB & Simulink - MathWorks 中国
很多时候我们需要拟合特定的函数,想要对函数的参数进行后续的分析,这时候多项式拟合就不能完成目标,需要使用lsqcurvefit来对制定的函数进行拟合。
假如我有一个函数如下,需要拟合其中的
我们通过实验采样获得了自变量
1% 首先需要写出函数表达式,所有的参数组成参数数组p=[a,g,c],下式中的p,x都是形参,只在函数F内部起作用2> F=@(p,x) P(1)./(1+\exp(-p(2).*(x-p(3))))3
4% 因为使用数值解法,需要给系数的初始值(根据参数的意义设,或者随意),matlab会从初始值开始寻找局部最优解。5> p0 = [1,1,1]6% 然后使用lsqcurvefit函数进行拟合,将拟合得到的系数存在p中,元素排列顺序跟前面定义函数的时候是相同的7[p,resnorm,~,exitflag,output] = lsqcurvefit(F,p0,x,y)传入变量说明:
F是函数句柄,lsqcurvefit会对该函数进行函数拟合。p0是参数初始值,如果参数有实际意义,可以结合采样的数据大致估计参数。如该公式中a代表最大生物量,根据实测数据可知最大生物量在400左右,那么a对应的p0(1)就可以设为400。x是自变量y是因变量
p0是进行函数拟合的初始值,强烈建议根据参数的物理意义选择初始值,避免由于局部最优算法而拟合失败。
接下来我们根据图像大致对拟合的结果进行评估
xxxxxxxxxx81% 首先根据拟合后的参数获得函数值2y_fit=F(p,x)3
4% 绘制采样数据的散点图5plot(x,y,'o')6hold on7% 绘制拟合数据的折线图8plot(x,y)这篇文章还存在可以补充修改的地方,如果后续学习的过程中碰到并解决了,会回来填坑的。