【问题标题】:Why is this polynomial equation badly conditioned?为什么这个多项式方程的条件很差?
【发布时间】:2015-08-24 01:30:43
【问题描述】:

我有 1x1024 矩阵。所以我想估计一个多项式方程。

X= (0:1023)'
Y= acquired data.  A 1024 element vector

然后我在 MATLAB 中试试这个:

polyfit(x,y,5)

但 MATLAB 会发出异常结果并发出警告。

Warning: Polynomial is badly conditioned. Add points with distinct X values, reduce the degree of the ...

我不明白我做错了什么?

更新

我得到了一堆这样的数字。

Y=

-0.0000000150
 ...
0.00001
...
0
...
0.17

X= 0~255

polyfit(X,Y,4)

我得到一个多项式,但它与原始曲线不匹配。 原始曲线和polyfit的曲线之间是否有任何选项可以匹配?

【问题讨论】:

    标签: matlab math polynomial-math polynomial-approximations


    【解决方案1】:

    问题可归因于polyfitx 向量构建的系数矩阵类型:Vandermonde matrix

    什么时候

    • x 向量的元素在大小上变化太大,并且
    • 拟合多项式的次数太高,

    你得到一个病态矩阵,并且相关的线性系统不能可靠地求解。

    按照polyfit 帮助页面底部的建议,在应用polyfit 之前,先尝试将x 向量居中并缩放:

    由于 Vandermonde 矩阵中的列是向量 x 的幂,V 的条件数对于高阶拟合通常很大,从而产生奇异系数矩阵。在这些情况下,居中和缩放可以改善系统的数值属性,从而产生更可靠的拟合。

    (我的重点)

    【讨论】:

    • 我在文档中没有看到这个。非常好。 +1。
    • @rayryeng 这很容易错过,但我记得曾经遇到过类似的问题。我已经对你的回答投了赞成票:)我不是故意要偷对勾:p
    • 嗯,它发生了,哈哈。不是第一次有人提出更好的答案,并且复选标记为大声笑。首先标准化和缩放点是有意义的。真希望我能从直觉上想到这一点。
    【解决方案2】:

    警告是因为您向polyfit 提供的具有所需多项式次数的数据不合适。具体而言,您的数据中的可变性不足,因此您无法成功实现良好的拟合。因此,MATLAB 会向您发出警告,因为数据无法与您所需的次数多项式正确拟合。

    解决这个问题的方法是要么得到更多的点,这样你就可以得到你想要的多项式次数的所需拟合,或者减少你想要的多项式次数。

    尝试小于 5...4、3 或 2 的值:

    coeff = polyfit(x, y, 4);
    %// or
    %coeff = polyfit(x, y, 3);
    %coeff = polyfit(x, y, 2);
    

    尝试每个度数,直到不再收到警告为止。但是,没有实际数据,我只能推测出了什么问题,这是我最好的猜测。

    【讨论】:

    • 谢谢。在我的情况下是否有任何选项,而不是添加点或使用 polyfit?
    • 除非我看到你的数据,否则不能说。
    • 我在 Matlab 中发现了 pinv() 函数,这个结果是不是比 polyfit() 更好?
    • polyfit 基本上是通过最小二乘法找到多项式系数:en.wikipedia.org/wiki/…pinv 本质上用于polyfit。如果您想继续使用多项式回归,您应该尝试使用曲线拟合工具箱中更强大的工具:mathworks.com/help/curvefit/…
    猜你喜欢
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多