Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于scipy的寻根算法优化_Python_Optimization_Scipy_Numba - Fatal编程技术网

Python 基于scipy的寻根算法优化

Python 基于scipy的寻根算法优化,python,optimization,scipy,numba,Python,Optimization,Scipy,Numba,我使用scipy.optimize中的root函数,在我的代码中使用“excitingmixing”方法,因为其他方法,如标准牛顿,不会收敛到我正在寻找的根 但是,我想使用numba优化我的代码,它不支持scipy包。我试图在文档中查找“令人兴奋的混合”算法,以便自己编程: 我没有发现任何有用的东西,除了没有真正有用的说法,即该方法“使用调整的对角雅可比近似” 如果有人能告诉我一些关于算法的事情,或者有一个如何以其他方式优化scipy函数的想法,我会很高兴 根据要求,这里有一个最小的代码示例:

我使用
scipy.optimize
中的
root
函数,在我的代码中使用“excitingmixing”方法,因为其他方法,如标准牛顿,不会收敛到我正在寻找的根

但是,我想使用
numba
优化我的代码,它不支持
scipy
包。我试图在文档中查找“令人兴奋的混合”算法,以便自己编程:

我没有发现任何有用的东西,除了没有真正有用的说法,即该方法“使用调整的对角雅可比近似”

如果有人能告诉我一些关于算法的事情,或者有一个如何以其他方式优化
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)

您可以查看scipy的源代码以查看
excitingmixing
选项的实现:


您可能不想在numba中重新实现整个根查找算法。我可以测试的更好的策略是使用numba优化传递给scipy方法的函数。您仍然需要支付scipy调用函数的一些开销,但是如果瓶颈是评估函数,那么您可能会看到性能提高,而使用numba jitted版本可以更快地完成这项工作。我发现最好只使用numba进行实验,然后使用
timeit
方法进行测试。

我编写了一个名为
NumbaMinpack
的小包装程序Minpack,它可以在numba编译函数中调用:

如果牛顿的方法失败了,你应该试试
lmdif
方法

来自NumbaMinpack进口lmdif、hybrd、minpack\u sig
来自numba import njit,cfunc
将numpy作为np导入
@cfunc(minpack_sig)
def myfunc(x、fvec、参数):
fvec[0]=x[0]**2-参数[0]
fvec[1]=x[1]**2-参数[1]
funcptr=myfunc.address#指向myfunc的指针
x_init=np.array([10.0,10.0])#初始条件
neqs=2#方程个数
args=np.array([30.0,8.0])#要传递给myfunc的数据
@njit
def test():
#用lmdif求解
sol=lmdif(funcptr,x_init,neqs,args)
#或者用hybrd解决
sol=hybrd(funcptr,x_init,args)
返回溶胶
test()#有效!

考虑运行探查器,以确定消耗大部分计算时间的是
激励混合
优化程序的开销,还是目标函数的评估。如果是后者,您可以将目标函数移植到
numba
,并使用
scipy
提供的标准算法。我很确定这不是我的函数。该函数已经过优化,大多数寻根算法速度更快,但不会收敛到我正在寻找的根。请提供一个完整的示例。许多scipy函数可以采用低级回调函数而不是Python函数。这是scipy.integrate.quad的一个示例,感谢您的快速回答-我已经优化了从scipy调用的函数,瓶颈实际上是scipy提供的带有“excitingmixing”选项的根查找算法。