您的位置:首页 > 其它

最小二乘拟合lsqcurvefit的…

2014-01-22 00:27 211 查看
原文地址:最小二乘拟合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),...

[max_x1_1
74 0.2007 3.14 mean_x1_1],xdata,ydata1_1,[],[],option);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: