我发现例子是证明我的问题的最好方法。我产生了一些数据,添加了一些随机噪声,并使它符合我选择的“生成器”值.
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只适合这个范围。在内部,它所要改变的就是lsq弧度调用。
x(16:end),y(16:end)
但是范围应该根据我点击的开始和结束的圆圈来更新。
我希望我的问题很清楚。谢谢。
发布于 2014-08-26 09:38:10
你可以用金普特来选择两个点作为你的最小和最大的情节。
[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)];然后你可以用最小和最大坐标来拟合你的曲线。您还可以切换之间的右击的最小和左键的最大值,等等。
希望这能帮到你。
https://stackoverflow.com/questions/25497628
复制相似问题