使用重载步进功能拟合数据

时间:2018-02-14 18:42:45

标签: matlab function curve-fitting

我有一些代码可以将数据与weightiside函数相匹配。但是,拟合程序无法正常工作。它的变化很大程度上取决于初始条件,并且无法找到最小值。有人可以帮忙吗?我已粘贴下面的代码,示例脚本并使用y-data附加文件。

ydata=[10 8 12 8 14 9 11 10 200 210 190 190 201 205 203 206 185 30 28 32 35 28 33 29];  
n=length(ydata);
xdata=[1:n];

%function
predicted = @(a,xdata) a(1)*heaviside(xdata-a(2))-a(3)*heaviside(xdata-a(4));

%initial conditions
a0 = [10;8;200;18];

% Fit model to data.
[ahat,resnorm,residual,exitflag,output,lambda,jacobian]=lsqcurvefit(predicted,a0,xdata,ydata);

% Plot fit with data.
plot(xdata,ydata);   

%plot fits
opts = fitoptions( 'Method', 'NonlinearLeastSquares');

%plot fit function
fitfinal = ahat(1)*heaviside(xdata-ahat(2))-ahat(3)*heaviside(xdata-ahat(4));

hold on 
plot(xdata,fitfinal)
hold off

最后,我想提取水平部分的长度。

1 个答案:

答案 0 :(得分:2)

这是一个很容易适应的功能。只需寻找有两个大跳跃的地方:

plot(ydata)
hold on

dy = abs(diff(ydata));
[~,index] = sort(dy,'descend');

% First segment = 1:index(1)
m = mean(ydata(1:index(1)));
plot([1,index(1)],[m,m])

% Second segment = index(1)+1:index(2)
m = mean(ydata(index(1)+1:index(2)));
plot([index(1)+1,index(2)],[m,m])

% Third segment = index(2)+1:length(ydata)
m = mean(ydata(index(2)+1:length(ydata)));
plot([index(2)+1,length(ydata)],[m,m])

作为"拟合功能"我在这些样本中使用函数的平均值绘制了段,但所有信息都是使用两个Heaviside函数组成函数。

另外,我已经隐含地将xdata作为索引。但如果您的样本位置不规则,您也可以明确说明。