2017-10-02 9 views
0

Je souhaite utiliser la fonction scipy.optimize.minimize sans spécifier mes contraintes en tant que fonctions lambda. Est-ce possible?Utilisation de scipy.optimize.minimize sans fonctions lambda

-à-dire pour l'exemple standard:

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) 

La raison pour laquelle je veux éviter d'utiliser des fonctions lambda est que mon numéro de contrainte se développe assez rapidement pour mon problème (2 * nombre de degrés de liberté), donc à moins qu'il y une façon de créer une usine "lambda" pour mes contraintes, les écrire explicitement deviendra vite fastidieux.

Les retours extrait de code ci-dessus:

TypeError: 'float' object is not callable 
+0

Notez la différence: le plaisir est une fonction; fun (x) est sa valeur à x. – FTP

+0

Merci pour la clarification! – user2770149

Répondre

1

appeler les fonctions sans arguments. Cela fonctionne pour moi:

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

Correct, mais ce n'est pas _calling_ la fonction, c'est passer en paramètre. – FTP

+0

En effet, merci pour la clarification. –