numpy 用Python求函数的两个零

enyaitl3  于 2023-10-19  发布在  Python
关注(0)|答案(1)|浏览(104)

我有一个函数f(x),我知道它在一个区间内有两个零,我需要计算函数过0的两个x值。
我通常使用

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

但问题是,如果函数在区间中有一个0,这种方法就有效了,而且要知道在哪里分成两部分并不容易。
该功能也是时间成本评估.

7d7tgy0s

7d7tgy0s1#

我认为一个好的方法是在搜索零点之前通过对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]中的所有零。请记住,这个算法是耗时的,但会做的工作。

相关问题