File Exchange

## polyfit3

version 1.1 (2.69 KB) by

Fit polynomial to data, with new features as forced to zero coefficients and data weighting.

Updated

POLYFIT3(X,Y,N,NUL,W) finds the coefficients of a polynomial P(X) of degree N that fits the data, P(X(I))~=Y(I), in a least-squares sense. Any of the coefficients can be forced to be zero, and data can be weighted.

NUL is a vector with coefficients forced to be zero in usual order.

W is a vector containing the weights of data.

POLYFIT3(X,Y,N,NUL) assumes that all weights of data are equal to 1.
POLYFIT3(X,Y,N,[],W) allows to weight data without forcing any coefficient to be zero.

The original usage is still available.

Tested under MATLAB 6.0.0.

DEMO (for not weighted data).
x=linspace(0,11,12);
noise=(rand(size(x))-0.5);
y=3-x.^3+2*x.^5+noise;
[p1,S] = polyfit3(x,y,5)
w=ones(size(x));
[p2,S] = polyfit3(x,y,5,[2 4 5],w)
close all;
figure;
plot(x,y,'.r'); hold on;
x=linspace(0,11);
plot(x,polyval(p1,x),'b');
plot(x,polyval(p2,x),'k');

DEMO (For weighted data).
x=linspace(-5,5,11);
noise=(rand(size(x))-0.5);
y=x.^4+noise; y(11)=y(11)+100;
[p1,S] = polyfit3(x,y,4)
w=ones(size(x)); w(11)=0.1;
[p2,S] = polyfit3(x,y,4,[2 3 4 5],w)
close all;
figure;
plot(x,y,'.r'); hold on;
x=linspace(-5,5,11);
plot(x,polyval(p1,x),'b');
plot(x,polyval(p2,x),'k');

Andrey Kan

### Andrey Kan (view profile)

thank you for a useful implementation.

memory usage of this function can be reduced by replacing lines:
W=diag(w);
WV=W*V;
Wy=W*y;
WVfull=W*Vfull;

with the following code:
W = repmat(w, 1, size(V, 2));
WV=W.*V;
Wy=w.*y;
W = repmat(w, 1, size(Vfull, 2));
WVfull=W.*Vfull;

Jan

### Jan (view profile)

just what I was looking for

Eugene

### Eugene (view profile)

S F

A very useful function !

But I have found a problem that needs to be fixed ! when used with "polyval" the function returns in some cases a wrong delta (error estimation) ! :-(