2017-06-13 4 views
2

Mit Python 2.7 Ich versuche, die folgenden ziemlich schwierigen Satz von Gleichungen zu berechnen.Wie berechne ich die folgende Gleichung richtig?

enter image description here

Ich habe erfolgreich die ersten beiden, aber mit dem dritten bin zu kämpfen. Hier ist mein Versuch,

def pi_tau(r): 
    return (1 - (1 - r)**(t + 1))/(2 - r) 

def mean_field(r): 
    return 1 - (1 - r)**t 

def pi_neighbour(r): 
    inside = [] 
    for kappa_dash in range(0, kappa - 1): 

     Binomial_Coefficient = (math.factorial(kappa - 1))/(math.factorial(kappa - 1 - kappa_dash)*math.factorial(kappa_dash))   

     top = ((mean_field(r)*pi_tau(r))**kappa_dash)*(1 - mean_field(r)*pi_tau(r))**(kappa - 1 - kappa_dash) 

     bottom = kappa_dash + 1 

    fraction = top/bottom 
    inside.append(kappa_dash) 
    inside[kappa_dash] = inside[kappa_dash] + fraction*Binomial_Coefficient 

return pi_tau*inside 

ich dann versuchen, diese Funktion

# set parameters 
r = 0.15 
kappa = 2.1 
T = 10 

ppp_t = [] 
mmm_f = [] 
nnn_t = [] 

for t in range(0, T): 
    ppp_t.append(pi_tau(r)) 
    mmm_f.append(mean_field(r)) 
    nnn_t.append(pi_neighbour(r)) 

ich die folgende Fehlermeldung erhalten, rufen

--------------------------------------------------------------------------- 

    TypeError         Traceback (most recent call last) 
    <ipython-input-41-9bcf462306f0> in <module>() 


    6  ppp_t.append(pi_tau(r)) 
     7  mmm_f.append(mean_field(r)) 
----> 8  nnn_t.append(pi_neighbour(r)) 

<ipython-input-39-d9acdd7490f9> in pi_neighbour(r) 
    19   inside[kappa_dash] = inside[kappa_dash] + fraction*Binomial_Coefficient 
    20 
---> 21  return pi_tau*inside 

TypeError: can't multiply sequence by non-int of type 'function' 

Ich suche einen Rat, wie die zur Umsetzung dritte Funktion und verbessere meine Methode.

+0

Sie könnten die Namen der Gleichungen in den Titel und den Fragetext eingeben, damit andere die Suche leichter finden. Titel, zum Beispiel, "Compute name1, name, name3 in Python" oder so. –

+1

'pi_tau' ist eine Funktion, keine Nummer. Wolltest du 'pi_tau' nennen? – Carcigenicate

Antwort

2

Es gibt mehrere seltsame Dinge hier:

  • Sie die oben, unten berechnen und bionomial alle in der for Schleife, aber nicht summieren sich in diesem for Schleife; und
  • multiplizieren Sie die pi_tauFunktion mit einer Liste?

    return pi_tau*inside 
    
  • Sie verwenden range(0, kappa - 1), aber die Oberegrenze von range(..) ist exklusiv

Trotzdem Sie die Dinge sehr schwierig machen. Sie könnten den folgenden Ansatz verwenden:

from math import factorial 

def pi_neighbour(r): 
    sum = 0.0 
    for kappa_dash in range(0,kappa): 
     bin_coeff = factorial(kappa-1)/(factorial(kappa-1-kappa_dash)*factorial(kappa_dash))  
     top = ((mean_field(r)*pi_tau(r))**kappa_dash)*(1-mean_field(r)*pi_tau(r))**(kappa-1-kappa_dash) 
     sum +=bin_coeff*top/(kappa_dask+1) 
    return pi_tau(r)*sum
1

Was ich glaube, was Sie tun gemeint ist die folgende in Zeile 21 der Zurückverfolgungs:

return pi_tau(r)*inside 

Sie haben vergessen, die Funktion aufgerufen werden, und so wird es versuchen, eine ganze Zahl durch eine Funktion, sich zu vermehren anstelle des Rückgabewerts der Funktion.

0

Der Fehler ist, dass Sie eine Liste vervielfachen sich, dass inside ist und eine ganze Zahl, das heißt return of pi_tau(r)

diese stattdessen tun (a list comprehension)

try return [i*pi_tau(r) for i in inside]