2016-12-08 77 views
1

我目前正试图将一些参数拟合到现有的数据文件中。在添加配件程序后,我不断收到'TypeError: '*numpy.float64' object is not iterable*'错误,这似乎与我定义的Dl函数有关。我无法自己解决这个问题,所以我会非常感谢有关此事的任何提示。TypeError:'numpy.float64'对象不可迭代

import pylab as p 
import scipy as s 
from scipy.integrate import odeint,quad 
import numpy as np 
import matplotlib.pyplot as plt 
import math 

z = np.arange(0.00, 1.5, 0.02) 
z1, m1, sigma_m = np.loadtxt('data.txt', unpack=True, usecols=[0,1,2]) 
yerr = sigma_m 


def H(z,omega_m,H0): 
    return H0*p.sqrt(omega_m*(1+z)**3+1-omega_m) 


def Dl(z,omega_m,H0): 
    c = 3*10**5 
    y = [] 
    for i in z: 
     y1 = c*(1+i)*quad(f,0.0,i, args=(omega_m,H0))[0] 
     y.append(y1) 
    return p.asarray(y) 


def f(z,omega_m,H0): 
    return 1./H(z,omega_m,H0) 


def m(z,omega_m,H0,M): 
    q = [] 
    for j in Dl(z,omega_m,H0): 
     q1 = M+5*np.log10(j)+25.0 
     q.append(q1) 
    return p.asarray(q) 


def chi2(omega_m, M): 
    return sum((m(z1,omega_m,70,M)-m1)/sigma_m)**2 

chi2_min=1*10**30 
o = np.arange(0.00, 1.5, 0.02) 
Mrange = np.arange(-1.5, 1.5, 0.02) 

for omega_m in o: 
    for M in Mrange: 
     if chi2(omega_m, M) < chi2_min: 
      omega_min=omega_m 
      M_min=M 
      chi2_min=m(omega_min, M_min, 70, M) 

print(M_min) 
print(chi2_min) 

回答

1

在您的例程Dl中,z上的迭代无效。 z是每个invokation的标量。

转换你的程序,以便给D1提供一个数组或删除D1中的循环。

1

你的问题似乎是在这里:

chi2_min=m(omega_min, M_min, 70, M)

omega_min是float,它被传递给Dl()m()这里:

for j in Dl(z,omega_m,H0):

,然后Dl()尝试迭代它:

for i in z:

这引起了你的错误

要解决,我建议你通过omega_min作为一个列表:

chi2_min=m([omega_min], M_min, 70, M)