2017-11-10 11 views
1

thisスレッドで提案されている最適化問題を解決したい。さて、私はx[1]...x[n]を解決するだけでなく、変数yも解決したいと思います。インデックス作成に何か問題があるようです。複数の変数を最適化するラムダ関数のインデックス付け

from sympy import Sum, symbols, Indexed, lambdify 
from scipy.optimize import minimize 
import numpy as np 

def _eqn(y, variables, periods, sign=-1.0): 
    x, i = symbols("x i") 
    n = periods-1 
    s = Sum(Indexed('x', i)/(1+0.06)**i, (i, 1, n)) 
    f = lambdify(x, s, modules=['sympy']) 
    return float(sign*(y + f(variables))) 

z = 3 
results = minimize(lambda xy: _eqn(xy[0], xy[1:z], z),np.zeros(z)) 
print(results.x) 

答えて

0

最小化のために必要な引数が可変であれば、次のコードが役に立ちますか?

from sympy import var 
from scipy.optimize import minimize 
import numpy as np 

def _eqn(y, variables, periods, sign=-1.0):  
    f = 0 
    for i,x in enumerate(variables): 
     f += x/(1+0.06)**(i+1) 
    return float(sign*(y + f)) 

z = 3 
results = minimize(lambda xy: _eqn(xy[0], xy[1:z], z),np.zeros(z)) 
print(results.x) 
0

エラーメッセージから、インデックスに問題があるようです。集計は1からnまで実行されますが、デフォルトでは、Pythonのリストタイプオブジェクトのインデックスは0からn-1になります。あなたのコードでこれを変更すると、うまくいくようです。見てみな。

import sympy as sp 
from scipy.optimize import minimize 
import numpy as np 

sp.init_printing() 

def _eqn(y, variables, periods, sign=-1.0): 
    x, i = sp.symbols("x i") 
    n = periods-1 
    s = sp.Sum(sp.Indexed('x', i)/(1+0.06)**(i+1), (i, 0, n-1)).doit() 
    f = sp.lambdify(x, s, modules=['sympy']) 
    return float(sign*(y + f(variables))) 

z = 3 
results = minimize(lambda xy: _eqn(xy[0], xy[1:z], z),np.zeros(z)) 
print(results.x) 
+0

[OK]をクリックします。それは(i + 1)でなければなりません。ですから、私はx [0]とx [1]を変数として持つようになりました。最小化関数でのインデックス作成は本当に正しいですか? _eqn内のyと変数を変更すると仮定すると、最小値(λxy:_eqn(xy [:z-1]、xy [z-1]、z)、np.zeros(z)インデックスが合計変数に一致するためです。そのような場合に逸脱した結果をどういうふうに確認することはできますか? – Peterhack

+0

インデックス作成が正しいようです。 '_eqn'関数の中で' x [0] 'と' x [1] 'は' variables [0] 'と' variables [1] 'を参照しています。これらは' xy [1] 'と' xy [ 2]。すでに関数 '_eqn'の入力引数' y'に 'xy [0]'を分けています。 –

+0

ええ、私は私が従うことができると思います。しかし、なぜ(i + 1で)結果とあなたの最初の答えが異なるのですか?これは本当に影響がありますか? 'x = [var( 'x' + str(i))for range(z)]' – Peterhack

関連する問題