2017-08-04 1 views
0

J'essaye de minimiser une fonction en utilisant scipy.optimize. Voici mon programme et la dernière ligne est le message d'erreur.Comment convertir une variable de symbole en variable itérable?

import sympy as s 
from scipy.optimize import minimize 
x,y,z=s.symbols('x y z') 
f= lambda z: x**2-y**2 
bnds = ((70,None),(4,6)) 
res = minimize(lambda z: fun(*x),(70,4), bounds=bnds) 



<lambda>() argument after * must be an iterable, not Symbol 

Comment convertir un symbole en itérable ou définir directement un itérable?

Répondre

1

En Python, appeler une fonction avec f(*x) signifie f(x[0], x[1], ...). C'est-il attend x à un tuple (ou autre itérables), et la fonction devrait avoir une définition comme

def f(*args): 
    <use args tuple> 

Je ne suis pas tout à fait sûr de ce que vous essayez de faire avec le code sympy, ou pourquoi vous êtes l'utiliser au lieu de définir une fonction en Python/numpy directement.

Une fonction comme:

def f(z): 
    x,y = z # expand it to 2 variables 
    return x**2 - y**2 

devrait fonctionner dans un appel avec minimiser:

minimize(f, (10,3)) 

qui varie x et y commençant par (10,3) cherchant à minimiser la valeur f.

In [20]: minimize(f, (70,4), bounds=((70,None),(4,6))) 
Out[20]: 
     fun: 4864.0 
hess_inv: <2x2 LbfgsInvHessProduct with dtype=float64> 
     jac: array([ 139.99988369, -11.99996404]) 
    message: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL' 
    nfev: 9 
     nit: 1 
    status: 0 
    success: True 
     x: array([ 70., 6.]) 
+0

Que signifie message: b'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT _ <= _ PGTOL '? – Shareef