Matlab 为什么多项式方程的条件很差?

Matlab 为什么多项式方程的条件很差?,matlab,math,polynomial-math,polynomial-approximations,Matlab,Math,Polynomial Math,Polynomial Approximations,我有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 ... 我不明白我做错了什么 使现

我有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=

X=0~255

polyfit(X、Y、4)

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

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

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

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

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

尝试每一个程度,直到你不再得到警告。但是,如果没有实际数据,我只能推测出哪里出了问题,这是我最好的猜测。

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

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

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

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

尝试每一个程度,直到你不再得到警告。但是,如果没有实际数据,我只能推测出哪里出了问题,这是我最好的猜测。

这个问题可以归因于
polyfit
x
向量:a构建的系数矩阵的类型

什么时候

  • x
    向量的元素在大小上变化过大,并且
  • 拟合多项式的次数太高
你得到一个病态矩阵,相关的线性系统无法可靠地求解

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

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


(我的重点)

这个问题可以归因于
polyfit
x
向量a构建的系数矩阵的类型

什么时候

  • x
    向量的元素在大小上变化过大,并且
  • 拟合多项式的次数太高
你得到一个病态矩阵,相关的线性系统无法可靠地求解

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

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


(我的重点)

谢谢。在我的例子中,有没有什么选项可以代替添加点或使用polyfit?除非我看到你的数据,否则我不能说。我在Matlab中找到了pinv()函数,这会使结果比polyfit()好吗?
polyfit
基本上通过最小二乘法找到多项式系数:
pinv
主要用于
polyfit
。如果您想继续使用多项式回归,您应该尝试使用“曲线拟合工具箱”中更健壮的工具:谢谢。在我的例子中,有没有什么选项可以代替添加点或使用polyfit?除非我看到你的数据,否则我不能说。我在Matlab中找到了pinv()函数,这会使结果比polyfit()好吗?
polyfit
基本上通过最小二乘法找到多项式系数:
pinv
主要用于
polyfit
。如果您想继续使用多项式回归,您应该尝试使用“曲线拟合工具箱”中更健壮的工具:我在文档中没有看到这一点。非常好+1.@rayryeng很容易错过,但我记得有一次遇到过类似的问题。我已经对你的答案投了更高的票:)我不是有意要偷选分数的:哦,这是真的,哈哈。这不是第一次有人提出更好的答案,所以选分数会变为lol。首先对分数进行标准化和缩放是有意义的。但愿我能从直觉上想到这一点。我在文档中没有看到这一点。非常好+1.@rayryeng很容易错过,但我记得有一次遇到过类似的问题。我已经对你的答案投了更高的票:)我不是有意要偷选分数的:哦,这是真的,哈哈。这不是第一次有人提出更好的答案,所以选分数会变为lol。首先对分数进行标准化和缩放是有意义的。但愿我能从直觉上想到这一点。