## error message using polynom

on 25 Apr 2013

### Walter Roberson (view profile)

hi,

I have the following code:

    data16=zeros(size(data12,1),16);
data16(:,1:12)=data12;
numberEl=length(data16(:,9));
numberID=[1:numberEl]';
data16(:,13)=numberID;
    dates=730755;
      for i= 1:length(dates)
date=dates(i);
%msgbox(num2str(date))
Ts = 0.22192
          for indexT = 1:length(Ts)
              T = Ts(indexT);
              %msgbox(num2str(T))
              dataT = dataDate(dataDate(:,5) == T,:);
              number=dataT(:,13);
              if length(dataT(:,1))==1
SlopeSkew(number)=0;
elseif length(dataT(:,1))==2
SlopeSkew(number)=0;
elseif length(dataT(:,1))==3
SlopeSkew(number)=0;
elseif length(dataT(:,1))==4
SlopeSkew(number)=0;
%nur zum probieren
              else
              % x is the Strike
x= dataT(:,2);
%is the implied volatility
y=dataT(:,10);
p = polyfit(x,y,2);
f = polyval(p,x);
plot(x,y,'o',x,f,'-')
               xlabel('Strike Price  K');
ylabel('Implied volatility  \sigma');
              a=p(3);
b=p(2);
c=p(1);
              SlopeSkew(number)=b+2*c.*x;
              Slope=SlopeSkew';
              end
end
end

for whatever reson the polynom function gives me the following error message:

Warning: Polynomial is badly conditioned. Add points with distinct X
values, reduce the degree of the polynomial, or try centering
and scaling as described in HELP POLYFIT


I thought that I have fixed the problem, but unfortunately I havent reallly,

the data on which the code is run is the following:

    1444.	1500	1	27.3125	0.22192	730755	0.068116	0.963071	60	0.183247087	0.342050308	247.5717725	60
1444.	1500	2	81.875	0.22192	730755	0.068116	1.038345044	61	0.183247281	-0.642946883	247.5718217	61
1444.	1505	1	24.625	0.22192	730755	0.068116	0.959871429	62	0.178451585	0.323180754	242.1932319	62
1444.	1505	2	85.75	0.22192	730755	0.068116	1.041806194	63	0.185184067	-0.654919572	244.2372928	63
1444.	1515	1	21.5	0.22192	730755	0.068116	0.953535644	64	0.177080297	0.294048585	232.5459004	64
1444.	1520	1	19.875	0.22192	730755	0.068116	0.950399013	65	0.175645711	0.278919192	226.8732368	65
1444.	1525	1	18.5	0.22192	730755	0.068116	0.947282951	66	0.174985304	0.264986129	221.2360078	66
1444.	1530	1	17.125	0.22192	730755	0.068116	0.944187255	67	0.174006888	0.25092381	215.1342839	67
1444.     1550	1	12.125	0.22192	730755	0.068116	0.932004194	68	0.169039366	0.196212196	187.2126905	68
1444.	1575	1	7.625	0.22192	730755	0.068116	0.917210476	69	0.164247859	0.138365666	149.5401411	69

Obviously the original dataset was much larger but I have reduced it to the part which is not working. The dataset consists of more than 3 point and therefore I do not see why polyfit is not working

## Products

No products are associated with this question.

### Walter Roberson (view profile)

on 25 Apr 2013

The 4th line, (1505, 0.185184067) is a big difference in trend compared to the other lines. combine with the fact that it is the same x (1505) as the previous value (1505, 0.178451585), and you get a poorly determined polynomial.

### Ahmed A. Selman (view profile)

on 25 Apr 2013

A polynomial P(x) is said to be (badly conditioned) when a small variances of x leads to large errors of P, causing unstable error estimation, i.e., error doesn't converge between x and x+dx for even small dx. This is also called (ill-conditioned polynomial) in parallel to (ill-conditioned matrix).

So, as the warning message suggests, try including other (and outer) values of x to walk around the anomaly, or use polyfit(x,y,1).

Keep in mind this is a warning, so it might still work fine within your data set, but even if it does, however, do not fully trust it for other values of data.

### Locks (view profile)

on 27 Apr 2013

thanks a lot, it seems as I should exclude those values, they do not seem reasonable

MATLAB and Simulink resources for Arduino, LEGO, and Raspberry Pi