在研究的过程中,往往会需要根据采样得到的数据,拟合指定函数,获得函数参数。
常见的拟合有两种,一种是多项式拟合,一元线性回归就属于这种拟合;另一种在MATLAB帮助文档上叫非线性拟合,我称为指定函数拟合。本文介绍如何使用MATLAB进行函数拟合。
本文涉及到的函数:
polyfig
lsqcurvefit
写作格式说明:
代码块中的
>
是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 on
9> 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
是进行函数拟合的初始值,强烈建议根据参数的物理意义选择初始值,避免由于局部最优算法而拟合失败。
接下来我们根据图像大致对拟合的结果进行评估
xxxxxxxxxx
81% 首先根据拟合后的参数获得函数值
2y_fit=F(p,x)
3
4% 绘制采样数据的散点图
5plot(x,y,'o')
6hold on
7% 绘制拟合数据的折线图
8plot(x,y)
这篇文章还存在可以补充修改的地方,如果后续学习的过程中碰到并解决了,会回来填坑的。