python fmin_slsqp - ошибка с ограничениями

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

У меня есть две управляющие переменные, 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

Ограничения определены для этих двух переменных, и одна из них связывает переменные из одного периода (t) в другой (t-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) 

1 ответ

Решение

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

Другие вопросы по тегам