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까지 실행되지만 기본적으로 파이썬에서 목록 유형 객체의 인덱싱은 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

네, 알겠습니다. 그래도 (i + 1)이어야합니다. 따라서 일부에서는 x [0]과 x [1]을 변수로 사용합니다. 최소화 함수에서 인덱싱이 실제로 올바른가요? _eqn에서 y와 변수를 변경한다고 가정하면, 최소화되지 않을 것입니다 (lambda 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)) (범위 (z)에있는 i에 대한] ' – Peterhack