【问题标题】:Interactive curve fitting with MATLAB using custom GUI?使用自定义 GUI 与 MATLAB 进行交互式曲线拟合?
【发布时间】: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


【解决方案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)];

然后你可以用我猜的最小值和最大值的坐标来拟合你的曲线。 您还可以在右键单击最小值和左键单击最大值等之间切换。

希望对你有所帮助。

【讨论】:

  • ginput 正是我所追求的,谢谢。我应该可以使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多