Bisect with discontinuous monotonous function:使用二分法求根,用于允许跳跃的弱单调函数

Bisect with discontinuous monotonous function: Find root using bisection for weakly monotonous function allowing for jumps

我正在寻找一种 Python 算法来 使用二分法 找到函数 f(x) 的根,等同于 scipy.optimize.bisect,但 允许 f 中的不连续性(跳跃)。函数f弱单调

如果交叉点(根)直接'at'跳转,算法会很好但没必要标记,在这种情况下return 发生相关跳跃的确切值 x(即说 xsign(f(x-e)) != sign(f(x+e))abs(f(x-e)-f(x+e)>a 为无穷小 e>0 和非无穷小a>0)。例如,在这种情况下,如果算法只是在一定的公差范围内 returns 和 x 也是可以的。

由于函数只是单调,它可以有平坦的区域,理论上这些可以出现在'at'根上,即f=0f(x)=0 for an entire range, x in [x_0,x_1]。在这种情况下,算法 很好但不是必需的 来标记这种特殊性,并且,比如说,确保范围 [x_0,x_1] 中的 x 是 returned.

只要您为 xtolrtol 提供(可能非常小的)严格正数,该函数将适用于不连续性:

import numpy as np
>>> optimize.bisect(f=np.sign, a=-1, b=1, xtol=0.0001, rtol=0.001)
0.0

如果您查看 C source code implementation of the function 的 scipy 代码库,您会发现这是一个非常简单的函数,不对连续性做任何假设。它基本上需要两个有符号变化的点,然后切换到一个较小的范围并改变符号,直到迭代 运行 结束或满足公差。

鉴于您的要求,函数 可能 是不连续的/平坦的,实际上 需要 (对于任何算法)提供这些公差.没有它们,优化函数就不可能收敛到一个解。