我发现示例是展示我的问题的最佳方式。我生成一些数据,添加一些随机噪声,并适合它来取回我选择的“生成器”值......
x = linspace(0.01,1,50);
value = 3.82;
y = exp(-value.*x);
y = awgn(y,30);
options = optimset('MaxFunEvals',1000,'MaxIter',1000,'TolFun',1e-10,'Display','off');
model = @(p,x) exp(-p(1).*x);
startingVals = [5];
lb = [1];
ub = [10];
[fittedValue] = lsqcurvefit(model,startingVals,x,y,lb,ub,options)
fittedGraph = exp(-fittedValue.*x);
plot(x,y,'o');
hold on
plot(x,fittedGraph,'r-');
在这个新的例子中,我生成了相同的数据,但这次在前15点增加了更多的噪音。因为它是随机的,有时它可以正常运行,但经过几次运行后,我得到了一个很好的例子来说明我的问题。相同的代码,但在value = 3.82
y = exp(-value.*x);
y(1:15) = awgn(y(1:15),5);
y(15:end) = awgn(y(15:end),30);
正如您所看到的,它显然没有很好地适应数据似乎可靠的位置,因为它适用于第1-50点。我想要做的就是说,好吧MATLAB,我可以看到我们有一些嘈杂的数据,但它在一个范围内似乎不错,只适合你从15点到结尾的指数。我可以回到我的代码并更新它来执行此操作,但我将批量拟合这样的图形,其中每个图形将具有不同范围的“良好”数据。
所以我所追求的是一个GUI回调机制,它允许我点击数据中的两个圆圈并让它们改变颜色或其他东西,这表明lsqcurvefit
只适合该范围。在内部,它必须改变的是在lsqcurvefit调用中,例如
X(16:端), Y(16:端)
但是范围应该根据我点击的起始和结束圈来更新。
我希望我的问题很明确。感谢。
答案 0 :(得分:1)
您可以使用ginput为图中的最小值和最大值选择两个点。
[x,y]=ginput(2);
%this returns you the x and y coordinates of two points clicked after each other
%the min point is assumed to be clicked first
min=[x(1) y(1)];
max=[x(2) y(2)];
然后你可以用你的最小和最大坐标来拟合你的曲线。 您也可以在右键单击最小值和左键单击最大值等之间切换。
希望这会对你有所帮助。