gmpy2.div gives TypeError: div() argument types not supported

gmpy2.div gives TypeError: div() argument types not supported

我正在尝试使用 sci-py 中的 basin-hopping 算法最小化一个函数。这是我的代码:

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))

完整错误为

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

我基本上想要实现的是最小化 abs((c*d)-e),但是我得到一个错误:TypeError: div() argument types not supported。我用谷歌搜索了这个错误,可能是因为变量和列表之间的类型不匹配。所以我的问题是我应该如何重新制定 estimator1estimator2 才能将其传递到 basin-hopping 最小化器中。

编辑:

现在更正的代码如下(也删除了不必要的导入):

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))

我认为问题在于您将 python list 传递给 gmpy2.divC 代码检查 intrationalrealcomplex,如果其中 none 符合,它会抛出您提到的错误。尝试将 x0 作为整数传递。

此外,我认为 scipy 不会对您传入的 mpz(2) 感到太高兴,scipy 通常与 python [=21] 一起使用=], scipy.sparse 矩阵或密集 numpy.ndarrays.

在 python 中处理大数方面,int 是无界的 (https://docs.python.org/3.6/library/stdtypes.html#typesnumeric)。当您需要数值稳定的操作时,NumPy 也是一个不错的选择,numpy 有自己的类型系统,包括 64 位 floats 和 ints 以及 128 位复数。

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