2017-06-13 121 views
2

使用python 2.7我試圖計算下列相當困難的方程組。如何正確計算以下等式?

enter image description here

我已經成功地實現了前兩個,但我與第三掙扎。這裏是我的嘗試,

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 

我再嘗試調用這個函數

# 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)) 

我收到以下錯誤消息

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

    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' 

我正在尋找關於如何實現的任何意見第三個功能和改進我的方法。

+0

你可以把標題和問題文本中的公式的名稱,這樣別人搜索可能會發現它們更容易。標題,例如,「在Python中計算名稱1,名稱,名稱3」或其他內容。 –

+1

'pi_tau'是一個函數,而不是一個數字。你打算叫'pi_tau'嗎? – Carcigenicate

回答

2

這裏有一些奇怪的事情:

  • 你計算的頂部,底部和bionomial都在for循環,但不要總結在for;和
  • 你乘以pi_tau功能與列表?

    return pi_tau*inside 
    
  • 您使用range(0, kappa - 1),但上界的range(..)是獨家

然而,你做的事情挺難的。你可以用下面的辦法:

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

我相信你的意思做的是在回溯的線21以下:

return pi_tau(r)*inside 

你忘了打電話的功能,因此它正試圖通過一個功能乘以一個整數,而不是功能的返回值

0

的錯誤是,你乘以一個列表,這是inside和一個整數,即return of pi_tau(r)

做到這一點,而不是(一list comprehension

試這樣的: return [i*pi_tau(r) for i in inside]