import numpy as np import random from scipy.stats import rv_continuous import matplotlib.pyplot as plt from scipy.optimize import curve_fit ''' Mass distribution: assume m can go from 1 solar mass to infinite solar Mass Salpeter distribution: epsilon(m)dm = epsilon_0*(m/M_solar)^(-2.35)*(dm/M_solar), epsilon_0 is a constant relating to the local stellar density set m = m/M_solar, then p(m)dm = C*m^(-2.35)*dm Normalize going from m = 1 to infinity, get C = 1.35 So the pdf = 1.35*m^(-2.35) (check this) how can I make this more efficient? generating same random number each time ''' ''' num_events=10000 y_range = 100 grad=3 xbins = np.linspace(1,y_range,grad*(y_range)) class Mass_pdf(rv_continuous): def _pdf(self, x): return 1.35*x**(-2.35) #random distribution mass_pdf = Mass_pdf(name="Mass distribution", a=1) x=np.array([np.random.rand(num_events)]) y_rand=mass_pdf.ppf(x)[0] #actual distribution y_act= 1.35*np.power(xbins,np.full((1,grad*(y_range)),-2.35)) y_act=y_act[0] #FIGURE 1 - LINEAR X AXIS fig1 = plt.figure(1) ax1 = fig1.add_subplot(111) plt.hist(y_rand,normed=True,bins=xbins,label="probability") plt.plot(xbins,y_act,label="expected function") fig1.suptitle("Expected Mass Distribution for BH's") plt.ylabel("p") plt.xlabel("mass (M_solar)") #FIGURE 2 - LOG Y AXIS fig5 = plt.figure(5) ax5 = fig5.add_subplot(111) plt.hist(y_rand,normed=True,bins=xbins,label="probability") plt.plot(xbins,y_act,label="expected function") fig5.suptitle("Expected Mass Distribution for BH's") plt.ylabel("p") plt.yscale('log', nonposy='clip') plt.xlabel("mass (M_solar)") #FIGURE 3 - LOG ALL AXIS fig6 = plt.figure(6) ax6= fig6.add_subplot(111) logbins = 10 ** np.linspace(np.log10(1), np.log10(y_range), grad*y_range) plt.hist(y_rand,normed=True,bins=logbins,label="probability") plt.plot(xbins,y_act,label="expected function") fig6.suptitle("Expected Mass Distribution for BH's") plt.ylabel("p") plt.gca().set_xscale("log") plt.yscale('log', nonposy='clip') plt.xlabel("mass (M_solar)") # curve fitting n, bins = np.histogram(y_rand,normed=True,bins=xbins) bin_centers = bins[:-1] + 0.5 * (bins[1:] - bins[:-1]) def f(x, a, b): return a*x**b popt, pcov = curve_fit(f, bin_centers, n, p0 = [1, -3]) print popt text = "a*x^b a="+str(popt[0])+",b="+str(popt[1])+" vs. a=1.35,b=-2.35" plt.figure(1) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax1.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.figure(5) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax5.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.figure(6) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax6.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.show() ''' ''' Radial distribution: Go from r=0 to infinity Is this a poisson process??? Show him Exam 1 Else I would say pdf(r) = rho*4*pi*r^2, where rho is the density of stars Need to normalize out to a horizen distance: integral_0^horizon_dist C*pdf(r)dr = 1 Normalizing, C= (3/4)(1/pi)(1/rho)(1/horizon_dist)^3 ''' ''' #1 gpc look up how many within a GPC num_events=10000 grad=100 density = 50000000 horizon_dist = 1 class Distance_pdf(rv_continuous): def _pdf(self, x): return 3.0*(x**2)*(1.0/horizon_dist)**3 xbins = np.linspace(0,horizon_dist,grad*(horizon_dist)) #random distribution distance_pdf = Distance_pdf(name="Distance distribution", a=0,b=horizon_dist) x=np.array([np.random.rand(num_events)]) y_rand=distance_pdf.ppf(x)[0] #actual distribution y_act = 3.0*(1.0/horizon_dist)**3*np.power(xbins,np.full((1,grad*(horizon_dist)),2)) y_act=y_act[0] #FIGURE 2 - LINEAR X AXIS fig2 = plt.figure(2) ax2 = fig2.add_subplot(111) plt.hist(y_rand,normed=True,bins=xbins,label="probability") plt.plot(xbins,y_act,label="expected function") fig2.suptitle("Expected Radial Distribution for BH's,normed") plt.ylabel("p") plt.xlabel("r (Gpc)") #FIGURE 3 - LOG Y AXIS fig3 = plt.figure(3) ax3 = fig3.add_subplot(111) plt.hist(y_rand,normed=True,bins=xbins,label="probability") plt.plot(xbins,y_act,label="expected function") fig3.suptitle("Expected Radial Distribution for BH's,normed") plt.ylabel("p") plt.yscale('log', nonposy='clip') plt.xlabel("r (Gpc)") #FIGURE 4 - LOG ALL AXES fig4 = plt.figure(4) ax4 = fig4.add_subplot(111) logbins = 10 ** np.linspace(np.log10(1), np.log10(horizon_dist), grad*horizon_dist) plt.hist(y_rand,normed=True,bins=xbins,label="probability") plt.plot(xbins,y_act,label="expected function") fig4.suptitle("Expected Radial Distribution for BH's,normed") plt.ylabel("p") plt.gca().set_xscale("log") plt.yscale('log', nonposy='clip') plt.xlabel("r (Gpc)") # curve fitting n, bins = np.histogram(y_rand,normed=True,bins=xbins) bin_centers = bins[:-1] + 0.5 * (bins[1:] - bins[:-1]) def f(x, a, b): return a*x**b popt, pcov = curve_fit(f, bin_centers, n, p0 = [1,1]) print popt text = "a*x^b a="+str(popt[0])+",b="+str(popt[1])+" vs. a="+str(3.0*(1.0/horizon_dist)**3)+",b=2" plt.figure(2) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax2.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.figure(3) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax3.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.figure(4) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax4.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.show() ''' num_events=10000 grad=100 density = 50000000 horizon_dist = 1 class Distance_pdf(rv_continuous): def _pdf(self, x): return 3.0*(x**2)*(1.0/horizon_dist)**3 xbins = np.linspace(0,horizon_dist,grad*(horizon_dist)) #random distribution distance_pdf = Distance_pdf(name="Distance distribution", a=0,b=horizon_dist) x=np.array([np.random.rand(num_events)]) y_rand=distance_pdf.ppf(x)[0] normed_value = (4.0/3)*np.pi*density*horizon_dist**3 hist, bins = np.histogram(y_rand, bins=xbins, density=True) widths = np.diff(bins) hist *= normed_value #actual distribution y_act = (4.0)*np.pi*density*np.power(xbins,np.full((1,grad*(horizon_dist)),2)) y_act=y_act[0] #FIGURE 7 - LINEAR X AXIS fig7 = plt.figure(7) ax7 = fig7.add_subplot(111) plt.bar(bins[:-1], hist, widths,label="probability",color="b") plt.plot(xbins,y_act,label="expected function") fig7.suptitle("Expected Radial Distribution for BH's") plt.ylabel("p") plt.xlabel("r (Gpc)") #FIGURE 8 - LOG Y AXIS fig8 = plt.figure(8) ax8 = fig8.add_subplot(111) plt.bar(bins[:-1], hist, widths,label="probability",color="b") plt.plot(xbins,y_act,label="expected function") fig8.suptitle("Expected Radial Distribution for BH's") plt.ylabel("p") plt.yscale('log', nonposy='clip') plt.xlabel("r (Gpc)") #FIGURE 9 - LOG ALL AXES fig9 = plt.figure(9) ax9 = fig9.add_subplot(111) logbins = 10 ** np.linspace(np.log10(1), np.log10(horizon_dist), grad*horizon_dist) plt.bar(logbins[:-1], hist, widths,label="probability",color="b") plt.plot(xbins,y_act,label="expected function") fig9.suptitle("Expected Radial Distribution for BH's") plt.ylabel("p") plt.gca().set_xscale("log") plt.yscale('log', nonposy='clip') plt.xlabel("r (Gpc)") # curve fitting bin_centers = bins[:-1] + 0.5 * (bins[1:] - bins[:-1]) def f(x, a, b): return a*x**b popt, pcov = curve_fit(f, bin_centers, hist, p0 = [50000000,1]) print popt text = "a*x^b a="+str(popt[0])+",b="+str(popt[1])+" vs. a="+str((4.0)*np.pi*density)+",b=2" plt.figure(7) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax7.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.figure(8) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax8.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.figure(9) plt.plot(bin_centers,f(bin_centers, *popt),label="fit function") ax9.set_title(text,fontsize=9) plt.legend(loc='upper right') plt.show() """ distance to first BBH """ ''' y_range = 20 grad=40 rho=4 plt.figure(4) class Distance_pdf(rv_continuous): def _pdf(self, x, rho): return (4*np.pi*rho*x**2)*(np.exp((-4*rho*np.pi*x**3)/3.0)) xbins = np.linspace(0,y_range,grad*(y_range)) #random distribution distance_pdf= Distance_pdf(name="Distance distribution", a=0) x=np.array([np.random.rand(num_events)]) y=distance_pdf.ppf(x,rho)[0] plt.hist(y,normed=True,bins=xbins,label="probability") #actual distribution y=(4*np.pi*rho*np.power(xbins,np.full((1,grad*(y_range)),2)))*(np.exp((-4*rho*np.pi*np.power(xbins,np.full((1,grad*(y_range)),3)))/3.0)) y=y[0] plt.plot(xbins,y,label="expected function") plt.title("Expected Distance to first BBH") plt.ylabel("p") plt.xlabel("r") plt.legend(loc='upper right') plt.show() '''