gmpy2.div 给出了 TypeError: div() 参数类型不受支持



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

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

完整的错误读取

回溯(最近一次调用(:文件 "anneal.py",第 14 行,在 estimator1=gmpy2.div(x0, s(-gmpy2.sqrt(((pow(x0,s(/4(-b(( 类型错误:不支持div(( 参数类型

我基本上要实现的是最小化abs((c*d)-e),但是我得到一个错误:TypeError: div() argument types not supported。我已经用谷歌搜索了这个错误,也许造成这种情况的原因是变量和列表之间的类型不匹配。所以我的问题是我应该如何重新制定estimator1estimator2,以便能够将其传递到跳盆最小化器中。

编辑:

更正后的代码现在读取(也删除了不必要的导入(:

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.div中。C代码检查intrationalrealcomplex,如果这些都不适合,则会抛出您提到的错误。尝试将x0作为整数传递。

此外,我认为scipy不会对你传入的mpz(2)感到高兴,scipy通常适用于python listsscipy.sparse矩阵或密集numpy.ndarray s。

在python中处理大量数字方面,int是无限的(https://docs.python.org/3.6/library/stdtypes.html#typesnumeric(。当您需要数字稳定的操作时,NumPy 也是一个好地方,numpy 有自己的类型系统,具有 64 位 float s 和 int s 以及 128 位复数。

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

最新更新