簡體   English   中英

使用 heaviside 階躍函數擬合數據

[英]Fitting data with heaviside step function

我有一些代碼可以將數據擬合到 heaviside 函數。 但是,擬合例程無法正常工作。 它因初始條件而異,無法找到最小值。 有人可以幫忙嗎? 我粘貼了下面的代碼、示例腳本並附加了帶有 y 數據的文件。

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

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

這是一個微不足道的函數。 只需尋找有大跳躍的兩個地方:

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作為索引。 但是,如果您的樣本位置不規則,您也可以明確說明。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM