python fmin_slsqp-带约束的错误
我正在使用SciPy进行练习,在尝试使用fmin_slsqp时遇到了一个错误。我建立了一个问题,在给定一组约束条件的情况下,我想最大化目标函数U 我有两个控制变量,x[0,t]和x[1,t],正如你所看到的,它们被t(时间段)索引。目标函数是:python fmin_slsqp-带约束的错误,python,dynamic,scipy,economics,Python,Dynamic,Scipy,Economics,我正在使用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
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)
最后,这里是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]
传递给目标函数和约束函数的数组
x
将是一维数组(就像x_init
一样)。不能使用两个索引为一维数组编制索引,因此诸如x[1,0]
和x[0,t]
之类的表达式将生成错误。传递给目标和约束函数的数组x
将是一维数组(就像x_init
一样)。不能使用两个索引对一维数组进行索引,因此诸如x[1,0]
和x[0,t]
之类的表达式将生成错误。Ok。我实际上错误地定义了x_init,现在是:x_init=np。one((2,T+1))x_init[:,0]=[1,0.1]错误仍然存在。所以只能将一维数组传递给函数?是的,您必须更改x
的定义方式。与形状为(2,T+1)
的二维数组不同,将其设置为长度为2*(T+1)
的一维数组。确定。我实际上错误地定义了x_init,现在是:x_init=np。one((2,T+1))x_init[:,0]=[1,0.1]错误仍然存在。所以只能将一维数组传递给函数?是的,您必须更改x
的定义方式。与形状为(2,T+1)
的二维数组不同,将其设置为长度为2*(T+1)
的一维数组。x_init的指定不正确。它应该是:x_init=np.ones((2,T+1))x_init[:,0]=[1,0.1]x_init的指定不正确。它应该是:x_init=np.one((2,T+1))x_init[:,0]=[1,0.1]
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)