【问题标题】:Fitting a parabola using Matlab polyfit使用 Matlab polyfit 拟合抛物线
【发布时间】:2018-02-20 14:20:52
【问题描述】:

我希望将抛物线拟合到以下数据。

x = [-10:2:16];
y = [0.0334,0.0230,0.0145,0.0079,0.0033,0.0009,0.0006,0.0026,0.0067,0.0130,0.0213,0.0317,0.0440,0.0580];

[p,~,~] = polyfit(x,y,2);

x2 = linspace(-10,16,100);
y2 = polyval(p,x2);

y3 = 0.0003.*x2.^2 -0.0006.*x2 + 0.0011;
figure
plot(x,y,'o',x2,y2,x2,y3)

但是,拟合与数据完全不匹配。将数据放入 excel 并在那里使用二阶多项式进行拟合后,我得到了非常好的拟合。 y = 0.0003x2 - 0.0006x + 0.0011(截断系数的 excel 会稍微偏斜拟合)。使用这些数据的 polyfit 发生了什么?

【问题讨论】:

    标签: matlab curve-fitting


    【解决方案1】:

    解决了。

    Matlab 检查用户请求的输出数量。由于即使我没有使用它们,我也请求了三个输出,因此 polyfit 会更改系数以映射到不同的域 xhat。

    如果我只是这样做:

    p = polyfit(x,y,2);
    plot(x2,polyval(p,x2));
    

    然后我会得到适当的结果。使用三个输出恢复相同的答案:

    [p2,S,mu] = polyfit(x,y,2);
    xhat = (x2-mu(1))./mu(2)
    y4 = polyval(p2,xhat)
    plot(x2,y4)
    

    【讨论】:

    • 是的...如docs中所述
    【解决方案2】:

    我会在 matlab 中使用最小二乘法解决这个问题:

    x = [-10:2:16]';
    Y = [0.0334,0.0230,0.0145,0.0079,0.0033,0.0009,0.0006,0.0026,0.0067,0.0130,0.0213,0.0317,0.0440,0.0580]';
    
    plot(x,Y,'.');
    
    A=[ones(length(x),1) x x.^2];
    beta=A\Y;
    hold on
    plot(x, beta(1)+beta(2)*x+beta(3)*x.^2)
    leg_est=sprintf('Estimated (y=%.4f+%.4fx+%.4fx^2',beta(1),beta(2),beta(3))
    legend('Data',leg_est)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-26
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多