【发布时间】:2014-06-20 17:39:22
【问题描述】:
编辑:这里的一个大问题是scipy.optimize.brentq 要求搜索间隔的限制具有相反的符号。如果您将搜索间隔分成任意部分并在每个部分上运行brentq,就像我在下面所做的那样以及 Dan 在 cmets 中所做的那样,您最终会抛出很多无用的 ValueErrors。在 Python 中有没有一种巧妙的方法来处理这个问题?
原帖:
我在 python 中反复搜索它们最大的零的函数。现在我正在使用scipy.optimize.brentq 来查找根,然后如果我的初始边界不起作用,则使用粗暴的搜索方法:
#function to find the largest root of f
def bigRoot(func, pars):
try:
root = brentq(func,0.001,4,pars)
except ValueError:
s = 0.1
while True:
try:
root = brentq(func,4-s,4,pars)
break
except ValueError:
s += 0.1
continue
return root
这有两个大问题。
首先我假设如果一个区间中有多个根,则 brentq 将返回最大的。我做了一些简单的测试,除了最大的根,我从未见过它返回任何东西,但我不知道这是否在所有情况下都是正确的。
第二个问题是在脚本中我使用这个函数在某些情况下总是返回零,即使我传递给bigRoot 的函数在 0 处发散。如果我将搜索的步长从 0.1 更改为0.01 那么在这些情况下它将返回一个恒定的非零值。我意识到这取决于我传递给bigRoot 的函数,但我认为问题可能出在我进行搜索的方式上。
问题是,在 python 中寻找函数的最大根的更聪明的方法是什么?
谢谢丹;根据要求,下面提供了更多信息。
我正在搜索的函数在我感兴趣的区域表现良好。下面绘制了一个示例(代码在帖子末尾)。
唯一的奇异点在 0 处(超出图顶部的峰值是有限的)并且有两个或三个根。最大的根通常不大于 1,但它从不做任何事情,比如跑到无穷大。根之间的间隔在域的低端变得更小,但它们永远不会变得非常小(我会说它们总是大于 10^-3)。
from numpy import exp as e
#this isn't the function I plotted
def V(r):
return 27.2*(
23.2*e(-43.8*r) +
8.74E-9*e(-32.9*r)/r**6 -
5.98E-6*e(-0.116*r)/r**4 +
0.0529*( 23*e(-62.5*r) - 6.44*e(-32*r) )/r -
29.3*e(-59.5*r)
)
#this is the definition of the function in the plot
def f(r,b,E):
return 1 - b**2/r**2 - V(r)/E
#the plot is of f(r,0.1,0.06)
【问题讨论】:
标签: python optimization numpy