/* Perform a double-beta density model fitting to the surface brightness data Author: Junhua Gu Last modified: 2011.01.01 This code is distributed with no warrant */ //#define HAVE_X_ERROR #include #include #include #include #include #include #include "statistics/chisq.hpp" #include "statistics/logchisq.hpp" #include "statistics/leastsq.hpp" #include #include #include #include using namespace std; using namespace opt_utilities; //double s=5.63136645E20; const double kpc=3.086E21;//kpc in cm const double Mpc=kpc*1000; const double pi=4*atan(1); double std_norm_rand() { double u=0; double v=0; while(u<=0||v<=0) { u=rand()/(double)RAND_MAX; rand(); v=rand()/(double)RAND_MAX; } double x=std::sqrt(-log(u))*cos(2*pi*v); return x; } double shuffle_data(double xc,double xl,double xu) { double lxc=log(xc); double lxl=log(xc-xl)-log(xc); double lxu=log(xc+xu)-log(xc); if(std_norm_rand()>0) { double result=std::exp(lxc-std::abs(std_norm_rand()*lxl)); return result; } else { double result=std::exp(lxc+std::abs(std_norm_rand()*lxu)); return result; } } int main(int argc,char* argv[]) { srand(time(0)); if(argc!=4) { cerr<<"Usage:"< "<0); ifstream ifs_data(argv[1]); default_data_set ds; ofstream ofs_result("m-t_bpl_result.qdp"); ofs_result<<"read terr 1 2"<>T>>Tl>>Tu>>M>>Ml>>Mu; if(!ifs_data.good()) { break; } line+=" "; istringstream iss(line); if(line[0]=='#') { if(!is_first_nonono) { ofs_result<<"no no no"<>T>>Tl>>Tu>>M>>Ml>>Mu; //std::cerr<std::abs(M)) { continue; } Tl=std::abs(Tl); Tu=std::abs(Tu); Ml=std::abs(Ml); Mu=std::abs(Mu); ofs_result<Tb) { sxxl+=log(x)*log(x); sxl+=log(x); syl+=log(y); sxyl+=log(y)*log(x); s1l+=1; } else { sxxu+=log(x)*log(x); sxu+=log(x); syu+=log(y); sxyu+=log(y)*log(x); s1u+=1; } data d(x,y,std::abs(yl),std::abs(yu), std::abs(xl),std::abs(xu)); ds.add_data(d); } double Ml=sxxl*s1l-sxl*sxl; double Mal=sxyl*s1l-syl*sxl; double Mbl=sxxl*syl-sxl*sxyl; double k0l=Mal/Ml; double b0l=Mbl/Ml; double Mu=sxxu*s1u-sxu*sxu; double Mau=sxyu*s1u-syu*sxu; double Mbu=sxxu*syu-sxu*sxyu; double k0u=Mau/Mu; double b0u=Mbu/Mu; double gamma0l=k0l; double gamma0u=k0u; double ampl0l=exp(b0l)*pow(Tb,gamma0l); double ampl0u=exp(b0u)*pow(Tb,gamma0u);; ofs_result<<"no no no"<,double,std::string> fit; fit.set_opt_method(powell_method >()); fit.set_statistic(logchisq,double,std::string>()); //fit.set_statistic(leastsq,double,std::string>()); fit.set_model(bpl1d()); fit.load_data(ds); cerr<<"k0l="< >()); fit.fit(); std::vector p=fit.fit(); Tb=fit.get_param_value("bpx"); //std::cout<<"chi="< mean_p(p.size()); std::vector mean_p2(p.size()); int cnt=0; for(int n=0;n<100;++n) { ++cnt; cerr<<"."; double sxxl=0; double s1l=0; double sxl=0; double syl=0; double sxyl=0; double sxxu=0; double s1u=0; double sxu=0; double syu=0; double sxyu=0; opt_utilities::default_data_set ds1; for(size_t i=0;i(new_x,new_y, yl/y*new_y, yu/y*new_y, xl/x*new_x, xu/x*new_x)); x=new_x; y=new_y; if(x>Tb) { sxxl+=log(x)*log(x); sxl+=log(x); syl+=log(y); sxyl+=log(y)*log(x); s1l+=1; } else { sxxu+=log(x)*log(x); sxu+=log(x); syu+=log(y); sxyu+=log(y)*log(x); s1u+=1; } } double Ml=sxxl*s1l-sxl*sxl; double Mal=sxyl*s1l-syl*sxl; double Mbl=sxxl*syl-sxl*sxyl; double k0l=Mal/Ml; double b0l=Mbl/Ml; double Mu=sxxu*s1u-sxu*sxu; double Mau=sxyu*s1u-syu*sxu; double Mbu=sxxu*syu-sxu*sxyu; double k0u=Mau/Mu; double b0u=Mbu/Mu; double gamma0l=k0l; double gamma0u=k0u; double ampl0l=exp(b0l)*pow(Tb,gamma0l); double ampl0u=exp(b0u)*pow(Tb,gamma0u);; fit.set_param_value("bpx",Tb); fit.set_param_value("bpy",(ampl0l+ampl0u)/2); fit.set_param_value("gamma1",gamma0l); fit.set_param_value("gamma2",gamma0u); fit.load_data(ds1); fit.fit(); vector p=fit.fit(); for(size_t i=0;i std_p(p.size()); cerr<