Home > RPSstuff > tidefit.m

tidefit

PURPOSE ^

Simple tide fit. Fits sine waves with specified periods to data

SYNOPSIS ^

[ucoef,ngood,unew]=tidefit(jd,uu,period,jdnew)

DESCRIPTION ^

 TIDEFIT  Simple tide fit.  Fits sine waves with specified periods to data
  Usage: [ucoef,ngood,unew]=tidefit(jd,uu,[period],[jdnew])
  Inputs: jd = datenum time vector 
     period = periods to fit (hours)    (defaults to [12 6 4] hours if not supplied)
          uu = input vector time series, or matrix where each column is a time series
       jdnew = new time base for simulated tide (defaults to original time base if not supplied)
  Output: ucoef = harmonic coefficients, starting with mean, then cos(f1), then sin(f1), 
                  up to the number of periods.  Hence there are 2f+1 coefficients.
          ngood = number of good points in each time series
          unew  = time series constructed from harmonic constituents (simulated tide)

CROSS-REFERENCE INFORMATION ^

SOURCE CODE ^

function [ucoef,ngood,unew]=tidefit(jd,uu,period,jdnew)
%TIDEFIT  Simple tide fit.  Fits sine waves with specified periods to data
%  Usage: [ucoef,ngood,unew]=tidefit(jd,uu,[period],[jdnew])
%  Inputs: jd = datenum time vector 
%      period = periods to fit (hours)    (defaults to [12 6 4] hours if not supplied)
%          uu = input vector time series, or matrix where each column is a time series
%       jdnew = new time base for simulated tide (defaults to original time base if not supplied)
%  Output: ucoef = harmonic coefficients, starting with mean, then cos(f1), then sin(f1), 
%                  up to the number of periods.  Hence there are 2f+1 coefficients.
%          ngood = number of good points in each time series
%          unew  = time series constructed from harmonic constituents (simulated tide)
%        

% Rich Signell (rsignell@usgs.gov)
goplot=0;  
if nargin<3; period=[12.0 6.0 4.0]; end        % can add 24 if interested
[n,m]=size(uu);
[njd,mjd]=size(jd);
if (n~=njd)&(m~=mjd); jd=jd'; end
if n<5; uu=uu.';jd=jd'; [n,m]=size(uu); [njd,mjd]=size(jd); end;
%if nlength(period)*2+1
      u=u(ind);
      t=t0(ind);
      u=u(:);
      t=t(:);      t0=t0(:);
      nt=length(t);

%------ set up A -------
       A=zeros(nind,nfreq*2+1); 
       A(:,1)=ones(nind,1);
       for j=[1:nfreq]
           A(:,2*j)=cos(freq(j)*t);
           A(:,2*j+1)=sin(freq(j)*t);
       end
%-------solve [A coeff = u] -----------------
       coef=A\u;
%-------generate solution components-----
       tnew=jdnew*24;
      up=zeros(length(tnew),nfreq*2+1);
       up(:,1)=coef(1)*ones(size(tnew));
       for j=[1:nfreq]
          up(:,j+1)=coef(j*2)*cos(freq(j)*tnew)+coef(j*2+1)*sin(freq(j)*tnew);
       end
       up(:,nfreq+2)=sum(up(:,[1:nfreq+1])')';  % sum of all comps
       unew(:,nn)=up(:,nfreq+2);
             ucoef(:,nn)=coef;
             error=std(A*coef-u)/sqrt(nind-length(period)*2+1);
       if goplot
          jdp=tnew/24;
          plot(jdp(ind),u,'oc5',jdp,up,jdp,unew(:,nn),'x',jdp,zeross(jdp),'w')
             title(sprintf('Least Squares Fit, series %g   error= %5.2g cm/s',nn,error));
             xlabel('julian day');
             ylabel('cm/second')
          pause
       end
else
             ucoef(:,nn)=ones(2*nfreq+1,1)*nan;
end   % if nind> ....
end   %  loop

Generated on Wed 30-Nov-2005 14:45:02 by m2html © 2003