【发布时间】:2014-08-26 17:38:10
【问题描述】:
我发现示例是展示我的问题的最佳方式。我生成了一些数据,添加了一些随机噪声,并对其进行拟合以取回我选择的“生成器”值...
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:end),y(16:end)
但是范围应该根据我点击的开始和结束圆圈而更新。
我希望我的问题很清楚。谢谢。
【问题讨论】:
-
应用程序
cftool有一个功能可以做到这一点。 -
@Jommy 谢谢,不可否认,我跳过了
cftool,主要是因为我将拟合它并不真正支持的更复杂的方程。
标签: matlab interactive curve-fitting least-squares