最小二乘拟合lsqcurvefit的…

[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);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值