-1
我有一个函数f(x),其我知道有一个间隔内两个零点和我需要计算这两个x值用于至极功能横0查找函数的两个零点与Python
我通常使用
import scipy.optimize as opt
opt.brentq(f, xmin, xmax)
但问题是这种方法的工作如果函数在区间1路0,这是不是很简单的知道到哪里两个部分划分。
功能也是时间成本来评估...
我有一个函数f(x),其我知道有一个间隔内两个零点和我需要计算这两个x值用于至极功能横0查找函数的两个零点与Python
我通常使用
import scipy.optimize as opt
opt.brentq(f, xmin, xmax)
但问题是这种方法的工作如果函数在区间1路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]。请记住,该算法非常耗时,但可以完成这项工作。
它是一个连续函数吗? –
函数在区间内部是否具有唯一的最小值/最大值?如果是这样,您可以首先找到该极值的位置,例如通过[黄金分割搜索](https://en.wikipedia.org/wiki/Golden-section_search),然后使用它将您的间隔分割为两个每个包含一个根。 –
以上两条评论的较短版本:请给我们更多关于您的功能的信息。你怎么知道它恰好有两个零? –