【发布时间】:2018-05-22 14:59:53
【问题描述】:
我在我的代码中使用来自scipy.optimize 的root 函数和方法“excitingmixing”,因为其他方法,如标准牛顿法,不会收敛到我正在寻找的根。
但是我想使用不支持scipy 包的numba 优化我的代码。我试图在文档中查找“令人兴奋的混合”算法来自己编程:
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)
【问题讨论】:
-
考虑运行分析器以确定消耗大部分计算时间的是
ExcitingMixing优化器的开销,还是对目标函数的评估。如果是后者,您可以将目标函数移植到numba并使用scipy提供的标准算法。 -
我很确定这不是我的职责。该函数已经过优化,大多数求根算法更快,但不会收敛到我正在寻找的根。
-
提供一个完整的例子。许多 scipy 函数可以采用低级回调函数而不是 Python 函数。这是 scipy.integrate.quad stackoverflow.com/a/50097776/4045774 的示例
标签: python optimization scipy numba