Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00011 #include "df1b2fun.h"
00012 df3_two_variable cumd_exponential(const df3_two_variable& x,
00013 const df3_two_variable& a);
00014
00015 df3_two_variable cumd_cauchy(const df3_two_variable& x,
00016 const df3_two_variable& a);
00017
00018 df1b2variable inv_cumd_gamma(const df1b2variable& _y,const df1b2variable& _a);
00019 double inv_cumd_gamma(double y,double _a);
00020
00021 df3_two_variable cumd_gamma(const df3_two_variable& x,
00022 const df3_two_variable& a);
00023
00028 df1b2variable gamma_deviate(const df1b2variable& _x,const df1b2variable& _a)
00029 {
00030 df1b2variable& x= (df1b2variable&)(_x);
00031 df1b2variable& a= (df1b2variable&)(_a);
00032
00033 df1b2variable y=cumd_norm(x);
00034 y=.9999*y+.00005;
00035
00036
00037 df1b2variable z=inv_cumd_gamma(y,a);
00038
00039 return z;
00040 }
00041
00046 df1b2variable inv_cumd_gamma(const df1b2variable& _y,const df1b2variable& _a)
00047 {
00048 df1b2variable& y= (df1b2variable&)(_y);
00049 df1b2variable& a= (df1b2variable&)(_a);
00050
00051 double x=inv_cumd_gamma(value(y),value(_a));
00052
00053 init_df3_two_variable xx(value(x));
00054 init_df3_two_variable aa(value(a));
00055
00056
00057 *xx.get_u_x()=1.0;
00058 *aa.get_u_y()=1.0;
00059
00060 df3_two_variable z=cumd_gamma(xx,aa);
00061
00062
00063
00064
00065
00066
00067 double F_x=1.0/(*z.get_u_x());
00068
00069 double F_y=-F_x* *z.get_u_y();
00070 double F_xx=-F_x* *z.get_u_xx()/square(*z.get_u_x());
00071
00072 double F_xy=-(F_xx * *z.get_u_x() * *z.get_u_y() + F_x * *z.get_u_xy())/
00073 *z.get_u_x();
00074
00075 double F_yy=-(F_xx * square(*z.get_u_y())
00076 +2.0* F_xy* *z.get_u_y()
00077 +F_x * *z.get_u_yy());
00078
00079 double F_xxx=-(F_x* *z.get_u_xxx()
00080 +3.0*F_xx* *z.get_u_x() * *z.get_u_xx())
00081 /cube(*z.get_u_x());
00082
00083 double F_xxy=-(F_xxx * square(*z.get_u_x())* *z.get_u_y()
00084 + 2.0*F_xx* *z.get_u_x()* *z.get_u_xy()
00085 + F_xx* *z.get_u_xx() * *z.get_u_y()
00086 + F_xy * *z.get_u_xx()
00087 + F_x * *z.get_u_xxy())/
00088 square(*z.get_u_x());
00089
00090 double F_xyy=-(F_xxx* *z.get_u_x() *square(*z.get_u_y())
00091 +2.0* F_xx * *z.get_u_xy() * *z.get_u_y()
00092 +2.0*F_xxy * *z.get_u_x() * *z.get_u_y()
00093 + 2.0*F_xy * *z.get_u_xy()
00094 + F_xx * *z.get_u_x() * *z.get_u_yy()
00095 + F_x * *z.get_u_xyy())/
00096 *z.get_u_x();
00097 double F_yyy=-(F_xxx*cube(*z.get_u_y())+
00098 +3.0*F_xxy*square(*z.get_u_y())
00099 +3.0*F_xx* *z.get_u_y() * *z.get_u_yy()
00100 +3.0*F_xy* *z.get_u_yy()
00101 +3.0*F_xyy * *z.get_u_y()
00102 +F_x * *z.get_u_yyy());
00103
00104 df1b2variable zz;
00105 double * xd=_y.get_u_dot();
00106 double * yd=_a.get_u_dot();
00107 double * zd=zz.get_u_dot();
00108 *zz.get_u()=x;
00109
00110 for (unsigned int i=0;i<df1b2variable::nvar;i++)
00111 {
00112 *zd++ = F_x * *xd++ + F_y * *yd++;
00113 }
00114 if (!df1b2_gradlist::no_derivatives)
00115 {
00116 f1b2gradlist->write_pass1(&_y,&_a,&zz,
00117 F_x,F_y,
00118 F_xx,F_xy,F_yy,
00119 F_xxx,F_xxy,F_xyy,F_yyy);
00120 }
00121 return zz;
00122 }