added
git-svn-id: http://moon:8086/svn/matlab/trunk@99 801c6759-fa7c-4059-a304-17956f83a07c
This commit is contained in:
Executable
+88
@@ -0,0 +1,88 @@
|
||||
function [p,S,mu] = myPolyfit(x,y,n)
|
||||
% POLYFIT Fit polynomial to data.
|
||||
% POLYFIT(X,Y,N) 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.
|
||||
%
|
||||
% [P,S] = POLYFIT(X,Y,N) returns the polynomial coefficients P and a
|
||||
% structure S for use with POLYVAL to obtain error estimates on
|
||||
% predictions. If the errors in the data, Y, are independent normal
|
||||
% with constant variance, POLYVAL will produce error bounds which
|
||||
% contain at least 50% of the predictions.
|
||||
%
|
||||
% The structure S contains the Cholesky factor of the Vandermonde
|
||||
% matrix (R), the degrees of freedom (df), and the norm of the
|
||||
% residuals (normr) as fields.
|
||||
%
|
||||
% [P,S,MU] = POLYFIT(X,Y,N) finds the coefficients of a polynomial
|
||||
% in XHAT = (X-MU(1))/MU(2) where MU(1) = mean(X) and MU(2) = std(X).
|
||||
% This centering and scaling transformation improves the numerical
|
||||
% properties of both the polynomial and the fitting algorithm.
|
||||
%
|
||||
% Warning messages result if N is >= length(X), if X has repeated, or
|
||||
% nearly repeated, points, or if X might need centering and scaling.
|
||||
%
|
||||
% See also POLY, POLYVAL, ROOTS.
|
||||
|
||||
% Copyright 1984-2002 The MathWorks, Inc.
|
||||
% $Revision: 5.17 $ $Date: 2002/04/09 00:14:25 $
|
||||
|
||||
% The regression problem is formulated in matrix format as:
|
||||
%
|
||||
% y = V*p or
|
||||
%
|
||||
% 3 2
|
||||
% y = [x x x 1] [p3
|
||||
% p2
|
||||
% p1
|
||||
% p0]
|
||||
%
|
||||
% where the vector p contains the coefficients to be found. For a
|
||||
% 7th order polynomial, matrix V would be:
|
||||
%
|
||||
% V = [x.^7 x.^6 x.^5 x.^4 x.^3 x.^2 x ones(size(x))];
|
||||
|
||||
if ~isequal(size(x),size(y))
|
||||
error('X and Y vectors must be the same size.')
|
||||
end
|
||||
|
||||
x = x(:);
|
||||
y = y(:);
|
||||
|
||||
if nargout > 2
|
||||
mu = [mean(x); std(x)];
|
||||
x = (x - mu(1))/mu(2);
|
||||
end
|
||||
|
||||
% Construct Vandermonde matrix.
|
||||
V(:,n+1) = ones(length(x),1);
|
||||
for j = n:-1:1
|
||||
V(:,j) = x.*V(:,j+1);
|
||||
end
|
||||
|
||||
% Solve least squares problem, and save the Cholesky factor.
|
||||
[Q,R] = qr(V,0);
|
||||
ws = warning('off','all');
|
||||
p = R\(Q'*y); % Same as p = V\y;
|
||||
warning(ws);
|
||||
if size(R,2) > size(R,1)
|
||||
warning('MATLAB:polyfit:PolyNotUnique', ...
|
||||
'Polynomial is not unique; degree >= number of data points.')
|
||||
elseif condest(R) > 1.0e10
|
||||
if nargout > 2
|
||||
warning('MATLAB:polyfit:RepeatedPoints', ...
|
||||
'Polynomial is badly conditioned. Remove repeated data points.')
|
||||
else
|
||||
warning('MATLAB:polyfit:RepeatedPointsOrRescale', ...
|
||||
['Polynomial is badly conditioned. Remove repeated data points\n' ...
|
||||
' or try centering and scaling as described in HELP POLYFIT.'])
|
||||
end
|
||||
end
|
||||
r = y - V*p;
|
||||
p = p.'; % Polynomial coefficients are row vectors by convention.
|
||||
|
||||
% S is a structure containing three elements: the Cholesky factor of the
|
||||
% Vandermonde matrix, the degrees of freedom and the norm of the residuals.
|
||||
|
||||
S.R = R;
|
||||
S.df = length(y) - (n+1);
|
||||
S.normr = norm(r);
|
||||
Reference in New Issue
Block a user