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))
pouvez-vous poster l'erreur complète? –
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
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'? –