Vous êtes sur la page 1sur 3

function[y,yi_or_p]=orthofit(x,y,n,xi)

%ORTHOFITFitpolynomialtodata.
%YS=ORTHOFIT(X,Y,N)smooths/fitsdataY(X)inaleastsquaressense
%usingapolynomialofdegreeNandreturnsthesmootheddataYS.
%
%[YS,YI]=ORTHOFIT(X,Y,N,XI)alsoreturnsthevaluesYIofthefitting
%polynomialatthepointsofadifferentXIarray.
%
%YI=ORTHOFIT(X,Y,N,XI)returnsonlythevaluesYIofthefitting
%polynomialatthepointsoftheXIarray.
%
%[YS,P]=ORTHOFIT(X,Y,N)returnsthepolynomialcoefficientsPforuse
%withPOLYVAL.
%
%Notes:
%
%ORTHOFITsmooths/fitsdatausingapolynomialofdegreeNdevelopedin
%asequenceoforthogonalpolynomials.ORTHOFITismoreappropriatethan
%POLYFITforpolynomialfittingandsmoothingsincethismethoddoesnot
%involveanymatrixlinearsystembutasimplerecursiveprocedure.
%Degreesmuchhigherthan30couldbeusedwithorthogonalpolynomials,
%whereasbadlyconditionedmatricesmayappearwithaclassical
%polynomialfittingofdegreetypicallyhigherthan10.
%
%Toavoidusingunnecessarilyhighdegrees,youmayletthefunction
%POLYDEGchooseitforyou.POLYDEGfindsanoptimalpolynomialdegree
%accordingtotheAkaike'sinformationcriterion(available<a
%href="matlab:web('http://www.biomecardio.com/matlab/polydeg.html')">here</a>).
%
%Example:
%
%x=linspace(0,10,300);
%y=sin(x.^3/100).^2+0.05*randn(size(x));
%ys=orthofit(x,y,25);
%plot(x,y,'.',x,ys,'k')
%%tryPOLYFITforcomparison...
%
%%Automaticdegreedeterminationwith<a
%href="matlab:web('http://www.biomecardio.com/matlab/polydeg.html')">POLYDEG</a>
%n=polydeg(x,y);
%ys=orthofit(x,y,n);
%plot(x,y,'.',x,ys,'k')
%
%Reference:Mthodesdecalculnumrique2.JPNougier.HermesScience
%Publications,2001.Section4.7pp116121
%
%DamienGarcia,09/2007,revised01/2010
%
%SeealsoPOLYDEG,POLYFIT,POLYVAL.
%%Checkinputarguments
error(nargchk(3,4,nargin));
if~isequal(size(x),size(y))
error('MATLAB:orthofit:XYSizeMismatch',...
'XandYmusthavethesamesize.')
elseif~isscalar(n)||n~=round(abs(n))
error('MATLAB:orthofit:WrongNValue',...
'Nmustbeapositiveinteger.')
elseif~isfloat(x)||~isfloat(y)
error('MATLAB:orthofit:NonFloatingXY',...
'XandYmustbefloatingpointarrays.')

elseifnargin==4&&~isfloat(xi)
error('MATLAB:orthofit:NonFloatingXI',...
'XImustbeafloatingpointarray.')
end
%%Particularcase:n=0
ifn==0
p=mean(y(:));
y=ones(size(y))*p;
ifnargin<4
yi_or_p=p;
elseifnargout==2
yi_or_p=ones(size(xi))*p;
else
y=ones(size(xi))*p;
end
return
end
%%Reshape
x=x(:);
siz0=size(y);
y=y(:);
%%Coefficientsoftheorthogonalpolynomials
p=zeros(3,n+1);
p(2,2)=mean(x);
N=length(x);
PL=ones(N,n+1);
PL(:,2)=xp(2,2);
fori=3:n+1
p(2,i)=sum(x.*PL(:,i1).^2)/sum(PL(:,i1).^2);
p(3,i)=sum(x.*PL(:,i2).*PL(:,i1))/sum(PL(:,i2).^2);
PL(:,i)=(xp(2,i)).*PL(:,i1)p(3,i)*PL(:,i2);
end
p(1,:)=sum(bsxfun(@times,PL,y))./sum(PL.^2);
%%ys=smoothedy
ifnargin<4||(nargin==4&&nargout==2)
y=sum(bsxfun(@times,PL,p(1,:)),2);
y=reshape(y,siz0);
end
%%Coefficientsofthepolynomialinitsfinalform
ifnargin<4
yi=zeros(n+1);
yi(1,n+1)=1;
yi(2,n:n+1)=[1p(2,2)];
fori=3:n+1
yi(i,:)=[yi(i1,2:end)0]p(2,i).*yi(i1,:)p(3,i)*yi(i2,:);
end
p=sum(bsxfun(@times,p(1,:).',yi),1);
yi_or_p=p;
return
end
%%yivaluesforagivenxi
siz0=size(xi);
xi=xi(:);
N=length(xi);
n=size(p,2);
yi=ones(N,n);

yi(:,2)=xip(2,2);
fori=3:n
yi(:,i)=(xip(2,i)).*yi(:,i1)bsxfun(@times,p(3,i),yi(:,i2));
end
yi=sum(bsxfun(@times,p(1,:),yi),2);
yi=reshape(yi,siz0);
ifnargout==2
yi_or_p=yi;
else
y=yi;
end

Vous aimerez peut-être aussi