2016-09-18 2 views
1

Я занимаюсь с SciPy, и я столкнулся с ошибкой при попытке использовать fmin_slsqp. Я установил проблему, в которой я хочу максимизировать целевую функцию U, учитывая набор ограничений.python fmin_slsqp - ошибка с ограничениями

У меня есть две управляющие переменные x [0, t] и x [1, t], и, как вы можете видеть, они индексируются по t (периоды времени). Целевая функция:

def obj_fct(x, alpha,beta,Al): 
U = 0 
x[1,0] = x0 
for t in trange: 
    U = U - beta**t * ((Al[t]*L)**(1-alpha) * x[1,t]**alpha - x[0,t]) 
return U 

Ограничение определены над этими двух переменными и один из них связывает переменные от одного периода (т) к другому (Т-1).

def constr(x,alpha,beta,Al): 
return np.array([ 
    x[0,t], 
    x[1,0] - x0, 
    x[1,t] - x[0,t] - (1-delta)*x[1,t-1] 
    ]) 

Наконец, здесь является использование fmin_slsqp:

sol = fmin_slsqp(obj_fct, x_init, f_eqcons=constr, args=(alpha,beta,Al)) 

Оставляя в стороне тот факт, что существуют более эффективные способы для решения таких задач динамики, на мой вопрос о синтаксисе. При запуске этого простого кода появляется следующая ошибка:

Traceback (most recent call last): 
    File "xxx", line 34, in <module> 
    sol = fmin_slsqp(obj_fct, x_init, f_eqcons=constr, args=(alpha,beta,Al)) 
    File "D:\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 207, in fmin_slsqp 
    constraints=cons, **opts) 
    File "D:\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 311, in _minimize_slsqp 
    meq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['eq']])) 
    File "D:\Anaconda3\lib\site-packages\scipy\optimize\slsqp.py", line 311, in <listcomp> 
    meq = sum(map(len, [atleast_1d(c['fun'](x, *c['args'])) for c in cons['eq']])) 
    File "xxx", line 30, in constr 
    x[0,t], 
IndexError: too many indices for array 
[Finished in 0.3s with exit code 1] 

Что я делаю неправильно?

Начальная часть кода, присваивая значения параметров, является:

from scipy.optimize import fmin_slsqp 
import numpy as np 

T = 30 
beta = 0.96 
L = 1 
x0 = 1 
gl = 0.02 
alpha = 0.3 
delta = 0.05 
x_init = np.array([1,0.1]) 

A_l0 = 1000 
Al = np.zeros((T+1,1)) 
Al[1] = A_l0 

trange = np.arange(1,T+1,1, dtype='Int8') # does not include period zero 
for t in trange: Al[t] = A_l0*(1 + gl)**(t-1) 
+0

x_init указан неверно. Он должен быть: x_init = np.ones ((2, T + 1)) x_init [:, 0] = [1,0.1] –

ответ

0

Массив x передается вашей цели и ограничений функций будет одномерный массив (так же, как ваш x_init является). Вы не можете индексировать одномерный массив с двумя индексами, поэтому выражения, такие как x[1,0] и x[0,t], генерируют ошибку.

+0

Ok. Я на самом деле неправильно определил x_init, что теперь: x_init = np.ones ((2, T + 1)) x_init [:, 0] = [1,0.1] ошибка остается. Таким образом, только одномерные массивы могут передаваться в функции? –

+0

Да, вам нужно изменить способ определения 'x'. Вместо 2-мерного массива с формой '(2, T + 1)', сделайте его 1-мерным массивом с длиной '2 * (T + 1)'. –

+0

спасибо, что помогает –

Смежные вопросы