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
(即说 x
为 sign(f(x-e)) != sign(f(x+e))
和 abs(f(x-e)-f(x+e)>a
为无穷小 e>0
和非无穷小a>0
)。例如,在这种情况下,如果算法只是在一定的公差范围内 returns 和 x
也是可以的。
由于函数只是弱单调,它可以有平坦的区域,理论上这些可以出现在'at'根上,即f=0
: f(x)=0 for an entire range, x in [x_0,x_1]
。在这种情况下,算法 很好但不是必需的 来标记这种特殊性,并且,比如说,确保范围 [x_0,x_1]
中的 x
是 returned.
只要您为 xtol
和 rtol
提供(可能非常小的)严格正数,该函数将适用于不连续性:
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 代码库,您会发现这是一个非常简单的函数,不对连续性做任何假设。它基本上需要两个有符号变化的点,然后切换到一个较小的范围并改变符号,直到迭代 运行 结束或满足公差。
鉴于您的要求,函数 可能 是不连续的/平坦的,实际上 需要 (对于任何算法)提供这些公差.没有它们,优化函数就不可能收敛到一个解。
我正在寻找一种 Python 算法来 使用二分法 找到函数 f(x)
的根,等同于 scipy.optimize.bisect,但 允许 f
中的不连续性(跳跃)。函数f
弱单调
如果交叉点(根)直接'at'跳转,算法会很好但没必要标记,在这种情况下return 发生相关跳跃的确切值 x
(即说 x
为 sign(f(x-e)) != sign(f(x+e))
和 abs(f(x-e)-f(x+e)>a
为无穷小 e>0
和非无穷小a>0
)。例如,在这种情况下,如果算法只是在一定的公差范围内 returns 和 x
也是可以的。
由于函数只是弱单调,它可以有平坦的区域,理论上这些可以出现在'at'根上,即f=0
: f(x)=0 for an entire range, x in [x_0,x_1]
。在这种情况下,算法 很好但不是必需的 来标记这种特殊性,并且,比如说,确保范围 [x_0,x_1]
中的 x
是 returned.
只要您为 xtol
和 rtol
提供(可能非常小的)严格正数,该函数将适用于不连续性:
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 代码库,您会发现这是一个非常简单的函数,不对连续性做任何假设。它基本上需要两个有符号变化的点,然后切换到一个较小的范围并改变符号,直到迭代 运行 结束或满足公差。
鉴于您的要求,函数 可能 是不连续的/平坦的,实际上 需要 (对于任何算法)提供这些公差.没有它们,优化函数就不可能收敛到一个解。