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];
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
00229
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
00238 res = terneuve.interpolate(x_k,x_j);
00239
00240 cout<<res;
00241
00242 return 0;
00243
00244
00245 }
00246
00247