Как распараллелить цикл while? - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь выполнить итерацию функции значения (для модели Айягари ).Цикл, который я надеюсь оптимизировать, находится здесь (EDITED TO INCLUDE MWE):


beta = 0.95
r =0.03
a_lb = -1.5
a_ub = 10
y_l = 0.9
y_h = 1.1
yGrid = [y_l, y_h]
aSz = 100
nstates = 2
V0 = np.zeros((nstates, aSz))
V1 = np.zeros((nstates, aSz))
aPol = np.zeros((nstates, aSz))
Tol = 0.0001
Iter_max = 300
err = 1.0
PI = np.matrix([[0.5, 0.5],[0.09, 0.91]])
aGrid = np.linspace(a_lb, a_ub, num = aSz)
#
#
#
Iter = 0
while (err> Tol) and (Iter < Iter_max):
    V0l= intp.interp1d(aGrid, V0[0,:])
    V0h= intp.interp1d(aGrid, V0[1,:])
    for a_today in range(aSz):
        for yix in range(nstates):

            def objective(a_tomorrow):                
                c = yGrid[yix] + (1+r)*aGrid[a_today] - a_tomorrow  

                exp_cont_Val = PI[yix,0] * V0l(a_tomorrow) + PI[yix,1] * V0h(a_tomorrow)
                return -(-1/c + beta* exp_cont_Val)

            minima_val = opt.fminbound(objective , a_lb, min(a_ub, yGrid[yix] + (1+r) *aGrid[a_today] -0.00001))
            aPol[yix, a_today] = minima_val
            V1[yix, a_today] = -objective(aPol[yix, a_today])


    err = (abs(V1-V0)).max()
    Iter = Iter+1
    V0=V1.copy()
print('Iteration ' + str( Iter) + ' with error ' + str( err))

Это часть гораздо большего цикла, который использует метод деления пополам, чтобы найти значение для переменной r.Сначала я угадываю произвольное значение для r и использую его для заполнения значений в массиве c.Из моего тестирования, эта первая часть цикла очень быстрая.Для второй части (приведенной выше) я думаю, что opt.fminbound имеет больше всего накладных расходов.Я пытался использовать jit, но я продолжал получать сообщения об ошибках, я был бы признателен за любую информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...