Оптимизация алгоритма поиска корня от scipy - PullRequest
0 голосов
/ 22 мая 2018

Я использую функцию 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)

1 Ответ

0 голосов
/ 22 мая 2018

Вы можете посмотреть в исходном коде scipy, чтобы увидеть реализацию опции excitingmixing:

https://github.com/scipy/scipy/blob/c948e96ebb3454f6a82e9d14021cc601d7ce7a85/scipy/optimize/nonlin.py#L1272

Скорее всего, вы не захотите переопределить весьАлгоритм поиска корней в Numba.Моя лучшая стратегия, которую вы можете проверить, это использовать numba для оптимизации функции, которую вы передаете методу scipy.Вы по-прежнему будете платить некоторые накладные расходы на вызов функции scipy, но вы можете увидеть увеличение производительности, если узкое место оценивает функцию, и это можно сделать быстрее с версией numba jited.Я считаю, что лучше всего поэкспериментировать с numba и протестировать методом timeit.

...