def fig_0f1(Rpc, ds_sim, k, mass_bin): test_read_m16_ds_1(mass_bin=mass_bin) plt.plot(Rpc[:], ds_sim[k, :], '--') nn = ds_sim[k, :].size #求样本大小 x_mean = np.mean(ds_sim[k, :]) #求算术平均值 x_std = np.std(ds_sim[k, :]) #求标准偏差 x_se = x_std / np.sqrt(nn) #求标准误差 dof = nn - 1 #自由度计算 alpha = 1.0 - 0.95 conf_region = st.ppf(1-alpha/2.,dof)*x_std*\ np.sqrt(1.+1./nn)#设置置信区间 plt.errorbar(Rpc[:], ds_sim[k, :], yerr=x_std, fmt='-', linewidth=0.5) plt.xlabel(r'$R-Mpc/h$') plt.ylabel(r'$\Delta\Sigma-hM_\odot/{pc^2}$') return x_mean, x_se, conf_region
def fig_mass(pp): m_bin = ['10.0_10.4', '10.4_10.7', '10.7_11.0', '11.0_15.0'] mbin = [10.2, 10.55, 10.9, 13.0] #作图取点 m, N, z = input_mass_bin(v=True) z_use = np.zeros((len(m_bin), 2), dtype=np.float) ##计算误差棒并存储的数组 err_bar_r = np.zeros((len(m_bin), 2), dtype=np.float) err_bar_b = np.zeros((len(m_bin), 2), dtype=np.float) for k in range(0, len(m_bin)): if k == len(m_bin) - 1: z_use[k, :] = z[:, -1] else: z_use[k, :] = z[:, k] print(z_use) #print(m_bin) #该句导入拟合质量 Pr_mh = np.zeros((len(m_bin), 2), dtype=np.float) b_m_r = np.zeros(len(m_bin), dtype=np.float) b_m_b = np.zeros(len(m_bin), dtype=np.float) #Pr_mh的第一行存red的质量,第二行存blue的质量,x_std也一样 for k in range(0, len(m_bin)): rp, best_mr, delta_r, bestfmr = fit_datar_1(m_bin[k], z_use[k, 0], k) rp, best_mb, delta_b, bestfmb = fit_datab_1(m_bin[k], z_use[k, 1], k) Pr_mh[k, 0] = best_mr Pr_mh[k, 1] = best_mb b_m_r[k] = bestfmr b_m_b[k] = bestfmb ##下面把x^2转化为相应的概率分布,并让mh的划分区间服从这个分布 mr = m[k] mb = m[k] rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=m_bin[k]) pr = np.ones(len(m[k]), dtype=np.float) pb = np.ones(len(m[k]), dtype=np.float) ds_errsar = ds_errsa[0, 0:len(rp)] ds_errsab = ds_errsa[1, 0:len(rp)] for q in range(0, len(mr)): ss = 1 for t in range(0, len(rp)): ss = ss * (1 / (np.sqrt(np.pi * 2) * ds_errsar[t])) * np.exp( (-1 / 2) * delta_r[q]) pr[q] = ss for q in range(0, len(mb)): qq = 1 for t in range(0, len(rp)): qq = qq * (1 / (np.sqrt(np.pi * 2) * ds_errsab[t])) * np.exp( (-1 / 2) * delta_b[q]) pb[q] = qq ##第一次归一化,把概率密度函数归一到0~1之间 pr = (pr - np.min(pr)) / (np.max(pr) - np.min(pr)) pb = (pb - np.min(pb)) / (np.max(pb) - np.min(pb)) ''' plt.figure() plt.plot(mr,pr,'r') plt.title('Probability distribution') plt.xlabel(r'$log(M_h/M_\odot)$') plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$') plt.show() plt.plot(mb,pb,'b') plt.title('Probability distribution') plt.xlabel(r'$log(M_h/M_\odot)$') plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$') plt.show() ''' #print('r=',delta_r) #print('b=',delta_b) ##第二次归一化,目的是让所有概率求和为1 fr = np.zeros(len(mr), dtype=np.float) fb = np.zeros(len(mb), dtype=np.float) ss = 0 qq = 0 Fr = np.zeros(len(mr), dtype=np.float) Fb = np.zeros(len(mb), dtype=np.float) for q in range(0, len(mr)): ss = ss + pr[q] * (mr[1] - mr[0]) fr[q] = ss for q in range(0, len(mb)): qq = qq + pb[q] * (mb[1] - mb[0]) fb[q] = qq Ar = np.max(fr) Ab = np.max(fb) ss = 0 qq = 0 for q in range(0, len(mr)): ss = ss + pr[q] * (mr[1] - mr[0]) / Ar Fr[q] = ss for q in range(0, len(mb)): qq = qq + pb[q] * (mb[1] - mb[0]) / Ab Fb[q] = qq #plt.figure() #plt.plot(mr,Fr,'r') #plt.show() #plt.plot(mb,Fb,'b') #plt.show() vr = np.interp(0.16, Fr, mr) ur = np.interp(0.84, Fr, mr) err_bar_r[k, :] = [vr - bestfmr, ur - bestfmr] vb = np.interp(0.16, Fb, mb) ub = np.interp(0.84, Fb, mb) err_bar_b[k, :] = [vb - bestfmb, ub - bestfmb] ##对应for循环前面的plt.figure #print('phy_mr=',Pr_mh[:,0]) #print('phy_mb=',Pr_mh[:,1]) #print('errbar_r=',err_bar_r) #print('errbar_b=',err_bar_b) #####注意errorbar作图命令 plt.figure() color_list = ['r', 'b', 'g'] line1, caps1, bars1 = plt.errorbar(mbin, Pr_mh[:, 0], yerr=[err_bar_r[:, 0], err_bar_r[:, 1]], fmt="ks-", linewidth=1, elinewidth=0.5, ecolor='k', capsize=1, capthick=0.5, label='red') line3, caps3, bars3 = plt.errorbar(mbin, Pr_mh[:, 1], yerr=[err_bar_b[:, 0], err_bar_b[:, 1]], fmt="k^-", linewidth=1, elinewidth=0.5, ecolor='k', capsize=1, capthick=0.5, label='blue') plt.fill_between(mbin, Pr_mh[:, 0] + err_bar_r[:, 0], Pr_mh[:, 0] + err_bar_r[:, 1], facecolor=color_list[0], alpha=.20) plt.fill_between(mbin, Pr_mh[:, 1] + err_bar_b[:, 0], Pr_mh[:, 1] + err_bar_b[:, 1], facecolor=color_list[1], alpha=.20) plt.xlabel(r'$log[M_\ast/M_\odot]$') plt.ylabel(r'$log{\langle M_{200} \rangle/[M_\odot h^{-1}]}$') plt.legend(loc=2) plt.title(r'$Standard Deviation-1\sigma_{p}$') plt.axis([10, 14, 11, 14]) #plt.savefig('Standard_deviation.png',dpi=600) plt.show() return Pr_mh
def fit_datab_1(mass_bin, z_int, T): h = 0.673 #先找出观测值对应的rp #rsa,dssa,ds_errsa = test_read_m16_ds_1() rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=mass_bin) # print('ds=',dssa) # print('ds_err=',ds_errsa) #print('rp=',rsa) #a = np.shape(dssa) #print('size a=',a) ##注意到观测数值选取的是物理坐标,需要靠里尺度银子修正,修正如下 #z_b = 0.1 #a_b = 1/(1+z_b) ##此时对于预测的R也要做修正 rp = np.array( [rsa[0, k] for k in range(0, len(rsa[0, :])) if rsa[0, k] * h <= 5]) # rp = [rsa[0,k] for k in range(0,len(rsa[0,:])) if rsa[0,k]*h<=2] # rp = rsa[0,:] #该句直接对数组筛选,计算2Mpc以内(保证NFW模型适用的情况下)信号 #print(rp) b = len(rp) m, N, z = input_mass_bin(v=True) mb = m[T] #print('mr=',mb) lm_bin = len(mb) #下面做两组数据的方差比较,注意不能对观测数据进行插值 #比较方法,找出观测的sigma数值对应的Rp,再根据模型计算此时的模型数值Sigma(该步以完成) ds_simb = np.zeros((lm_bin, b), dtype=np.float) #rb = np.zeros(lm_bin,dtype=np.float) #该句对应下面作图部分 for t in range(0, lm_bin): m_ = 1 x = mb[t] z_b = z_int #Rpc = rp #Rpc,Sigma,deltaSigma = calcu_sigma(Rpc,m_,x) #ds_simr[k,t,:] = deltaSigma #对比文献,加入尺度因子修正如下,把物理的距离转为共动的距离 #计算模型在对应的投射距离上的预测信号取值 Rpc = rp Rpc, Sigma, deltaSigma, rs = calcu_sigmaz(Rpc, m_, x, z_b) #对预测信号做相应的变化,把共动的转为物理的 ds_simb[t, :] = deltaSigma ##下面部分作图对比 #rb[t] = rs #fig_0f1(rp,ds_simb,t,mass_bin) #plt.title('Blue') #plt.legend(m[:],bbox_to_anchor=(1,1)) #plt.legend(m[:]) #plt.savefig('Fit-blue2.png',dpi=600) #plt.savefig('compare_2_bl.png',dpi=600) #plt.show() yy = np.shape(ds_simb) #print('rr=',rr)#输出查看ds_sim的维度,即模型预测下的透镜信号 #比较观测的sigma和预测的Sigma,比较结果用fitr和fitb记录比较结果 delta_b = np.zeros(lm_bin, dtype=np.float) for t in range(0, lm_bin): d_b = 0 for n in range(0, yy[1]): d_b = d_b + ((ds_simb[t, n] - dssa[1, n]) / ds_errsa[1, n])**2 delta_b[t] = d_b #print(delta_r) #下面这段求每个质量级对应的方差最小值 deltab = delta_b.tolist() xb = deltab.index(min(deltab)) bestfmb = mb[xb] best_mb = bestfmb + np.log10(h) #作图对比最佳情况 ''' plt.figure() k = xb fig_0f1(rp,ds_simb,k,mass_bin) plt.title('Blue') #plt.savefig('fit_r.png',dpi=600) plt.show() ''' #print('x^2=',min(deltab)) #print('mb=',best_mb) #print('positionr=',xb) return rp, best_mb, delta_b, bestfmb
def fig_mass(pp): m_bin = ['10.0_10.4', '10.4_10.7', '10.7_11.0', '11.0_15.0'] mbin = [10.2, 10.55, 10.9, 13.0] #质量区间 x_m = np.logspace(1, 1.18, 4) ##画图质量区间 m, N = input_mass_bin(v=True) #print(m) #该句导入拟合质量 Pr_mh = np.zeros((len(m_bin), 2), dtype=np.float) #保存以Msolar/h为单位的最佳质量 b_m_r = np.zeros(len(m_bin), dtype=np.float) b_m_b = np.zeros(len(m_bin), dtype=np.float) #分别保存以Msolar为单位的最佳拟合质量 x_std = np.zeros((len(m_bin), 2), dtype=np.float) #Pr_mh的第一行存red的质量,第二行存blue的质量,x_std也一样 ##计算误差棒并存储的数组 err_bar_r = np.zeros((len(m_bin), 2), dtype=np.float) err_bar_b = np.zeros((len(m_bin), 2), dtype=np.float) ##为了X^2检测,需要记录并提取每一个m*区间的概率分布(Ps:不是概率密度分布) Dp_r = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\ np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)]) Dp_b = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\ np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)]) ##记录最小的x^2的值,用于x^2检测 c_xs_r = np.zeros(len(m_bin), dtype=np.float) c_xs_b = np.zeros(len(m_bin), dtype=np.float) ##尝试直接从chi-square出发,求出一倍sigma的误差棒函数 D_chi_r = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\ np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)]) D_chi_b = np.array([np.zeros(len(m[1]),dtype=np.float),np.zeros(len(m[2]),dtype=np.float),\ np.zeros(len(m[2]),dtype=np.float),np.zeros(len(m[3]),dtype=np.float)]) for k in range(0, len(m_bin)): rp, best_mr, delta_r, bestfmr = fit_datar_1(m_bin[k], k) rp, best_mb, delta_b, bestfmb = fit_datab_1(m_bin[k], k) Pr_mh[k, 0] = best_mr Pr_mh[k, 1] = best_mb b_m_r[k] = bestfmr b_m_b[k] = bestfmb c_xs_r[k] = np.min(delta_r) c_xs_b[k] = np.min(delta_b) mr = m[k] mb = m[k] ##不考虑插值时直接带入mr,mb计算,求出误差棒 ##考虑插值时,先对最佳拟合质量附近考虑插值,后续代码相应符号(mr_,mb_,or chir,chib)表示以插值部分量做计算 mr_ = np.linspace(b_m_r[k] - 0.2, b_m_r[k] + 0.2, len(m[k])) mb_ = np.linspace(b_m_b[k] - 0.2, b_m_b[k] + 0.2, len(m[k])) chir = np.interp(mr_, mr, delta_r) chib = np.interp(mb_, mb, delta_b) ##chir,chib表示即将带入计算概率分布的X^2. ##下面几句直接从x^2求解1倍sigma对应的mh,为此需要先做如下处理,1-sigma的取值见后面 dchir = delta_r - np.min(delta_r) dchib = delta_b - np.min(delta_b) D_chi_r[k] = dchir D_chi_b[k] = dchib ##下面把x^2转化为相应的概率分布,并让mh的划分区间服从这个分布 rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=m_bin[k]) pr = np.ones(len(m[k]), dtype=np.float) pb = np.ones(len(m[k]), dtype=np.float) pr_ = np.ones(len(m[k]), dtype=np.float) pb_ = np.ones(len(m[k]), dtype=np.float) ds_errsar = ds_errsa[0, 0:len(rp)] ds_errsab = ds_errsa[1, 0:len(rp)] ##假设x^2的数据分布服从高斯分布 for q in range(0, len(mr)): ##未考虑插值的处理 ss = 1 for t in range(0, len(rp)): ss = ss * (1 / (np.sqrt(np.pi * 2) * ds_errsar[t])) * np.exp( (-1 / 2) * delta_r[q]) pr[q] = ss for q in range(0, len(mr_)): ##考虑插值的计算处理 ss = 1 for t in range(0, len(rp)): ss = ss * (1 / (np.sqrt(np.pi * 2) * ds_errsar[t])) * np.exp( (-1 / 2) * chir[q]) pr_[q] = ss for q in range(0, len(mb)): ##未考虑插值的处理 qq = 1 for t in range(0, len(rp)): qq = qq * (1 / (np.sqrt(np.pi * 2) * ds_errsab[t])) * np.exp( (-1 / 2) * delta_b[q]) pb[q] = qq for q in range(0, len(mb_)): ##考虑插值的计算处理 qq = 1 for t in range(0, len(rp)): qq = qq * (1 / (np.sqrt(np.pi * 2) * ds_errsab[t])) * np.exp( (-1 / 2) * chib[q]) pb_[q] = qq ##第一次归一化,把概率密度函数归一到0~1之间 pr = (pr - np.min(pr)) / (np.max(pr) - np.min(pr)) pb = (pb - np.min(pb)) / (np.max(pb) - np.min(pb)) pr_ = (pr_ - np.min(pr_)) / (np.max(pr_) - np.min(pr_)) pb_ = (pb_ - np.min(pb_)) / (np.max(pb_) - np.min(pb_)) ''' plt.figure() plt.plot(mr,pr,'r') plt.title('Probability distribution') plt.xlabel(r'$log(M_h/M_\odot)$') plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$') plt.show() plt.plot(mb,pb,'b') plt.title('Probability distribution') plt.xlabel(r'$log(M_h/M_\odot)$') plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$') plt.show() plt.figure() plt.plot(mr_,pr_,'r') plt.title('Probability distribution') plt.xlabel(r'$log(M_h/M_\odot)$') plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$') plt.show() plt.plot(mb_,pb_,'b') plt.title('Probability distribution') plt.xlabel(r'$log(M_h/M_\odot)$') plt.ylabel(r'$dP(M_h|M_\ast)/dM_h$') plt.show() ''' #print('r=',delta_r) #print('b=',delta_b) ##第二次归一化,目的是让所有概率求和为1 ##未考虑插值的处理 fr = np.zeros(len(mr), dtype=np.float) fb = np.zeros(len(mb), dtype=np.float) ##考虑插值的处理 fr_ = np.zeros(len(mr_), dtype=np.float) fb_ = np.zeros(len(mb_), dtype=np.float) ss = 0 qq = 0 ##未考虑插值的处理 Fr = np.zeros(len(mr), dtype=np.float) Fb = np.zeros(len(mb), dtype=np.float) ##考虑插值的处理 Fr_ = np.zeros(len(mr_), dtype=np.float) Fb_ = np.zeros(len(mb_), dtype=np.float) ##在不考虑插值时调用该部分 for q in range(0, len(mr)): ss = ss + pr[q] * (mr[1] - mr[0]) fr[q] = ss ##考虑插值的处理 for q in range(0, len(mr_)): ss = ss + pr[q] * (mr_[1] - mr_[0]) fr_[q] = ss ##在不考虑插值时调用该部分 for q in range(0, len(mb)): qq = qq + pb[q] * (mb[1] - mb[0]) fb[q] = qq ##考虑插值的处理 for q in range(0, len(mb_)): qq = qq + pb[q] * (mb_[1] - mb_[0]) fb_[q] = qq Ar = np.max(fr) Ab = np.max(fb) Ar_ = np.max(fr) Ab_ = np.max(fb) ss = 0 qq = 0 ##在不考虑插值时调用该部分 for q in range(0, len(mr)): ss = ss + pr[q] * (mr[1] - mr[0]) / Ar Fr[q] = ss ##考虑插值时调用该部分 for q in range(0, len(mr_)): ss = ss + pr[q] * (mr_[1] - mr_[0]) / Ar Fr_[q] = ss ##在不考虑插值时调用该部分 for q in range(0, len(mb)): qq = qq + pb[q] * (mb[1] - mb[0]) / Ab Fb[q] = qq ##考虑插值时调用该部分 for q in range(0, len(mb_)): qq = qq + pb[q] * (mb_[1] - mb_[0]) / Ab Fb_[q] = qq #plt.figure() #plt.plot(mr,Fr,'r') #plt.show() #plt.plot(mb,Fb,'b') #plt.show() #plt.figure() #plt.plot(mr_,Fr_,'r') #plt.show() #plt.plot(mb_,Fb_,'b') #plt.show() vr = np.interp(0.16, Fr, mr) ur = np.interp(0.84, Fr, mr) err_bar_r[k, :] = [vr - bestfmr, ur - bestfmr] vb = np.interp(0.16, Fb, mb) ub = np.interp(0.84, Fb, mb) err_bar_b[k, :] = [vb - bestfmb, ub - bestfmb] ##记录每一次概率分布 Dp_r[k] = pr Dp_b[k] = pb #print('phy_mr=',Pr_mh[:,0]) #print('phy_mb=',Pr_mh[:,1]) print('err_mr=', err_bar_r) print('err_mb=', err_bar_b) #scatter函数参数设置 color_list = ['r', 'b', 'g'] bar_list = ['s', '^', 'v'] ##直接从概率分布得到误差棒 plt.figure() line1, caps1, bars1 = plt.errorbar(mbin, Pr_mh[:, 0], yerr=[err_bar_r[:, 0], err_bar_r[:, 1]], fmt="rs-", linewidth=1, elinewidth=0.5, ecolor='k', capsize=1, capthick=0.5, label='red') line3, caps3, bars3 = plt.errorbar(mbin, Pr_mh[:, 1], yerr=[err_bar_b[:, 0], err_bar_b[:, 1]], fmt="b^-", linewidth=1, elinewidth=0.5, ecolor='k', capsize=1, capthick=0.5, label='blue') plt.fill_between(mbin, Pr_mh[:, 0] + err_bar_r[:, 0], Pr_mh[:, 0] + err_bar_r[:, 1], facecolor=color_list[0], alpha=.20) plt.fill_between(mbin, Pr_mh[:, 1] + err_bar_b[:, 0], Pr_mh[:, 1] + err_bar_b[:, 1], facecolor=color_list[1], alpha=.20) plt.xlabel(r'$log[M_\ast/M_\odot]$') plt.ylabel(r'$log{\langle M_{200} \rangle/[M_\odot h^{-1}]}$') plt.legend(loc=2) plt.title(r'$Standard Deviation-1\sigma_{p}$') plt.axis([10, 13.5, 11, 13.5]) #plt.savefig('Standard_deviation-1.png',dpi=600) plt.show() ##比较X^2差值的变化 ###(该部分同时说明怎么样循环生成排列子图) plt.figure() for k in range(0, 2 * len(m_bin)): plt.subplot(241 + k) if k <= 3: plt.plot(m[k], D_chi_r[k], 'r') plt.title(r'$\Delta\chi^2_{red}$') plt.axis([b_m_r[k] + 1, b_m_r[k] - 1, 0, 1]) else: plt.plot(m[k - 4], D_chi_b[k - 4], 'b') plt.title(r'$\Delta\chi^2_{blue}$') plt.axis([b_m_b[k - 4] + 1, b_m_b[k - 4] - 1, 0, 1]) plt.grid() plt.tight_layout() #plt.subplots_adjust(wspace=0,hspace=0) #plt.savefig('delta_x^2',dpi=600) plt.show() ##观察概率分布函数,在大质量端取样性应该越来越好 plt.figure() for k in range(0, 2 * len(m_bin)): plt.subplot(241 + k) if k <= 3: plt.plot(m[k - 4], Dp_r[k - 4], 'r') plt.title(r'$probability_{red}$') else: plt.plot(m[k - 4], Dp_b[k - 4], 'b') plt.title(r'$Probability_{blue}$') plt.grid() plt.tight_layout() #plt.savefig('probability',dpi=600) plt.show() ##做出由x^2直接得到的1-sigma的误差棒图像 ######注意插值函数的要求:在差值区间要求目标函数为单调递增函数 Dchir = np.zeros((len(m_bin), 2), dtype=np.float) Dchib = np.zeros((len(m_bin), 2), dtype=np.float) for k in range(0, len(m_bin)): mr_ = m[k] mb_ = m[k] ##把相应的x^2的差值分两个区间 Dchir1_ = D_chi_r[k] ix = mr_ < b_m_r[k] Dchir_1 = Dchir1_[ix] mr1 = mr_[ix] Dchir_2 = Dchir1_[~ix] mr2 = mr_[~ix] ##下面求1-sigma的点 m_r1 = np.interp(-1.0, -Dchir_1, mr1) m_r2 = np.interp(1.0, Dchir_2, mr2) ##把相应的x^2的差值分两个区间 Dchib1_ = D_chi_b[k] ix = mb_ < b_m_b[k] Dchib_1 = Dchib1_[ix] mb1 = mb_[ix] Dchib_2 = Dchib1_[~ix] mb2 = mb_[~ix] ##下面求1-sigma的点 m_b1 = np.interp(-1.0, -Dchib_1, mb1) m_b2 = np.interp(1.0, Dchib_2, mb2) ##插值后比较 Dchir[k, :] = np.array([m_r1 - b_m_r[k], m_r2 - b_m_r[k]]) Dchib[k, :] = np.array([m_b1 - b_m_b[k], m_b2 - b_m_b[k]]) print(Dchir) print(Dchib) plt.figure() line1, caps1, bars1 = plt.errorbar(mbin, Pr_mh[:, 0], yerr=[err_bar_r[:, 0], err_bar_r[:, 1]], fmt="rs-", linewidth=1, elinewidth=0.5, ecolor='k', capsize=1, capthick=0.5, label='red') line3, caps3, bars3 = plt.errorbar(mbin, Pr_mh[:, 1], yerr=[err_bar_b[:, 0], err_bar_b[:, 1]], fmt="b^-", linewidth=1, elinewidth=0.5, ecolor='k', capsize=1, capthick=0.5, label='blue') plt.fill_between(mbin, Pr_mh[:, 0] + err_bar_r[:, 0], Pr_mh[:, 0] + err_bar_r[:, 1], facecolor=color_list[0], alpha=.20) plt.fill_between(mbin, Pr_mh[:, 1] + err_bar_b[:, 0], Pr_mh[:, 1] + err_bar_b[:, 1], facecolor=color_list[1], alpha=.20) plt.xlabel(r'$log[M_\ast/M_\odot]$') plt.ylabel(r'$log{\langle M_{200} \rangle/[M_\odot h^{-1}]}$') plt.legend(loc=4) plt.title(r'$Standard Deviation-1\sigma_{\chi^2}$') plt.axis([10, 13.5, 11, 14]) #plt.savefig('Standard_deviation.png',dpi=600) plt.show() ##下面部分做x^2检测 print('min_x^2_r=', c_xs_r) print('min_x^2_b=', c_xs_b) return Pr_mh
def fit_datar_1(mass_bin, T): h = 0.7 #先找出观测值对应的rp #rsa,dssa,ds_errsa = test_read_m16_ds_1() rsa, dssa, ds_errsa = test_read_m16_ds_1(mass_bin=mass_bin) # print('ds=',dssa) # print('ds_err=',ds_errsa) #print('rp=',rsa) a = np.shape(dssa) #print('size a=',a) ##注意到观测数值选取的是物理坐标,需要靠里尺度银子修正,修正如下 z_r = 0.1 #z_r = 0.105 a_r = 1 / (1 + z_r) ##此时对于预测的R也要做修正 rp = np.array( [rsa[0, k] for k in range(0, len(rsa[0, :])) if rsa[0, k] * h <= 5]) #rp = [rsa[0,k] for k in range(0,len(rsa[0,:])) if rsa[0,k]*h<=2] #该句直接对数组筛选,计算2Mpc以内(保证NFW模型适用的情况下)信号 b = len(rp) m, N = input_mass_bin(v=True) mr = m[T] #print('mr=',mr) lm_bin = len(mr) #下面做两组数据的方差比较,注意不能对观测数据进行插值 #比较方法,找出观测的sigma数值对应的Rp,再根据模型计算此时的模型数值Sigma(该步以完成) ds_simr = np.zeros((lm_bin, b), dtype=np.float) #rr = np.zeros(lm_bin,dtype=np.float) for t in range(0, lm_bin): m_ = 1 x = mr[t] #Rpc = rp #Rpc,Sigma,deltaSigma = calcu_sigma(Rpc,m_,x) #ds_simr[k,t,:] = deltaSigma #对比文献,加入尺度因子修正如下,把物理的距离转为共动的距离 #计算模型在对应的投射距离上的预测信号取值 Rpc = rp Rpc, Sigma, deltaSigma, rs = calcu_sigmaz(Rpc, m_, x, z_r) #对预测信号做相应的变化,把共动的转为物理的 ds_simr[t, :] = deltaSigma #下面部分作图对比 #rr[t] = rs #fig_0f1(rp,ds_simr,t,mass_bin) #plt.title('Red') #plt.legend(m[:],bbox_to_anchor=(1,1)) #plt.legend(m[:]) #plt.savefig('Fit-red2.png',dpi=600) #plt.savefig('compare_1_rd.png',dpi=600) #plt.show() yy = np.shape(ds_simr) #比较观测的sigma和预测的Sigma,比较结果用fitr和fitb记录比较结果 delta_r = np.zeros(lm_bin, dtype=np.float) for t in range(0, lm_bin): d_r = 0 for n in range(0, yy[1]): d_r = d_r + ((ds_simr[t, n] - dssa[0, n]) / ds_errsa[0, n])**2 delta_r[t] = d_r #print(delta_r) #下面这段求每个质量级对应的方差最小值 deltar = delta_r.tolist() xr = deltar.index(min(deltar)) bestfmr = mr[xr] best_mr = bestfmr + np.log10(h) #作图对比最佳情况 ''' plt.figure() k = xr fig_0f1(rp,ds_simr,k,mass_bin) plt.title('Red') #plt.savefig('fit_r.png',dpi=600) plt.show() ''' #print('x^2=',min(deltar)) #print('mr=',best_mr) #print('positionr=',xr) return rp, best_mr, delta_r, bestfmr