Минимизация со скачкообразной перекачкой в ​​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))

полная ошибка читает

Traceback (последний вызов был последним): файл "anneal.py", строка 14, в estimator1=gmpy2.div(x0, s)-gmpy2.sqrt(((pow(x0,s)/4)-b)) TypeError Типы аргументов: div() не поддерживаются

То, что я в основном пытаюсь достичь, это минимизировать abs((c*d)-e)Однако я получаю ошибку как: TypeError: div() argument types not supported, Я гуглил об этой ошибке и, возможно, причиной этого является несоответствие типов между переменной и списком. Поэтому мой вопрос заключается в том, как я должен переформулировать estimator1 а также estimator2 чтобы иметь возможность передать его в минимизатор прыгающего бассейна.

Редактировать:

Исправленный код теперь читает (также удалены ненужные импорты):

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

1 ответ

Решение

Я думаю, что проблема в том, что вы проходите в питоне list в gmpy2.div, C проверка кода для int, rational, real а также complex и если ни один из них не подходит, выдает ошибку, которую вы упомянули. Попробуйте пройти в x0 как инт.

Дальше не думаю scipy будет слишком рад mpz(2) ты проходишь мимо, scipy обычно работает с любым питоном lists, scipy.sparse матрицы или плотные numpy.ndarrays.

С точки зрения обработки больших чисел в Python, ints не ограничены ( https://docs.python.org/3.6/library/stdtypes.html). NumPy также является хорошим местом для поиска, когда вам нужны численно стабильные операции, у numpy есть своя собственная система типов с 64-битной floatс и ints и 128-битные комплексные числа.

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

Другие вопросы по тегам