原文地址:最小二乘拟合lsqcurvefit的使用
作者:mulingfeng
[x resnorm] = lsqcurvefit(fun,x0,xdata,ydata,...)
fun
是我们需要拟合的函数,这是重点
x0
是我们对函数中各参数的猜想值,这也是重点
xdata
则是横轴坐标的值0 && image.height>0){if(image.width>=700){this.width=700;this.height=image.height*700/image.width;}}" border=0>
ydata
是纵轴的值
观察数据,发现该数据一个指数衰减的函数和一个三角正弦函数的叠加。
然后用psd观察频谱,它在0.4004处有最大峰,然后在0点和其他各处也有。
因为我们拟合要得到的结果是初始相位,只对0.404处的信号感兴趣。以下是我们需要拟合出来的一个函数。
a * exp(bt) * sin(2*pi*c*t
+ d) + e;
a : 该函数的幅度
b :是指数函数的参数
c :正弦函数的频率
d :正弦函数的初始相位 *重点
e :该函数的偏移量
利用fun的方式把该函数改编成如下的数字信号表达方式
t1(1)*exp(-xdata./t1(2)).*sin(2*pi*t1(3)*xdata+t1(4))+t1(5)
a = t(1),我们取数据的最大值。
在数字信号下,指数函数的表达有些区别。e^(-b*t): 在数字信号中,横轴的值都以1为间隔进行变化,如果想设定n值,则要将横轴向量,此例中为xdata,乘除一个值。因此该函数变为 exp (-xdata./t1(2))。我取t1(2) = 1000时发现,它的曲线衰减比数据更长,因此可将该值暂定为1000.
同样的,如果我们想设计一个在采样频率为117.3M下,采样200000点的30.5344M正弦数据,我们应该如下进行设计
sin(2*pi*(30.5344/117.3)*(1:200000))。psd 得到 0.5206 = 2*30.5344/117.3,即30.5344/117.3 = 1/2(max(psd))
因此,正弦函数的t1(3)应该等于0.4004/2 = 0.2002,这也就是我们的猜想值。
t1(4)是初始,从数据看,他应该小于 pi,因此猜想值就设为3.14。
t1(5)是偏移量,我们把它设为数据的均值。
因此,t1就取如下值
[max(x1) 1000 0.2002 3.14 mean(x1)]
结果差别甚大,修改t1(2),改到74时能获取最小的误差,结果t1(2)是五百多。具体原因不是很明白。
下面是拟合的option设置
(1)Display:结果显示方式。off不显示,iter显示每次迭代的信息,final为最终结果,notify只有当求解不收敛的时候才显示结果
(2)MaxFunEvals:允许函数计算的最大次数,取值为正整数
(3)MaxIter:允许迭代的最大次数,正整数
(4)TolFun:函数值(计算结果)精度,正整数
(5)TolX:自变量的精度,正整数。
使用方法如下
option=optimset('MaxFunEvals',2^12,'MaxIter',2^14,'TolX',1e-8,'TolFun',1e-8);
[t1_1 resnorm1_1 residual1_1] = lsqcurvefit(@(t1_1,xdata) t1_1(1)*exp(-xdata/t1_1(2)).*sin(2*pi*t1_1(3)*xdata+t1_1(4))+t1_1(5),...