【问题标题】:Matlab won't change fit's limitsMatlab 不会改变拟合的极限
【发布时间】:2013-10-20 00:50:19
【问题描述】:

我正在使用 Matlab 用 poly1 曲线拟合 2 个坐标 (x,y) 中的一些数据。

问题是我找不到让拟合线更长的方法。

我需要它从 (180, 930) 到 (191, 944),但 Matlab 只是在数据附近绘制拟合线,这两个坐标之间。

fit 命令是否有一些参数(或 cftool 中的一些首选项)可以帮助我?

此外,我已经尝试过 cftool 中的“调整轴限制”选项,但它根本没有帮助。

我已经搜索了已经提出的问题,但没有找到与此相关的任何内容。 我是这个程序的新手,所以如果这是一个愚蠢的问题,我很抱歉 提前致谢, 乔瓦尼

编辑: 第一张图片的代码是:

[FitUp,goodnessUP] = fit(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,2),'poly1')
[FitDown,goodnessDOWN] = fit(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,3),'poly1')
plot(FitUp,'b')
hold on
plot(FitDown,'b')
hold on
errorbar(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,2),AKaterMatrix1msDX(:,4),'--r')
hold on
errorbar(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,3),AKaterMatrix1msDX(:,4),'--r')

第二个的代码是:

[FitUp,goodnessUP] = fit(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,2),'poly1')
[FitDown,goodnessDOWN] = fit(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,3),'poly1')
plot(FitDown,'b')
hold on
plot(FitUp,'b')
hold on
errorbar(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,2),AKaterMatrix1msDX(:,4),'--r')
hold on
errorbar(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,3),AKaterMatrix1msDX(:,4),'--r')

在这里您可以找到两个拟合,似乎第一个拟合没有被裁剪,而hold on 之后的第二个是: https://docs.google.com/file/d/0B749BCu7mnZHaEhITUZ1YzdfVDA/edit?usp=sharing https://docs.google.com/file/d/0B749BCu7mnZHeDVTOGRuSkktUmc/edit?usp=sharing

【问题讨论】:

  • 请在您的问题中添加代码。
  • 我添加了代码和适合的图像来澄清我的问题。
  • 我不能评论 'fit' 的使用,但如果你只是拟合一个简单的多项式,polyfitpolyeval 可能会更好。一旦你有了拟合的多项式,你就可以在你想要的任何网格上对其进行评估。此外,hold 函数是一个切换。只有第一个是必需的(并且可能应该在最后一个错误栏命令之后跟一个hold off)。
  • 这是个好主意,谢谢。再问一个问题。关于拟合优度的信息(SSE、R 平方...)与 cftool 或 fit 命令给我的信息相同吗?如果没有,我怎样才能获得它们?
  • 感谢@craigim,如果您或其他人发布了答案,我可以将问题标记为已回答。如果你只评论,我怎么给你积分?

标签: matlab data-fitting


【解决方案1】:

您只需要小心设置保留的时间和方式。首先制作一些虚拟数据

AKaterMatrix1msDX(:, 1) = 185:189;
AKaterMatrix1msDX(:, 2) = 2*rand(5, 1)+933;
AKaterMatrix1msDX(:, 3) = 2*rand(5, 1)+940;
AKaterMatrix1msDX(:, 4) = 2*rand(5, 1);

接下来,这是关键部分,将轴设置为您想要的并打开保持

figure
axis([180, 191, 930, 944]);
hold on

这正是你所做的

[FitUp,goodnessUP] = fit(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,2),'poly1')
[FitDown,goodnessDOWN] = fit(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,3),'poly1')
plot(FitUp,'b')
hold on
plot(FitDown,'b')
hold on
errorbar(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,2),AKaterMatrix1msDX(:,4),'--r')
hold on
errorbar(AKaterMatrix1msDX(:,1),AKaterMatrix1msDX(:,3),AKaterMatrix1msDX(:,4),'--r')

【讨论】:

    【解决方案2】:

    如果您不需要大量的拟合统计数据,polyfit 后跟 polyval 可以为您提供合适的数据:

    X = AKaterMatrix1msDX(:,1);
    Y = AKaterMatrix1msDX(:,2);
    dY = AKaterMatrix1msDX(:,4);
    [a,S] = polyfit(X,Y)
    extraPlotRange = 10;
    newX = linspace(min(X)-extraPlotRange,max(X)+extraPlotRange,100);
    
    [fitY,delta] = polyval(a,newX);
    
    plot(X,Y)
    hold on
    plot(newX,fitY)
    plot(newX,fitY+delta,':b')
    plot(newX,fitY-delta,':b')
    errorbar(X,Y,dY,'--r')
    hold off
    

    不幸的是,这不会为您提供您可能需要的拟合优度统计数据,而只会提供拟合的置信区间。

    如果您想继续使用fit,另一种选择是使用coeffvalues 获得拟合系数。这些拟合系数将与您从 polyfit 获得的相同。

    aUp = coeffvalues(FitUp);
    aDown = coeffValues(FitDown);
    
    fitYup = polyval(aUp,newX);
    fitYdown = polyval(aDown,newX);
    

    等等

    【讨论】:

      猜你喜欢
      • 2014-09-22
      • 2014-02-15
      • 1970-01-01
      • 2012-07-28
      • 2017-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      相关资源
      最近更新 更多