00001 #include "fpcsquare.h" 00002 #include "numericmethods.h" 00003 #include "fbsinverse.h" 00004 00005 00006 FPcSquare::FPcSquare(double n,double srw,double sro,double maxPc) 00007 { 00008 m_srw=srw; 00009 m_maxsw=1-sro; 00010 m_n = n; 00011 m_tau=sro*sro/((1.0-sro-srw)*(1.0-sro-srw)); 00012 m_minS=srw; 00013 m_maxPc=INFINITY; 00014 00015 if (maxPc != INFINITY) 00016 { 00017 BSInverse finv(*this,srw,1-sro,1.e-8); 00018 double tmp; 00019 tmp=finv(maxPc,0); 00020 m_maxPc=(*this)(tmp); 00021 m_minS=tmp; 00022 } 00023 printf("%g %g %g\n",m_minS,m_maxPc,srw); 00024 } 00025 00026 00027 00028 00029 double FPcSquare::operator()(double x,unsigned cmp) const 00030 { 00031 if (x <= m_minS) 00032 return m_maxPc; 00033 if (x>=m_maxsw) 00034 return 0.0; 00035 double dd=x-m_srw; 00036 double d2=1.0-x; 00037 assert(cmp==0); 00038 00039 return m_n*(1.0/(dd*dd)-m_tau/(d2*d2)); 00040 } 00041 00042 00043 00044