2017-06-11 2 views
0

J'essaie de minimiser une fonction avec un algorithme de saut de bassin en science-fiction. Voici mon code:Minimisation avec saut de bassin dans Scipy

from math import * 
import time 
import gmpy2 
from gmpy2 import mpz 
from gmpy2 import mpq,mpfr,mpc 
import numpy as np 
from scipy.optimize import basinhopping 
minimizer_kwargs = {"method": "BFGS"} 


s=mpz('2') 
x0=[153000] 
b = mpfr('6097781399') 
estimator1=gmpy2.div(x0, s)-gmpy2.sqrt(((pow(x0,s)/4)-b)) 
estimator2=gmpy2.div(x0, s)+gmpy2.sqrt(((pow(x0,s)/4)-b)) 

c=mpfr(estimator1) 
d=mpfr(estimator2) 
e=mpz(b) 

func = lambda x: abs((c*d)-e) 

ret = basinhopping(func, x0, minimizer_kwargs=minimizer_kwargs, 
niter=400) 
print("global minimum: x = %.4f, f(x0) = %.4f" % (ret.x, ret.fun)) 

l'erreur complète lit

Traceback (most recent call last): File "anneal.py", line 14, in estimator1=gmpy2.div(x0, s)-gmpy2.sqrt(((pow(x0,s)/4)-b)) TypeError: div() argument types not supported

Ce que je veux essentiellement essayer d'atteindre est de minimiser abs((c*d)-e), mais je reçois une erreur: TypeError: div() argument types not supported. J'ai recherché sur Google cette erreur et peut-être la cause de ceci est une incompatibilité de type entre une variable et une liste. Donc, ma question est de savoir comment je devrais reformuler estimator1 et estimator2 pour être en mesure de le passer en minimiseur de bassin-hopping.

Edit:

code corrigé indique désormais (également supprimé les importations inutiles):

from math import * 
from scipy.optimize import basinhopping 
minimizer_kwargs = {"method": "BFGS"} 
def f(x): 

    b = 6097781399 
    estimator1=(x/2)-sqrt(abs((pow(x,2)/4)-b)) 
    estimator2=(x/2)+sqrt(abs((pow(x,2)/4)-b)) 
    return abs((estimator1*estimator2)-b) 

x = 110000 
ret = basinhopping(f, x, minimizer_kwargs=minimizer_kwargs, 
niter=2000) 
print("global minimum: x = %.4f, f(x0) = %.4f" % (ret.x, ret.fun)) 
+0

pouvez-vous poster l'erreur complète? –

+0

Traceback (dernier appel en dernier): Fichier "C: \ Users \ msalperen \ Desktop \ anneal.py", ligne 14, en estimator1 = gmpy2.div (x0, s) -gmpy2.sqrt (((pow (x0, s)/4) -b)) TypeError: div() types d'arguments non supportés – msalperen

+0

Je pense que le problème est que vous passez un 'list' de python dans' gmpy2.div'. Le code 'C' vérifie int, rationnel, réel et complexe et si aucun de ces ajustements ne renvoie l'erreur que vous avez mentionnée. Avez-vous essayé de passer dans 'x0' comme un' int'? –

Répondre

0

Je pense que le problème est que vous passez dans un python list dans gmpy2.div. Le code C vérifie int, rational, real et complex et si aucun de ces ajustements ne renvoie l'erreur que vous avez mentionnée. Essayez de passer en x0 en tant qu'int.

En outre, je ne pense pas scipy sera trop heureux de la mpz(2) vous passez dans, scipy travaille habituellement avec soit python lists, scipy.sparse matrices ou numpy.ndarray denses s.

En termes de gestion de grands nombres en python, les int sont non bornés (https://docs.python.org/3.6/library/stdtypes.html#typesnumeric). NumPy est aussi un bon endroit pour regarder quand vous avez besoin d'opérations numériquement stables, numpy a son propre système de type avec 64bit float s et int et 128 bits nombres complexes.

https://docs.scipy.org/doc/numpy/user/basics.types.html

+0

J'ai défini mes variables dans une fonction et une valeur initiale en dehors de cette fonction. Maintenant, il semble fonctionner (j'ai inséré un code mis à jour ci-dessus pour plus de référence). Merci. – msalperen