Main Page | Namespace List | Class Hierarchy | Class List | File List | Class Members | File Members

interpolator.cpp

Go to the documentation of this file.
00001 #include "./interpolator.h"
00002        
00003        
00004        
00005        
00006 interpolator::interpolator(){}
00007 
00008 interpolator::interpolator(valarray<Real> x, valarray<Real> y)
00009     :  _x(x),
00010       _y(y)
00011         {
00012         }
00013 
00014 
00015 interpolator::interpolator(valarray<Real> x1, valarray<Real> x2, valarray<valarray<Real> > ymat)
00016     : _x1(x1),
00017       _x2(x2),
00018       _ymat(ymat)
00019   {
00020   }
00021 
00022 Real interpolator::getInterpolation(valarray<Real> xa,valarray<Real> ya, Real x){
00023   Integer j=0;
00024 
00025   Real P1 = ya[j];
00026   Real P2 = ya[j+1];
00027   Real P3 = ya[j+2];
00028 
00029   Real P12 = ((x - xa[j+1])*P1 + (xa[j] - x)*P2)/(xa[j]-xa[j+1]);
00030   Real P23 = ((x - xa[j+2])*P2 + (xa[j+1] - x)*P3)/(xa[j+1]-xa[j+2]);
00031   Real P123 = ((x - xa[j+2])*P12 + (xa[j] - x)*P23)/(xa[j]-xa[j+2]);
00032 
00033   return P123;
00034 }
00035 valarray<Real> interpolator::interpolate(valarray<Real> vec){
00036   Integer n = vec.size();
00037   valarray<Real> result(n);
00038   Integer i;
00039 
00040   for(i=0;i<n;i++)
00041     result[i] = interpolate(vec[i]);
00042 
00043   return result;
00044 }
00045 
00046 Integer interpolator::getPlace(Real x){
00047   Integer n = _x.size();
00048   Integer i = 0;
00049   while((x>_x[i]) && (i<n))
00050     i++;
00051 
00052   return i;
00053 }
00054 
00055 Integer interpolator::getPlaceOnXi(Real x, Integer i)
00056 {
00057   Integer n = _x1.size();
00058   Integer k = 0;
00059   if (i==1)
00060     {
00061     while((x>_x1[k]) && (k<n))
00062       k++;
00063     }
00064   else
00065     {
00066     while((x>_x2[k]) && (k<n))
00067       k++;
00068     }
00069 
00070   return k;
00071 }
00072 
00073 
00074 
00075 Real interpolator::interpolate(Real x)
00076 {
00077   Integer i = getPlace( x);
00078   Integer n = _x.size();
00079 
00080   if(i==0)
00081           return _x[0]; //out of the boundary we return the value of the nearest point
00082   else if (i==n)
00083           return _x[n-1];
00084   else{
00085         Integer j,k;
00086         valarray<Real> xa(3);
00087         valarray<Real> ya(3);
00088 
00089         if (i=n-1) j=n-3;
00090         else j=i-1;
00091 
00092         for(k=0;k<3;k++)
00093                 {
00094                 xa[k]=_x[j+k];
00095                 ya[k]=_y[j+k];
00096                 }
00097 
00098         return getInterpolation(xa, ya, x);
00099   }
00100 }
00101 
00102 
00103 Real interpolator::interpolate(Real x1, Real x2)
00104 {
00105 
00106         Integer i1 = getPlaceOnXi(x1, 1);
00107         Integer i2 = getPlaceOnXi(x2, 2);
00108         Integer N = _x1.size();
00109         Integer M = _x2.size();
00110 
00111 
00112         valarray<Real> xa1(3);
00113         valarray<Real> xa2(3);
00114         valarray<Real> temp(3);
00115         valarray<valarray<Real> >yx(3);
00116         valarray<Real> interpol1(3);
00117         valarray<Real> interpol2(N);
00118         interpolator *tempInt;
00119   
00120     Integer j,k;
00121 
00122         if (i1==0)
00123         {
00124                 tempInt = new interpolator(_x2, _ymat[0]);
00125                 return tempInt->interpolate(x2);
00126         } 
00127         else if (i1==N)
00128         {
00129                   tempInt = new interpolator(_x2, _ymat[N-1]);
00130                   return tempInt->interpolate(x2);
00131         }
00132         else if (i2==0)
00133         {
00134                 for(j=0;j<N;j++)
00135                         interpol2[j] = _ymat[j][0];
00136                 tempInt = new interpolator(_x1, interpol2);
00137                 return tempInt->interpolate(x1);
00138         }
00139         else if (i2==M)
00140         {
00141                 for(j=0;j<N;j++)
00142                         interpol2[j] = _ymat[j][M-1];
00143                 tempInt = new interpolator(_x1, interpol2);
00144                 return tempInt->interpolate(x1);
00145         }
00146         else
00147         {
00148                 if (i1==N-1) i1= N-3;
00149                 else i1--;
00150 
00151                 if (i2==M-1) i2=M-3;
00152                 else i2--;
00153 
00154                 for(j=0;j<3;j++)
00155                 {
00156                         for(k=0;k<3;k++)
00157                                 temp[k] = _ymat[j+i1][k+i2];
00158 
00159                 yx[j].resize(3);
00160                 yx[j]=temp;     
00161                 }
00162 
00163                 for(j=0;j<3;j++)
00164                 {
00165                         xa1[j] = _x1[j+i1];
00166                         xa2[j] = _x2[j+i2];
00167                 }
00168 
00169                 for(j=0;j<3;j++)
00170                 {
00171                         interpol1[j] = getInterpolation(xa2, yx[j], x2);
00172                 }
00173 
00174                 return getInterpolation(xa1, interpol1, x1);
00175         }
00176 }
00177 
00178 
00179 valarray<valarray<Real> > interpolator::interpolate(valarray<Real> vec1, valarray<Real> vec2)
00180 {
00181   Integer n1 = vec1.size();
00182   Integer n2 = vec2.size();
00183   valarray<valarray<Real> > res(n1);
00184   valarray<Real> temp(n2);
00185 
00186   Integer i,j;
00187   for(i=0;i<n1;i++)
00188     {
00189     for(j=0;j<n2;j++)
00190         temp[j] = interpolate(vec1[i], vec2[j]);
00191 
00192     res[i].resize(n2);
00193     res[i] = temp;
00194     }
00195   return res;
00196 }
00197 
00198 Integer interpolatormain()
00199 {
00200 
00201     valarray<Real> x1(4);
00202     valarray<Real> x2(4);
00203     valarray<Real> temp(4);
00204     valarray<valarray<Real> > y(4);
00205 
00206     Integer i,j;
00207     for(i=0;i<4;i++)
00208     {
00209             x1[i]=i/10.0;
00210             x2[i]=i/10.0;
00211     }
00212     
00213     for(i=0;i<4;i++)
00214     {
00215             for(j=0;j<4;j++)
00216                   temp[j]=sin(x1[i]+x2[j]*x2[j]);
00217 
00218             y[i].resize(4);
00219             y[i]=temp;
00220     }
00221 
00222     interpolator terneuve(x1, x2, y);
00223 
00224 
00225   Integer n1 = x1.size();
00226   Integer n2 = x2.size();
00227 
00228 //  Real tab[] = {0.15,0.25,0.35,0.45};
00229 //  valarray<Real> temp(tab, 4);
00230 
00231 
00232   Real res;
00233 
00234   Real x_i = x1[1];
00235   Real x_j = x2[2];
00236   Real x_k = 0.1;
00237 //  res = terneuve.interpolate(x_i,x_j);
00238   res = terneuve.interpolate(x_k,x_j);
00239 
00240   cout<<res;
00241   
00242   return 0;
00243 
00244 
00245 }
00246 
00247 

Note: Generated nightly - reload for latest version
Generated on Thu Dec 22 23:12:36 2005 for terreneuve by doxygen 1.3.6