Why is this polynomial equation badly conditioned?

10.6k Views Asked by At

I have 1x1024 matrix. So I'd like to estimate a polynomial equation.

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

Then I try this in MATLAB:

polyfit(x,y,5)

But MATLAB makes an abnormal result with warning.

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

I don't understand what am I doing wrong?

Update

I got a bunch of numbers like this.

Y=

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

X= 0~255

polyfit(X,Y,4)

I got a polynomial but it does not match to original curve. Is there any options to match between original curve and polyfit's curve?

2

There are 2 best solutions below

3
On BEST ANSWER

The problem can be attributed to the type of coefficient matrix that polyfit builds from the x vector: a Vandermonde matrix.

When

  • the elements of the x vector vary too much in magnitude, and
  • the degree of the fitting polynomial is too high,

you get an ill-conditioned matrix, and the associated linear system cannot be solved reliably.

Try to centre and scale your x vector first, before applying polyfit, as advised at the bottom of the polyfit help page:

Since the columns in the Vandermonde matrix are powers of the vector x, the condition number of V is often large for high-order fits, resulting in a singular coefficient matrix. In those cases centering and scaling can improve the numerical properties of the system to produce a more reliable fit.

(my emphasis)

4
On

The warning is because the data that you are supplying to polyfit with your desired degree of polynomial isn't suitable. Specifically, there is an insufficient amount of variability in your data so that you can successfully achieve a good fit. Therefore, MATLAB gives you that warning because the data can't be fit properly with your desired degree polynomial.

The solution to this is to either get more points so that you can get the desired fit of the polynomial degree you want or to decrease the degree of polynomial you want.

Try values that are less than 5... 4, 3 or perhaps 2:

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

Try each degree until you don't get the warning anymore. However, without the actual data, I can only speculate what's wrong, and this is my best guess.