0

Je veux minimiser une fonction qui a plusieurs entrées mais aussi plusieurs sorties. Plus spécifique, j'appelle un calcul Excel et je veux contraindre des entrées et des sorties particulières de la fonction. Jusqu'à présent, j'ai juste réussi à minimiser la fonction scalaire, ce qui signifie des entrées multiples, mais seulement une sortie. Quelqu'un peut-il me guider si un tel problème peut être résolu par Python/Scipy? Je voudrais choisir x pour que smpkt soit minimisé et A soit plus petit qu'une valeur particulière.scipy.optimize pour la fonction vectorielle

Par exemple, certains extraits de code:

def f1(x,params): 
    y=F(x) 

La fonction F(x) est une feuille Excel externe avec plusieurs entrées et sorties, la sortie doit être y = [smpkt, A]. Maintenant, je voudrais minimiser smpkt et garder A plus petit que ma contrainte en choisissant x.

Jusqu'à présent, je réussi à minimiser y=F(x) y = [smpkt] comme scalaire par l'appel suivant:

res = optimize.minimize(f1, x0, args=params, method='COBYLA',options={'ftol': 0.1, 'maxiter': 5}) 

Toute idée?

Répondre

0

Remarque: Je ne suis pas sûr que ce qui suit fasse ce que vous voulez faire. En particulier, vous dites "Je voudrais garder variable" A "plus petit qu'une valeur particulière", ce qui n'est pas la même chose que "Je veux choisir x pour que A soit aussi petit que possible.". Pour ce que ça vaut, voici une réponse pour une interprétation de votre question.

Si vous voulez minimiser un composant de la sortie, comme le suggère vos commentaires sur la fonction f1 (et vous ne pouvez pas modifier simplement f1 pour retourner uniquement A), vous aurez besoin d'envelopper la fonction existante une autre fonction qui appelle f1 et renvoie seulement A (en supposant que A est, en fait, un scalaire).

E.g.

def objective_function(x, params): 
    smpkt, A = f1(x, params) 
    return A 

Vous pouvez obtenir le même effet de façon plus concise avec une expression lambda:

res = optimize.minimize(lambda x, params: f1(x, params)[1], 
         x0, args=params, method='COBYLA', 
         options={'ftol': 0.1, 'maxiter': 5}) 
+0

Merci! J'ai édité ma question pour devenir plus clair! – Steff80