【发布时间】:2017-08-14 14:58:09
【问题描述】:
我有如下功能
q = 1 / sqrt( ((1+z)**2 * (1+0.01*o_m*z) - z*(2+z)*(1-o_m)) )
h = 5 * log10( (1+z)*q ) + 43.1601
我有上述方程的实验答案,一旦我必须将一些数据放入上述函数并求解下面的方程
chi=(q_exp-q_theo)**2/err**2 # this function is a sigma, sigma chi from z=0 to z=1.4 (in the data file)
z、err 和 q_exp 在数据文件(2.txt)中。现在我必须为o_m (0.2 to 0.4) 选择一个范围,然后找到o_m 的范围,chi 函数将被最小化。
我的代码是:
from math import *
from scipy.integrate import quad
min = None
l = None
a = None
b = None
c = 0
def ant(z,om,od):
return 1/sqrt( (1+z)**2 * (1+0.01*o_m*z) - z*(2+z)*o_d )
for o_m in range(20,40,1):
o_d=1-0.01*o_m
with open('2.txt') as fp:
for line in fp:
n = list( map(float, line.split()) )
q = quad(ant,n[0],n[1],args=(o_m,o_d))[0]
h = 5.0 * log10( (1+n[1])*q ) + 43.1601
chi = (n[2]-h)**2 / n[3]**2
c = c + chi
if min is None or min>c:
min = c
l = o_m
print('chi=',q,'o_m=',0.01*l)
n[1],n[2],n[3],n[4]分别在数据文件中是z1,z2,q_exp和err。 z1 和 z2 是积分范围。
我需要您的帮助,感谢您的时间和关注。
请不要评价负值。我需要你的答案。
【问题讨论】:
-
1:你的问题是什么? 2:请分享一些最小的数据集。 3:为什么
ant()有o_m和o_d,而上面的q只有o_m。 -
为什么不使用
scipy.optimize.leastsq? BTW,如果数据不是太大,一开始就加载一次,可能用numpy.loadtxt() -
此外,还有一些错别字;在最后一个
print()中,您使用'打开但使用"关闭,您可能想要打印c而不是q,您应该命名,例如c2因为它实际上是正方形。这样可以避免混淆。有些缩进似乎是错误的。评论输入 pythonic:min == None有效,但min is None看起来更好。甚至可能是if not min。您真的想与h或c进行比较吗? -
这是卡方检验。我们有一个集成,其中将使用数据文件来获得最终答案。我们必须最小化卡方并找到使卡方最小化的参数。 om 和 od 是 print 中 main 函数中的 omega d 和 omega m 我们只需要 om 或 od。
-
我更正了你提到的一些部分
标签: python data-fitting integrate quad