- refactored
This commit is contained in:
Executable
+50
@@ -0,0 +1,50 @@
|
||||
## Copyright (C) 2017 Jens Ahrensfeld
|
||||
##
|
||||
## This program is free software; you can redistribute it and/or modify it
|
||||
## under the terms of the GNU General Public License as published by
|
||||
## the Free Software Foundation; either version 3 of the License, or
|
||||
## (at your option) any later version.
|
||||
##
|
||||
## This program is distributed in the hope that it will be useful,
|
||||
## but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
## GNU General Public License for more details.
|
||||
##
|
||||
## You should have received a copy of the GNU General Public License
|
||||
## along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
## -*- texinfo -*-
|
||||
## @deftypefn {Function File} {@var{retval} =} ip_eval (@var{input1}, @var{input2})
|
||||
##
|
||||
## @seealso{}
|
||||
## @end deftypefn
|
||||
|
||||
## Author: Jens Ahrensfeld <ahrensfeld@w2ess001vm>
|
||||
## Created: 2017-05-15
|
||||
|
||||
function [] = ip_eval ()
|
||||
|
||||
Nh = 100;
|
||||
Np = 10;
|
||||
omega = 0.4;
|
||||
|
||||
close all;
|
||||
x = -(Nh/2):(Nh/2-1);
|
||||
|
||||
for p=1:Np,
|
||||
d = (p-1)/Np
|
||||
h(:, p) = sinc(omega*(x+d))'.*kaiser(length(x), 8);
|
||||
plot(x, h); grid;
|
||||
pause (0.1)
|
||||
end
|
||||
|
||||
figure
|
||||
for p=1:Nh,
|
||||
x = 0:Np-1;
|
||||
y = h(p,:);
|
||||
p = polyfit(x, y, 3);
|
||||
plot(x, y, 'o', 0:0.1:Np-1, polyval(p, 0:0.1:Np-1), 'r'); grid;
|
||||
pause (0.1)
|
||||
end
|
||||
|
||||
endfunction
|
||||
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