我有一组红移值和相应的宇宙减速参数值。情节如下:
现在我需要从q=0的图中精确地得到z的值。我试过很多命令,但都会导致一些错误。因为我不太懂python,所以我甚至不能尝试如何纠正所有这些问题。
当我尝试命令时:z1 = interp1d(z,q,0)
结果是:
scipy.interpolate.interpolate.interp1d对象位于0x051899F0
我该怎么解决?
我的代码:
while z0<zf:' '
z.append(z0)
a.append(1/(1+z0))
term=((1+(omega/(B-1)))*a[k]**(3*(B-1)))
H.append(((term-(omega/(B-1)))*H02)**0.5)
q.append(-1-((H0*term*3*(B-1)*(term-(omega/(B-1)))-0.5)/(2*H[k])))
print '%.2f \t%.4f \t%.4f \t%.15f'%(z[k],a[k],H[k],q[k])
k=k+1
z0=z0+h
最佳答案
你的代码有问题。我这里只有Python 3,所以如果您在理解ask时有任何问题(稍微更改了print
和input
函数部分)。
你没有定义H02
,所以我只是说它等于H0
。如果是错的,就改正。这是您更正的代码(有关重要内容,请参阅注释):
from pylab import*
import matplotlib.pyplot as plt
from scipy.interpolate import interp1d
fig, ax = subplots()
k = 0
omega, B, H0 = 0.6911, 0.019921992722139001, 67.74
H02 = H0 + 0 # You didn't specify this so I had to make up something
z0 = 0
h = 0.05
z, a, H, q = [], [], [], []
print('Value of H0, Omega and Beta:%.3f,%.4f,%.18f'%(H0, omega, B))
zf = float(input('Enter the final value of redshift:')) # Remember that this needs to output a number
print('Red shift Scale factor Hubble parameter q value') # I chose 10 in my test.
print('===========================================================')
while z0 < zf:
z.append(z0)
a.append(1/(1+z0))
term=((1+(omega/(B-1)))*a[k]**(3*(B-1)))
H.append(((term-(omega/(B-1)))*H02)**0.5)
q.append(-1-((H0*term*3*(B-1)*(term-(omega/(B-1)))-0.5)/(2*H[k])))
print('%.2f \t%.4f \t%.4f \t%.15f'%(z[k], a[k], H[k], q[k]))
k = k+1
z0 = z0+h
title('Decceleration parameter(q) versus Red shift(z) graph ')
xlabel('Redshift z')
ylabel('Decceleration parameter q')
z1 = interp1d(q, z)
print(z1(40000)) # I used a redshift parameter of 10 and 0 does not exist in the data limits so I just used 40 000.
plot(z, q)
plot([z1(40000), z1(40000)], [0, 40000], c='r')
plot([0, z1(40000)], [40000, 40000], c='r')
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.yaxis.tick_left()
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
ax.xaxis.tick_bottom()
show()
,结果是:
我添加了红线以向您显示这样进行的插值的结果:
z1 = interp1d(q, z) # Create your function with your q (input) and z (output)
result = z1(40000) # This is checking the value of z when q=40000
您需要记住的是
interp1D
只能在您提供的数据区域内插值。因此,如果q
在10
和100
之内,就不能插值q=0
。我用了10的红移(不知道该用什么,尽管主题看起来很有趣)。这似乎不影响情节,所以我猜当你把代码放在这里,或者当我试图从你的评论中理解它时(因为你的情节与我的不同),会出问题。确保每件事都是应该的,只是使用你可以用来解决你的问题的部分。
关于python - 在X轴上查找对应于Y的任意值的值,该值不包含在用于在python中绘制数据的列表中,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37762875/