2016-04-15 5 views
1

Alles funktioniert bis auf die letzte Zeile. Mein Ziel ist es, die beste Anpassung durch den Chi-Quadrat-Test zu berechnen. Mit der Anwendung der Funktion "lostsq" stimmt etwas nicht. z, d und d_err sind Arrays der gleichen Länge, angegeben (die experimentellen Daten).Python: optimize.leastsq. ValueError: Der Wahrheitswert eines Arrays mit mehr als einem Element ist mehrdeutig

def df(z,omega_m,omega_l): 
    return 1/(np.sqrt(omega_m*(1+z)**3+(1-omega_m-omega_l)*(1+z)**2+omega_l)) 

def DL(z,omega_m,omega_l,H_0):  # checked with Hubble's law with low z, it is consistent 
    f,err_f=scipy.integrate.quad(df,0,z,args=(omega_m,omega_l))  # it's evident err_f it's irrelevant 

    if omega_m+omega_l==1: 
     return 299792./H_0*(1+z)*f 

    elif omega_m+omega_l<1: 
     fk=np.sin(np.sqrt(np.absolute(1-omega_l-omega_m))*f) 
     return 299792./H_0*(1+z)/np.sqrt(np.absolute(1-omega_m-omega_l))*fk 

    elif omega_m+omega_l>1: 
     fk=np.sinh(np.sqrt(np.absolute(1-omega_l-omega_m))*f) 
     return 299792./H_0*(1+z)/np.sqrt(np.absolute(1-omega_m-omega_l))*fk 


params=(0.3,0.7,73) # starting values for minimization omega_m, omega_l, H_0 

def chi(params,z,d,d_err): # checked, this function works 
    return (d-DL(z,params[0],params[1],params[2]))**2/d_err 

minimization,minimization_cov=optimize.leastsq(chi,params,args=(z,d,d_err)) 

Dies ist die komplette Meldung des Fehlers:

File "C:\Python34\lib\site-packages\scipy\integrate\quadpack.py", line 360, in _quad 
if (b != Inf and a != -Inf): ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all() 
+0

Was 'Z' sind, 'd' und' d_err'? Können Sie Beispieldaten senden? Sonst ist dein Code schwer zu debuggen. – rocksportrocker

+0

d ist das Array mit den experimentellen Daten (verglichen mit dem Modell DL), d_err ist das Array der d-Fehler. z ist die "spermentale unabhängige Variable" von d. omega_m, omega_l und H_0 sind die Parameter, die ich finden muss. – Raizen

+0

Und Form und dtypes? 'z' ist ein float? – rocksportrocker

Antwort

1

Das dritte Argument für scipy.integrate.quad() die obere Grenze und muss ein Schwimmer sein. Sie verwenden z als drittes Argument, das ein NumPy-Array ist.

Signature: scipy.integrate.quad(func, a, b, ...)

Integrate func from a to b (possibly infinite interval) using a technique from the Fortran library QUADPACK.

...

a : float

Lower limit of integration (use -numpy.inf for -infinity).

b : float

Upper limit of integration (use numpy.inf for +infinity).

+0

Vielen Dank. – Raizen

+0

Wie kann ich immer nur das z für diesen Schritt berechnen? Ich dachte, es sei trivial, dass es "z" als das z in diesem Schritt verstand. – Raizen

Verwandte Themen