【问题标题】:Matlab cftool producing wrong coefficientsMatlab cftool 产生错误的系数
【发布时间】:2012-03-18 08:01:16
【问题描述】:

所以我有这个数据

x
1.0423
2.8249
3.2016
2.0851
1.0299
4.7397
0.4104
0.5285
0.7102
0.8323
3.1048
2.8685
0.2604
4.6560
3.6433
3.6892
0.3170
4.3022
4.6720
4.9220
y
    2.0529
   -3.0669
   -2.3631
   -0.7300
    1.4354
    2.0260
    0.5980
    0.5296
    1.3405
    1.7361
   -1.5876
   -2.7872
    1.0788
    1.3677
   -0.1355
   -1.5755
    0.7811
   -0.8328
   -0.0592
    2.0927

我尝试使用 cftool 将 8 阶多项式拟合到数据中。

这些是我得到的结果是错误的

Linear model Poly8:
     f(x) = p1*x^8 + p2*x^7 + p3*x^6 + p4*x^5 + 
                    p5*x^4 + p6*x^3 + p7*x^2 + p8*x + p9
Coefficients (with 95% confidence bounds):
       p1 =    -0.05446  (-0.126, 0.01711)
       p2 =       1.088  (-0.3839, 2.561)
       p3 =      -8.762  (-21.23, 3.706)
       p4 =        36.2  (-19.89, 92.3)
       p5 =      -80.85  (-225.3, 63.62)
       p6 =       94.32  (-119.9, 308.6)
       p7 =      -52.21  (-227.5, 123.1)
       p8 =       12.21  (-59.01, 83.42)
       p9 =    -0.05814  (-10.72, 10.61)

Goodness of fit:
  SSE: 4.083
  R-square: 0.9225
  Adjusted R-square: 0.8661
  RMSE: 0.6092

这是拟合的 cftool 图,看起来不错

这就是绘制系数的实际样子。

绘制系数的代码:

xx = 0:1/100:5;
yy = -0.05446*xx.^8 +1.088*xx.^7 -8.762*xx.^6 +36.2*xx.^5 -80.85*xx.^4 +94.32*xx.^3 -52.21*xx.^2 +12.21*xx -0.05814;
plot(xx,yy)

有谁知道发生了什么以及如何获得 cftool 生成的绘图的正确系数?

【问题讨论】:

  • 我们可以看看你的从系数中绘制曲线的代码吗?
  • @MattEsch 没问题,我编辑了 OP。
  • 您的x 和/或y 数据有误(它们是相同的)。
  • @EgonGeerardyn 哎呀,谢谢。我再次编辑了 OP 以添加实际的 x 值。

标签: matlab curve-fitting polynomial-math


【解决方案1】:

我怀疑通过截断系数,你已经过多地改变了多项式。

您可以自己查看效果,通过检查以下代码(当您的工作区中已经有 xy 时)。

P = polyfit(x,y,8); % fitted polynomial
P2 = [-0.05446 1.088 -8.762 36.2 -80.85 94.32 -52.21 12.21 -0.0814]; % your coefficients

toString = @(x,pat)(sprintf(pat,x));
fix = @(x,pat)(str2double(toString(x,pat)));

P3 = arrayfun(@(x)(fix(x,'%3.4f')), P); % artificially truncate the coefficients

X = linspace(min(x),max(x),100);
Y  = polyval(P ,X);
Y2 = polyval(P2,X);
Y3 = polyval(P3,X);

figure;
[x,i] = sort(x);
y = y(i);
plot(x,y ,'or'); hold on;
plot(X,Y ,'-b'); 
plot(X,Y2,'--g');
plot(X,Y3,'-c');
hold off;

我所做的是将八阶多项式拟合到您的数据中,我还人为地截断了系数(我不知道 cftool 的确切舍入策略,它似乎比我所做的要复杂一些) .

在下图中,您可以看到结果。红点是数据,蓝线是与polyfit(也可能是cftool)拟合的精确多项式。虚线绿线描绘了带有截断系数的多项式),青色线显示了我的截断多项式。所以你看到,通过截断,你改变了多项式太多而无法使用。

【讨论】:

  • 啊,非常感谢。这些截断的系数是 cftool 在拟合 GUI 中给我的,所以如果无法从 cftool 获得更精确的系数,我可能会使用 polyfit。
  • @Michael:就个人而言,我会非常谨慎地使用它们中的任何一个。我不知道您要建模什么,但看起来很像您过度拟合数据。我的直觉说你的信号更像是一个锯齿而不是八阶多项式。您还可以看到,根据cftool 给出的标准偏差,没有一个系数可以很好地确定(例如,多项式 y(x) = 0 位于 95% 的不确定性范围内)。
【解决方案2】:

我认为您使用了 x 中心和比例复选框,因此您已经对 x 进行了标准化,并且当您自己编写此代码时您有不同的答案

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多