2017-10-02 2 views
0

람다 함수로 내 제약 조건을 지정하지 않고 scipy.optimize.minimize 함수를 사용하고 싶습니다. 이것이 가능한가? 표준 예를 들어람다 함수없이 scipy.optimize.minimize 사용

예 :

from scipy.optimize import minimize 

def fun(x): 
    return (x[0] - 1) ** 2 + (x[1] - 2.5)**2. 

x = (2, 0) 

def c_0(x): 
    return x[0] - 2. * x[1] + 2. 

def c_1(x): 
    return -x[0] - 2. * x[1] + 6. 

def c_2(x): 
    return -x[0] + 2. * x[1] + 2. 

cons = ({'type': 'ineq', 'fun': c_0(x)}, 
    {'type': 'ineq', 'fun': c_1(x)}, 
    {'type': 'ineq', 'fun': c_2(x)}) 

bnds = ((0, None), (0, None)) 

res = minimize(fun(x), x, method='SLSQP', bounds=bnds, constraints=cons) 

내가 람다 함수를 사용하지 않도록하려는 이유는 내 제약 번호가 아니라면, 그래서 내 문제 (자유도 2 * 번호)에 대해 매우 빠르게 성장이다 내 제약 조건을위한 "람다 (lambda)"팩토리를 만드는 방법을 명시 적으로 작성하면 매우 빨리 지루해집니다.

위의 코드를 반환 :

TypeError: 'float' object is not callable 
+0

유의 사항 : fun는 함수입니다. fun (x)는 x에서의 값입니다. – FTP

+0

설명해 주셔서 감사합니다! – user2770149

답변

1

호출 인수없이 작동합니다. 이것은 나를 위해 작동합니다 :

from scipy.optimize import minimize 

def fun(x): 
    return (x[0] - 1) ** 2 + (x[1] - 2.5)**2. 

x = (2, 0) 

def c_0(x): 
    return x[0] - 2. * x[1] + 2. 

def c_1(x): 
    return -x[0] - 2. * x[1] + 6. 

def c_2(x): 
    return -x[0] + 2. * x[1] + 2. 

cons = ({'type': 'ineq', 'fun': c_0}, 
    {'type': 'ineq', 'fun': c_1}, 
    {'type': 'ineq', 'fun': c_2}) 

bnds = ((0, None), (0, None)) 

res = minimize(fun, x, method='SLSQP', bounds=bnds, constraints=cons) 
+0

맞습니다.하지만 그 함수를 호출하지는 않았습니다. 매개 변수로 전달하고 있습니다. – FTP

+0

실제로 해명 해줘서 고마워. –