Я использую функцию root
из scipy.optimize
с методом «возбуждающее смешение» в моем коде, потому что другие методы, такие как стандартный Ньютон, не сходятся к искомым корням.
ОднакоЯ хотел бы оптимизировать свой код, используя numba
, который не поддерживает пакет scipy
.Я попытался найти алгоритм «захватывающего микширования» в документации, чтобы запрограммировать его сам:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.root.html
Я не нашел ничего полезного, кроме не очень полезного утверждения, что метод«использует настроенную диагональную якобианскую аппроксимацию».
Я был бы рад, если бы кто-нибудь мог рассказать мне что-нибудь об алгоритме или иметь представление о том, как оптимизировать функцию scipy
другим способом.
В соответствии с запросом приведен минимальный пример кода:
import numpy as np
from scipy import optimize
from numba import jit
@jit(nopython = True)
def func(x):
[a, b, c, d] = x
da = a*(1-b)
db = b*(1-c)
dc = c
dd = 1
return [da, db, dc, dd]
@jit(nopython = True)
def getRoot(x0):
solution = optimize.root(func, x0, method="excitingmixing")
return(solution.x)
root = getRoot([0.1,0.1,0.2,0.4])
print(root)