00001 #include "statsLib.h"
00002
00014 vcubic_spline_function_array::vcubic_spline_function_array( const dvector & x)
00015 {
00016 int mmin=indexmin();
00017 int mmax=indexmax();
00018
00019 int n=mmax-mmin+1;
00020 ptr = new pvcubic_spline_function[n];
00021 ptr-=mmin;
00022 for (int i=mmin;i<=mmax;i++)
00023 {
00024
00025 }
00026 }
00027
00028 vcubic_spline_function_array::vcubic_spline_function_array(int mmin,int mmax,
00029 const dvector & x, const dvar_matrix& y)
00030 {
00031 index_min=mmin;
00032 index_max=mmax;
00033 int n=mmax-mmin+1;
00034 ptr = new pvcubic_spline_function[n];
00035 ptr-=mmin;
00036 for (int i=mmin;i<=mmax;i++)
00037 {
00038 ptr[i]= new vcubic_spline_function(x,y(i));
00039 }
00040 }
00041
00042 vcubic_spline_function & vcubic_spline_function_array::operator () (int i)
00043 {
00044 if (i<indexmin() || i> indexmax())
00045 {
00046 cerr << "index out of range in function"
00047 " vcubic_spline_function & operator () (int i)"
00048 << endl;
00049 ad_exit(1);
00050 }
00051 return *(ptr[i]);
00052 }
00053
00054
00055 dvar_matrix vcubic_spline_function_array::operator( ) (const dvector & v)
00056 {
00057 int mmin=indexmin();
00058 int mmax=indexmax();
00059 dvar_matrix tmp(mmin,mmax,v.indexmin(),v.indexmax());
00060 for (int i=mmin;i<=mmax;i++)
00061 {
00062 tmp(i)=(*this)(i)(v);
00063 }
00064 return tmp;
00065 }
00066
00067 vcubic_spline_function_array::~vcubic_spline_function_array()
00068 {
00069 int mmin=indexmin();
00070 int mmax=indexmax();
00071
00072 for (int i=mmin;i<=mmax;i++)
00073 {
00074 delete ptr[i];
00075 }
00076 ptr+=mmin;
00077 delete ptr;
00078 ptr=0;
00079 }
00080
00081
00082
00083
00093 dvar_vector cubic_spline(const dvar_vector& spline_nodes, const dvector& ip)
00094 {
00095 RETURN_ARRAYS_INCREMENT();
00096 int nodes=size_count(spline_nodes);
00097 dvector ia(1,nodes);
00098 ia.fill_seqadd(0,1./(nodes-1));
00099 dvector fa = (ip-min(ip))/(max(ip)-min(ip));
00100 vcubic_spline_function ffa(ia,spline_nodes);
00101 RETURN_ARRAYS_DECREMENT();
00102 return(ffa(fa));
00103 }
00104
00105
00106
00107 void bicubic_spline(const dvector& x, const dvector& y, dvar_matrix& knots, dvar_matrix& S)
00108 {
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125 RETURN_ARRAYS_INCREMENT();
00126 int i,j;
00127 int m=knots.rowmax();
00128 int n=knots.colmax();
00129
00130 int mm=S.rowmax()-S.rowmin()+1;
00131 int nn=S.colmax()-S.colmin()+1;
00132
00133 dvar_matrix shift_S(1,mm,1,nn);
00134
00135 dvector im(1,mm); im.fill_seqadd(0,1./(mm-1.));
00136 dvector in(1,nn); in.fill_seqadd(0,1./(nn-1.));
00137 dvar_matrix y2(1,m,1,n);
00138 y2=splie2(x,y,knots);
00139
00140 for(i=1;i<=mm;i++){
00141 for(j=1;j<=nn;j++){
00142 shift_S(i,j)=splin2(x,y,knots,y2,in(j),im(i));
00143 }
00144 }
00145
00146 int ii,jj;
00147 ii=0;
00148 for(i=S.rowmin();i<=S.rowmax();i++)
00149 {
00150 ii++; jj=0;
00151 for(j=S.colmin();j<=S.colmax();j++)
00152 {
00153 jj++;
00154 S(i,j)=shift_S(ii,jj);
00155 }
00156 }
00157
00158
00159 RETURN_ARRAYS_DECREMENT();
00160
00161 }
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172
00173
00174
00175
00176
00177
00178
00179
00180
00181
00182
00183
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204
00205
00206
00207
00208
00209
00210
00211
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257 dvar_matrix splie2(const dvector& _x1a,const dvector& _x2a,const dvar_matrix& _ya)
00258 {
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271 RETURN_ARRAYS_INCREMENT();
00272 dvector& x1a=(dvector&) _x1a;
00273 dvector& x2a=(dvector&) _x2a;
00274 dvar_matrix& ya=(dvar_matrix&) _ya;
00275
00276 int m=ya.rowmax();
00277 int n=ya.colmax();
00278 dvar_matrix y2a(1,m,1,n);
00279 int j;
00280 for(j=1;j<=m;j++)
00281 y2a(j)=spline(x1a,ya(j),1.0e30,1.e30);
00282
00283 RETURN_ARRAYS_DECREMENT();
00284 return y2a;
00285 }
00286
00287
00288
00289 dvariable splin2(const dvector& _x1a,const dvector& _x2a, const dvar_matrix _ya,
00290 dvar_matrix& _y2a, const double& x1,const double& x2)
00291 {
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316 RETURN_ARRAYS_INCREMENT();
00317 dvector& x1a=(dvector&) _x1a;
00318 dvector& x2a=(dvector&) _x2a;
00319 dvar_matrix& ya=(dvar_matrix&) _ya;
00320 dvar_matrix& y2a=(dvar_matrix&) _y2a;
00321 int j;
00322 int m=ya.rowmax();
00323 int n=ya.colmax();
00324 dvariable y;
00325 dvar_vector ytmp(1,m);
00326 dvar_vector yytmp(1,m);
00327 for (j=1;j<=m;j++)
00328 yytmp[j]=splint(x1a,ya[j],y2a[j],x2);
00329
00330 ytmp=spline(x2a,yytmp,1.0e30,1.0e30);
00331 y=splint(x2a,yytmp,ytmp,x1);
00332
00333 RETURN_ARRAYS_DECREMENT();
00334 return(y);
00335 }
00336