2017-06-20 19 views
-1

我有一个函数f(x),其我知道有一个间隔内两个零点和我需要计算这两个x值用于至极功能横0查找函数的两个零点与Python

我通常使用

import scipy.optimize as opt 
opt.brentq(f, xmin, xmax) 

但问题是这种方法的工作如果函数在区间1路0,这是不是很简单的知道到哪里两个部分划分。

功能也是时间成本来评估...

+1

它是一个连续函数吗? –

+0

函数在区间内部是否具有唯一的最小值/最大值?如果是这样,您可以首先找到该极值的位置,例如通过[黄金分割搜索](https://en.wikipedia.org/wiki/Golden-section_search),然后使用它将您的间隔分割为两个每个包含一个根。 –

+0

以上两条评论的较短版本:请给我们更多关于您的功能的信息。你怎么知道它恰好有两个零? –

回答

0

我认为一个好的办法是预先处理抽样搜索零点F的寻找零点之前。在该预处理期间,您将评估f以检测函数的符号是​​否已更改。

def preprocess(f,xmin,xmax,step): 
    first_sign = f(xmin) > 0 # True if f(xmin) > 0, otherwise False 
    x = xmin + step 
    while x <= xmax: # This loop detects when the function changes its sign 
     fstep = f(x) 
     if first_sign and fstep < 0: 
      return x 
     elif not(first_sign) and fstep > 0: 
      return x 
     x += step 
    return x # If you ever reach here, that means that there isn't a zero in the function !!! 

使用此功能,您可以将您的初始间隔分成几个较小的间隔。例如:

import scipy.optimize as opt 
step = ... 
xmid = preprocess(f,xmin,max,step) 

z0 = opt.brentq(f,xmin,xmid) 
z1 = opt.brentq(f,xmid,xmax) 

根据的f您使用的功能,您可能需要您的间隔在两个以上的子区间分开。只是通过迭代[XMIN,XMAX]这样的:

x_list = [] 
x = x_min 
while x < xmax: # This discovers when f changes its sign 
    x_list.append(x) 
    x = preprocess(f,x,xmax,step) 
x_list.append(xmax) 

z_list = [] 
for i in range(len(x_list) - 1): 
    z_list.append(opt.brentq(f,x_list[i],x_list[i + 1])) 

最后,z_list包含在给定间隔内的所有的零点[XMIN,XMAX]。请记住,该算法非常耗时,但可以完成这项工作。