2015-07-10 6 views
-1

Ответ должен быть 117,4, я получаю 9982.3 ... Не уверен, что проблема, но вот мой код:Функция полезности не оценки правильно Numpy питона

def util(c,p,alpha): 
    mu = 0 
    for i in range(0,len(c)): 
     m = p[i]*(c[i]**(1-alpha)) 
     mu += m 
    return mu**(1/(1-alpha)) 

omega = 0.495 
c = np.array([100,200,1000]) 
p = np.array([omega, omega, 1-2*omega]) 
alpha = 5 

EDIT: Я не уверен, если есть ошибка с моей математикой или с функцией, которую я написал, я спрашиваю, соответствует ли моя математика тому коду, который я написал.

Я решаю это уравнение для mu: U (mu) = E [U (c)] с выигрышами c и распределением вероятности p, как указано выше. U (c) имеет вид c^(1-альфа)/(1-альфа).

U(mu) = mu^(1-alpha)/(1-alpha) = E[U(c)] = (omega*c1^(1-alpha)+omega*c2^(1-alpha)+(1-2*omega)*c3^(1-alpha))/(1-alpha) 

=> mu = (omega*c1^(1-alpha)+omega*c2^(1-alpha)+(1-2*omega)*c3^(1-alpha))^(1/(1-alpha)) 
+0

'Util (с, р, альфа)' фактически возвращает 9.99558 для меня. –

+0

, что является дополнительным запутанным ... – bpr

+1

@bpr. Вы должны дать нам немного больше, чтобы продолжить: здесь есть проблема. Этого недостаточно, чтобы помочь нам найти ошибку. –

ответ

2

Основная проблема заключается в том, что Python выполняет целочисленное деление. Python 2 выполняет целочисленное деление с /, если вы не делаете from __future__ import division (см. PEP 238). Поэтому вам нужно изменить хотя бы один из ваших операндов на значение с плавающей запятой. Вы можете сделать это, установив alpha = 5.0 вместо alpha = 5. Или вы можете написать 1.0 - alpha вместо 1 - alpha.

Кроме того, вы можете сделать код более компактным, используя векторизованные операции numpy. Ваша util функция может быть сокращена до:

def util(c, p, alpha): 
    mu = np.sum(p * (c ** (1.0 - alpha))) 
    return mu ** (1/(1.0 - alpha)) 
Смежные вопросы