ADMB Documentation  -a65f1c97
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
vcubicspline.cpp
Go to the documentation of this file.
1 #include "statsLib.h"
2 
15  {
16  int mmin=indexmin();
17  int mmax=indexmax();
18 
19  int n=mmax-mmin+1;
21  ptr-=mmin;
22  for (int i=mmin;i<=mmax;i++)
23  {
24  // ptr[i]= new vcubic_spline_function(x); // not sure how to call this...should return matrix ...
25  }
26  }
27 
29  const dvector & x, const dvar_matrix& y)
30  {
31  index_min=mmin;
32  index_max=mmax;
33  int n=mmax-mmin+1;
35  ptr-=mmin;
36  for (int i=mmin;i<=mmax;i++)
37  {
38  ptr[i]= new vcubic_spline_function(x,y(i));
39  }
40  }
41 
43 {
44  if (i<indexmin() || i> indexmax())
45  {
46  cerr << "index out of range in function"
47  " vcubic_spline_function & operator () (int i)"
48  << endl;
49  ad_exit(1);
50  }
51  return *(ptr[i]);
52  }
53 
54 
55 dvar_matrix vcubic_spline_function_array::operator( ) (const dvector & v)
56  {
57  int mmin=indexmin();
58  int mmax=indexmax();
59  dvar_matrix tmp(mmin,mmax,v.indexmin(),v.indexmax());
60  for (int i=mmin;i<=mmax;i++)
61  {
62  tmp(i)=(*this)(i)(v);
63  }
64  return tmp;
65  }
66 
68 {
69  int mmin=indexmin();
70  int mmax=indexmax();
71 
72  for (int i=mmin;i<=mmax;i++)
73  {
74  delete ptr[i];
75  }
76  ptr+=mmin;
77  delete ptr;
78  ptr=0;
79  }
80 
81 
82 
83 
93 dvar_vector cubic_spline(const dvar_vector& spline_nodes, const dvector& ip)
94 {
96  int nodes=size_count(spline_nodes);
97  dvector ia(1,nodes);
98  ia.fill_seqadd(0,1./(nodes-1));
99  dvector fa = (ip-min(ip))/(max(ip)-min(ip));
100  vcubic_spline_function ffa(ia,spline_nodes);
102  return(ffa(fa));
103 }
104 
105 
106 
107 void bicubic_spline(const dvector& x, const dvector& y, dvar_matrix& knots, dvar_matrix& S)
108 {
109  /*
110  Author: Steven Martell
111  Date: July 29, 2010
112  Comments: Based on code from Numerical Recipies.
113 
114  This function returns matrix S which is the interpolated values of knots
115  over knots[1..m][1..n] grid.
116 
117  first call splie2 to get second-derivatives at knot points
118  void splie2(const dvector& _x1a,const dvector& _x2a,const dmatrix& _ya,dvar_matrix& _y2a)
119 
120  then run the splin2 to get the spline points
121  dvariable splin2(const dvector& _x1a,const dvector* _x2a, const dmatrix _ya,
122  dvar_matrix& _y2a, const double& x1,const double& x2)
123  */
124 
126  int i,j;
127  int m=knots.rowmax();
128  int n=knots.colmax();
129 
130  int mm=S.rowmax()-S.rowmin()+1;
131  int nn=S.colmax()-S.colmin()+1;
132 
133  dvar_matrix shift_S(1,mm,1,nn);
134 
135  dvector im(1,mm); im.fill_seqadd(0,1./(mm-1.));
136  dvector in(1,nn); in.fill_seqadd(0,1./(nn-1.));
137  dvar_matrix y2(1,m,1,n); //matrix of second-derivatives
138  y2=splie2(x,y,knots);
139 
140  for(i=1;i<=mm;i++){
141  for(j=1;j<=nn;j++){
142  shift_S(i,j)=splin2(x,y,knots,y2,in(j),im(i));
143  }
144  }
145 
146  int ii,jj;
147  ii=0;
148  for(i=S.rowmin();i<=S.rowmax();i++)
149  {
150  ii++; jj=0;
151  for(j=S.colmin();j<=S.colmax();j++)
152  {
153  jj++;
154  S(i,j)=shift_S(ii,jj);
155  }
156  }
157 
158  //cout<<shift_S<<endl;
160  //cout<<"Bicubic"<<endl;
161 }
162 
163 
164 
165  // dvar_vector spline(const dvector &_x,const dvar_vector&_y,double yp1,double ypn)
166  // {
167  // RETURN_ARRAYS_INCREMENT();
168  // dvector& x=(dvector&) _x;
169  // dvar_vector& y=(dvar_vector&) _y;
170  // int orig_min=x.indexmin();
171  // x.shift(1);
172  // y.shift(1);
173  // // need to check that x is monotone increasing;
174  // if ( x.indexmax() != y.indexmax() )
175  // {
176  // cerr << " Incompatible bounds in input to spline, fix it" << endl;
177  // }
178  // int n=x.indexmax();
179  // dvar_vector y2(1,n);
180  // int i,k;
181  // dvariable p,qn,sig,un;
182  // dvar_vector u(1,n-1);
183  // if (yp1 > 0.99e30)
184  // {
185  // y2[1]=u[1]=0.0;
186  // }
187  // else
188  // {
189  // y2[1] = -0.5;
190  // u[1]=(3.0/(x[2]-x[1]))*((y[2]-y[1])/(x[2]-x[1])-yp1);
191  // }
192  // for (i=2;i<=n-1;i++)
193  // {
194  // sig=(x[i]-x[i-1])/(x[i+1]-x[i-1]);
195  // p=sig*y2[i-1]+2.0;
196  // y2[i]=(sig-1.0)/p;
197  // u[i]=(y[i+1]-y[i])/(x[i+1]-x[i]) - (y[i]-y[i-1])/(x[i]-x[i-1]);
198  // u[i]=(6.0*u[i]/(x[i+1]-x[i-1])-sig*u[i-1])/p;
199  // }
200  // if (ypn > 0.99e30)
201  // {
202  // qn=un=0.0;
203  // }
204  // else
205  // {
206  // qn=0.5;
207  // un=(3.0/(x[n]-x[n-1]))*(ypn-(y[n]-y[n-1])/(x[n]-x[n-1]));
208  // }
209  // y2[n]=(un-qn*u[n-1])/(qn*y2[n-1]+1.0);
210  // for (k=n-1;k>=1;k--)
211  // {
212  // y2[k]=y2[k]*y2[k+1]+u[k];
213  // }
214  // x.shift(orig_min);
215  // y.shift(orig_min);
216  // y2.shift(orig_min);
217  // RETURN_ARRAYS_DECREMENT();
218  // return y2;
219  // }
220  //
221  //
222  // dvariable splint(const dvector& _xa,const dvar_vector& _ya, const dvar_vector& _y2a,double x)
223  // {
224  // RETURN_ARRAYS_INCREMENT();
225  // dvector& xa=(dvector&) _xa;
226  // dvar_vector& ya=(dvar_vector&) _ya;
227  // dvar_vector& y2a=(dvar_vector&) _y2a;
228  // int orig_min=xa.indexmin();
229  // xa.shift(1);
230  // ya.shift(1);
231  // y2a.shift(1);
232  // dvariable y;
233  // int n = xa.indexmax();
234  // int klo,khi,k;
235  // dvariable h,b,a;
236  //
237  // klo=1;
238  // khi=n;
239  // while (khi-klo > 1)
240  // {
241  // k=(khi+klo) >> 1;
242  // if (xa[k] > x) khi=k;
243  // else klo=k;
244  // }
245  // h=xa[khi]-xa[klo];
246  // a=(xa[khi]-x)/h;
247  // b=(x-xa[klo])/h;
248  // y=a*ya[klo]+b*ya[khi]+((a*a*a-a)*y2a[klo]+(b*b*b-b)*y2a[khi])*(h*h)/6.0;
249  // xa.shift(orig_min);
250  // ya.shift(orig_min);
251  // y2a.shift(orig_min);
252  // RETURN_ARRAYS_DECREMENT();
253  // return y;
254  // }
255  //
256 
257 dvar_matrix splie2(const dvector& _x1a,const dvector& _x2a,const dvar_matrix& _ya)//,dvar_matrix& _y2a)
258 {
259 /* NR code:
260  void splie2(float x1a[], float x2a[], float **ya, int m, int n, float **y2a)
261  Given an m by n tabulated function ya[1..m][1..n], and tabulated independent variables
262  x2a[1..n], this routine constructs one-dimensional natural cubic splines of the rows of ya
263  and returns the second-derivatives in the array y2a[1..m][1..n]. (The array x1a[1..m] is
264  included in the argument list merely for consistency with routine splin2.)
265  {
266  void spline(float x[], float y[], int n, float yp1, float ypn, float y2[]);
267  int j;
268  for (j=1;j<=m;j++)
269  spline(x2a,ya[j],n,1.0e30,1.0e30,y2a[j]); Values 1x1030 signal a nat-
270  } */
272  dvector& x1a=(dvector&) _x1a;
273  dvector& x2a=(dvector&) _x2a;
274  dvar_matrix& ya=(dvar_matrix&) _ya;
275  //dvar_matrix& y2a=(dvar_matrix&) _y2a;
276  int m=ya.rowmax();
277  int n=ya.colmax();
278  dvar_matrix y2a(1,m,1,n);
279  int j;
280  for(j=1;j<=m;j++)
281  y2a(j)=spline(x1a,ya(j),1.0e30,1.e30);
282  //function should return second-derivatives in y2a[1..m][1..n]
284  return y2a;
285 }
286 
287 
288 
289 dvariable splin2(const dvector& _x1a,const dvector& _x2a, const dvar_matrix _ya,
290  dvar_matrix& _y2a, const double& x1,const double& x2)//,dvariable& y)
291 {
292  /*
293  Original NR code:
294  void splin2(float x1a[], float x2a[], float **ya, float **y2a, int m, int n,
295  float x1, float x2, float *y)
296  Given x1a, x2a, ya, m, n as described in splie2 and y2a as produced by that routine; and
297  given a desired interpolating point x1,x2; this routine returns an interpolated function value y
298  by bicubic spline interpolation.
299  {
300  void spline(float x[], float y[], int n, float yp1, float ypn, float y2[]);
301  void splint(float xa[], float ya[], float y2a[], int n, float x, float *y);
302  int j;
303  float *ytmp,*yytmp;
304  ytmp=vector(1,m);
305  yytmp=vector(1,m); Perform m evaluations of the row splines constructed by
306  splie2, using the one-dimensional spline evaluator
307  splint.
308  for (j=1;j<=m;j++)
309  splint(x2a,ya[j],y2a[j],n,x2,&yytmp[j]);
310  spline(x1a,yytmp,m,1.0e30,1.0e30,ytmp); Construct the one-dimensional colsplint(
311  x1a,yytmp,ytmp,m,x1,y); umn spline and evaluate it.
312  free_vector(yytmp,1,m);
313  free_vector(ytmp,1,m);
314  }
315  */
317  dvector& x1a=(dvector&) _x1a;
318  dvector& x2a=(dvector&) _x2a;
319  dvar_matrix& ya=(dvar_matrix&) _ya;
320  dvar_matrix& y2a=(dvar_matrix&) _y2a;
321  int j;
322  int m=ya.rowmax();
323  int n=ya.colmax();
324  dvariable y;
325  dvar_vector ytmp(1,m);
326  dvar_vector yytmp(1,m);
327  for (j=1;j<=m;j++)
328  yytmp[j]=splint(x1a,ya[j],y2a[j],x2);
329 
330  ytmp=spline(x2a,yytmp,1.0e30,1.0e30);
331  y=splint(x2a,yytmp,ytmp,x1);
332 
334  return(y);
335 }
336 
int rowmax(void) const
Definition: fvar.hpp:2564
void RETURN_ARRAYS_DECREMENT(void)
Decrements gradient_structure::RETURN_ARRAYS_PTR.
Definition: gradstrc.cpp:507
int colmin(void) const
Definition: fvar.hpp:2552
#define x
Vector of double precision numbers.
Definition: dvector.h:50
void fill_seqadd(double, double)
Fills dvector elements with values starting from base and incremented by offset.
Definition: cranfill.cpp:58
double splint(const dvector &xa, const dvector &ya, const dvector &y2a, double x)
Definition: cspline.cpp:92
exitptr ad_exit
Definition: gradstrc.cpp:53
ADMB variable vector.
Definition: fvar.hpp:2172
dvar_matrix splie2(const dvector &_x1a, const dvector &_x2a, const dvar_matrix &_ya)
vcubic_spline_function_array(int, int, const dvector &x, const dvar_matrix &_y)
dvar_vector cubic_spline(const dvar_vector &spline_nodes, const dvector &ip)
A Wrapper for the vcubic_spline_function.
vcubic_spline_function & operator()(int i)
prnstream & endl(prnstream &)
vcubic_spline_function ** ptr
Definition: statsLib.h:289
#define min(a, b)
Definition: cbivnorm.cpp:188
dvector spline(const dvector &x, const dvector &y, double yp1, double ypn)
Definition: cspline.cpp:37
int rowmin(void) const
Definition: fvar.hpp:2560
Library of statistic functions.
Class definition of matrix with derivitive information .
Definition: fvar.hpp:2480
unsigned int size_count(const dvector &x)
Returns total size of elements in vector x.
Definition: dsize.cpp:17
void bicubic_spline(const dvector &x, const dvector &y, dvar_matrix &knots, dvar_matrix &S)
void RETURN_ARRAYS_INCREMENT(void)
Increments gradient_structure::RETURN_ARRAYS_PTR.
Definition: gradstrc.cpp:474
#define max(a, b)
Definition: cbivnorm.cpp:189
Description not yet available.
Definition: fvar.hpp:5039
Fundamental data type for reverse mode automatic differentiation.
Definition: fvar.hpp:1518
dvariable splin2(const dvector &_x1a, const dvector &_x2a, const dvar_matrix _ya, dvar_matrix &_y2a, const double &x1, const double &x2)
int colmax(void) const
Definition: fvar.hpp:2556