我目前正在尝试绘制一个函数,该函数描述了不同世界模型的宇宙学中的线性扰动增长。我希望能够将所有曲线放在同一组轴上,但我很难设置它。
我的目标是相对于z绘制此函数D,但是有多个具有不同密度参数的图($ \ Omega $)。
我已经管理了两个解决方案,但两个都没有完美运行,第一个效率非常低(为每组参数添加新功能):
z = np.arange(0.0,10,0.1)
#density parameters
MOm = 1.0
MOv = 0.0
COm = 0.3
COv = 0.7
H0 = 70
def Mf(z):
A = (5/2)*MOm*(H0**2)
H = H0 * np.sqrt( MOm*((1+z)**3) + MOv )
return A * ((1+z)/(H**3))
def MF(z):
res = np.zeros_like(z)
for i,val in enumerate(z):
y,err = integrate.quad(Mf,val,np.inf)
res[i] = y
return res
def MD(z):
return (H0 * np.sqrt( MOm*((1+z)**3) + MOv )) * MF(z)
def Cf(z):
A = (5/2)*COm*(H0**2)
H = H0 * np.sqrt( COm*((1+z)**3) + COv )
return A * ((1+z)/(H**3))
def CF(z):
res = np.zeros_like(z)
for i,val in enumerate(z):
y,err = integrate.quad(Cf,val,np.inf)
res[i] = y
return res
def CD(z):
return (H0 * np.sqrt( COm*((1+z)**3) + COv )) * CF(z)
plt.plot(z,MD(z),label="Matter Dominated")
plt.plot(z,CD(z),label="Current Epoch")
所以我尝试使用for循环使其更简单,但是无法解决如何为循环内的每个绘图添加标签:
Om = (1.0,0.3)
Ov = (0.0,0.7)
for param1,param2 in zip(Om,Ov):
def f(z):
A = (5/2)*param1*(H0**2)
H = H0 * np.sqrt( param1*((1+z)**3) + param2 )
return A * ((1+z)/(H**3))
def F(z):
res = np.zeros_like(z)
for i,val in enumerate(z):
y,err = integrate.quad(f,val,np.inf)
res[i] = y
return res
def D(z):
return (H0 * np.sqrt( param1*((1+z)**3) + param2 )) * F(z)
plt.plot(z,D(z))
有人可以帮助解释这样做的有效方法吗?或者如何使用for循环动态添加标签。任何帮助将不胜感激。
答案 0 :(得分:1)
答案 1 :(得分:1)
您可以使用预定义的字符串基于这两个参数在循环中创建标签,您可以使用相应的值进行格式化。
label="Om {}, Ov {}".format(param1, param2)
总的来说,这会给出:
import numpy as np
import scipy.integrate as integrate
import matplotlib.pyplot as plt
z = np.arange(0.0,10,0.1)
MOm = 1.0
MOv = 0.0
COm = 0.3
COv = 0.7
H0 = 70
Om = (1.0,0.3)
Ov = (0.0,0.7)
plt.figure(figsize=(3.8,2.4))
for param1,param2 in zip(Om,Ov):
def f(z):
A = (5/2)*param1*(H0**2)
H = H0 * np.sqrt( param1*((1+z)**3) + param2 )
return A * ((1+z)/(H**3))
def F(z):
res = np.zeros_like(z)
for i,val in enumerate(z):
y,err = integrate.quad(f,val,np.inf)
res[i] = y
return res
def D(z):
return (H0 * np.sqrt( param1*((1+z)**3) + param2 )) * F(z)
plt.plot(z,D(z), label="Om {}, Ov {}".format(param1, param2))
plt.legend()
plt.show()