2016-12-08 79 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)