00001
00002
00003
00004
00005
00006
00011 #include <admodel.h>
00012
00013 double set_value_mc(double z,double min,double max);
00014
00015
00016
00021 int initial_params::montecarlo_scale(const dvector& d, const dvector& x)
00022 {
00023 int ii = 1;
00024 for (int i = 0; i < num_initial_params; i++)
00025 {
00026
00027 if (withinbound(0, (varsptr[i])->phase_start, current_phase))
00028 (varsptr[i])->mc_scale(d,x,ii);
00029 }
00030 return ii - 1;
00031 }
00032
00037 void param_init_number::mc_scale(const dvector& _d, const dvector& x,
00038 const int& _ii)
00039 {
00040 dvector& d=(dvector&) _d;
00041 int& ii=(int&) _ii;
00042 d(ii)=1;
00043 ii++;
00044 }
00045
00050 void param_init_bounded_number::mc_scale(const dvector& _d, const dvector& x,
00051 const int& _ii)
00052 {
00053 dvector& d=(dvector&) _d;
00054 int& ii=(int&) _ii;
00055 double pen=0;
00056
00057 double xx=set_value_inv_mc(*this,minb,maxb);
00058 double yy=boundpin(*this,minb,maxb);
00059 double a=ndfboundp(yy,minb,maxb,pen);
00060 double b=ndfboundp_mc(xx,minb,maxb,pen);
00061 d(ii)=b/a;
00062 ii++;
00063 }
00064
00069 double ndfboundp_mc(double x, double fmin, double fmax,const double& fpen)
00070 {
00071 if (x<-0.99999)
00072 {
00073 double df1=(set_value_mc(x+1.e-6,fmin,fmax)-
00074 set_value_mc(x,fmin,fmax))/1.e-6;
00075 double df2=(set_value_mc(x+2.e-6,fmin,fmax)
00076 -set_value_mc(x,fmin,fmax))/2.e-6;
00077 return 2.*df1-df2;
00078 }
00079 else if (x>0.99999)
00080 {
00081 double df1=(set_value_mc(x,fmin,fmax)
00082 -set_value_mc(x-1.e-6,fmin,fmax))/1.e-6;
00083 double df2=(set_value_mc(x,fmin,fmax)-
00084 set_value_mc(x-2.e-6,fmin,fmax))/2.e-6;
00085 return 2.*df1-df2;
00086 }
00087 else
00088 {
00089 return (set_value_mc(x+1.e-6,fmin,fmax)-
00090 set_value_mc(x-1.e-6,fmin,fmax))/2.e-6;
00091 }
00092 }
00093
00098 void param_init_vector::mc_scale(const dvector& _v, const dvector& x,
00099 const int& _ii)
00100 {
00101 int& ii=(int&) _ii;
00102 dvector& v=(dvector&) _v;
00103 int mmin=indexmin();
00104 int mmax=indexmax();
00105 for (int i=mmin;i<=mmax;i++)
00106 {
00107 v(ii++)=1.;
00108 }
00109 }
00110
00115 void param_init_matrix::mc_scale(const dvector& _v, const dvector& x,
00116 const int& _ii)
00117 {
00118 int& ii=(int&) _ii;
00119 dvector& v=(dvector&) _v;
00120 int mmin=rowmin();
00121 int mmax=rowmax();
00122 for (int i=mmin;i<=mmax;i++)
00123 {
00124 int cmin=((*this)(i)).indexmin();
00125 int cmax=((*this)(i)).indexmax();
00126 for (int j=cmin;j<=cmax;j++)
00127 {
00128 v(ii++)=1.;
00129 }
00130 }
00131 }
00132
00137 void param_init_d3array::mc_scale(const dvector& _v, const dvector& x,
00138 const int& _ii)
00139 {
00140 int& ii=(int&) _ii;
00141 dvector& v=(dvector&) _v;
00142 int mmin=slicemin();
00143 int mmax=slicemax();
00144 for (int i=mmin;i<=mmax;i++)
00145 {
00146 int rmin=((*this)(i)).rowmin();
00147 int rmax=((*this)(i)).rowmax();
00148 for (int j=rmin;j<=rmax;j++)
00149 {
00150 int cmin=((*this)(i))(j).indexmin();
00151 int cmax=((*this)(i))(j).indexmax();
00152 for (int k=cmin;k<=cmax;k++)
00153 {
00154 v(ii++)=1.;
00155 }
00156 }
00157 }
00158 }
00159
00164 void param_init_bounded_vector::mc_scale(const dvector& _v, const dvector& x,
00165 const int& _ii)
00166 {
00167 int& ii=(int&) _ii;
00168 dvector& v=(dvector&) _v;
00169 int mmin=indexmin();
00170 int mmax=indexmax();
00171 double pen=0;
00172 for (int i=mmin;i<=mmax;i++)
00173 {
00174 double var=set_value_mc(x(ii),minb,maxb);
00175 double xx=boundpin(var,minb,maxb);
00176 double a=ndfboundp(xx,minb,maxb,pen);
00177 double b=ndfboundp_mc(x(ii),minb,maxb,pen);
00178 v(ii)=b/a;
00179 ii++;
00180 }
00181 }
00182
00187 void param_init_bounded_matrix::mc_scale(const dvector& _v, const dvector& x,
00188 const int& _ii)
00189 {
00190 int& ii=(int&) _ii;
00191 dvector& v=(dvector&) _v;
00192 int rmin=rowmin();
00193 int rmax=rowmax();
00194 double pen=0;
00195 for (int i=rmin;i<=rmax;i++)
00196 {
00197 int cmin=(*this)(i).indexmin();
00198 int cmax=(*this)(i).indexmax();
00199 for (int j=cmin;j<=cmax;j++)
00200 {
00201 v(ii)=ndfboundp(x(ii),minb,maxb,pen);
00202 double var=set_value_mc(x(ii),minb,maxb);
00203 double xx=set_value_inv_mc(var,minb,maxb);
00204 double a=ndfboundp(xx,minb,maxb,pen);
00205 double b=ndfboundp_mc(xx,minb,maxb,pen);
00206 v(ii)=b/a;
00207 ii++;
00208 }
00209 }
00210 }