00001 #include "generic_spline1d.h"
00002 #include "linalg.h"
00003
00004
00005 bool CGenericSpline1d::Read(const parameterMap& m){
00006 vector< double > empty_vec(0);
00007 spline_degree = parameter::getI(m,"spline_degree",3);
00008 knots = stl2tntVec(parameter::getV(m,"knots_datablock",empty_vec));
00009 return CBasisFunctionExpansion1d::Read(m)&&(m.find("knots_datablock")!= m.end());
00010 }
00011
00012 bool CGenericSpline1d::Write(parameterMap& m){
00013 parameter::set(m,"knots_datablock",tnt2stlVec(knots));
00014 parameter::set(m,"spline_degree",spline_degree);
00015 return CBasisFunctionExpansion1d::Write(m);
00016 }
00017
00018
00019 void CGenericSpline1d::CopyState(const CGenericSpline1d& a){
00020 CBasisFunctionExpansion1d::CopyState(a);
00021 knots=a.knots;
00022 spline_degree=a.spline_degree;
00023 }
00024
00025
00026 int CGenericSpline1d::getKnotToLeft(double x) const{
00027 for (int ileft=0;ileft<knots.dim()-2;ileft++)
00028 if ((knots[ileft]<x)&&(knots[ileft+1]>=x)) return ileft;
00029 cerr<<"Illegal x in getKnotToLeft:"<<x<<endl;
00030 return -1;
00031 }
00032
00041 bool CGenericSpline1d::setDefaultKnots( void ){
00042 Array1D< double > new_knots(spline_degree+1+ndata, 0.0);
00043 knots = new_knots;
00044 for (int i=0;i<spline_degree+1;++i){knots[i]=xmin;}
00045 for (int i=spline_degree+1;i<ndata;++i){knots[i]=xmin+(xmax-xmin)*(i-spline_degree)/(knots.dim()-2*spline_degree-1);}
00046 for (int i=ndata;i<knots.dim();++i){knots[i]=xmax;}
00047 return true;
00048 }
00049
00059 bool CGenericSpline1d::setOptimalKnots(const Array1D<double>& colloc){
00060 this->setDim( colloc.dim() + spline_degree - 1 );
00061 int first=0;
00062 int last=colloc.dim()-1;
00063 int icc=first;
00064 for (int i=0;i<spline_degree+1;++i){knots[i]=colloc[first];}
00065 for (int i=spline_degree+1;i<ndata;++i){
00066 knots[i]=0.;
00067 for (int j=0;j<spline_degree;++j){knots[i]+=colloc[icc+j]/spline_degree;}
00068 icc++;
00069 }
00070 for (int i=ndata;i<knots.dim();++i){knots[i]=colloc[last];}
00071 xmin=colloc[first];
00072 xmax=colloc[last];
00073 return true;
00074 }
00075
00076
00078 bool CGenericSpline1d::setDim(int ncoeffs){
00079 Array1D<double> new_uncert(ncoeffs,0.),new_data(ncoeffs,0.);
00080 Array2D<double> new_covmtx(ncoeffs,ncoeffs,0.0);
00081 ndata = ncoeffs;
00082 data = new_data;
00083 uncert = new_uncert;
00084 covmtx = new_covmtx;
00085 Array1D<double> new_knots(ncoeffs+spline_degree+1,0.);
00086 knots = new_knots;
00087 return checkDim(spline_degree,knots.dim(),ncoeffs);
00088 }