2016-09-18 28 views
1

SciPyで練習中ですが、fmin_slsqpを使用しようとするとエラーが発生しました。私は、制約のセットを与えられた目的関数Uを最大にしたいという問題を設定しました。python fmin_slsqp - 制約付きエラー

私は2つの制御変数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-1)に1つの周期(T)から変数をリンクします。ここfmin_slsqpの使用がある

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] 
    ]) 

最後に、:

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ように(一次元アレイであろう)です。 2つのインデックスを使用して1次元配列にインデックスを付けることはできません。したがって、x[1,0]x[0,t]などの式はエラーを生成します。

+0

[OK]をクリックします。私は実際にx_initを間違って定義しました。それは今です: x_init = np.ones((2、T + 1)) x_init [:、0] = [1,0.1] エラーが残ります。したがって、1次元配列だけを関数に渡すことはできますか? –

+0

はい、 'x'の定義方法を変更する必要があります。 '(2、T + 1) 'という形の2次元配列の代わりに、' 2 *(T + 1) 'の長さの1次元配列にします。 –

+0

ありがとうございます –

関連する問題