使用scipy.optimize快速找到函数等于0的第一个点

时间:2013-04-11 23:27:26

标签: python scipy mathematical-optimization minimization

基本上,给定一个函数可以为不同的参数生成这样的输出:

enter image description here

我想快速找到函数等于0的第一个x。因此,使用在x上产生蓝色曲线的参数,我想找到x = 134。对于绿色曲线,我想找到x = 56等

认为这个函数总是单调递减,直到它达到零,但我不完全确定。

该功能不一定单调递减。

确定它只会打0次,然后保持为零。

目前我通过迭代x值来强制它,直到我达到零,但我想要一些更好的做出有根据的猜测(基于斜率?)和迭代。

理想情况下,我想使用已经烘焙过的东西(since 90% of programmers can't even write a binary search correctly),就像来自scipy.optimize的东西一样,但似乎所有人都希望找到全局最小值或过零点。

(对于Lch颜色空间中的给定色度,此函数类似于RGB立方体的distance_to_the_wall(因此基本上构建了一个"明亮的剪辑到RGB"函数),但由于IRGB和LCh之间的映射可以根据库和光源等参数而有所不同。我认为最好只尝试几个值,直到找到正确的值而不是直接反向计算值?)

3 个答案:

答案 0 :(得分:2)

尝试bisection:检查间隔中间是否为0;如果是,继续在左边,否则,在右边。以递减方式减少间隔做同样的事情,直到你足够接近。与您的方法相比,此方法的复杂度为O(log n),即O(n)。

答案 1 :(得分:2)

以下是一些充实@ExP的二分/二分搜索答案的代码:

def find_first_zero(func, min, max, tol=1e-3):
    min, max = float(min), float(max)
    assert (max + tol) > max
    while (max - min) > tol:
        mid = (min + max) / 2
        if func(mid) == 0:
            max = mid
        else:
            min = mid
    return max

答案 2 :(得分:0)

如果不是因为曲线的右手到处都是0,牛顿的方法(https://en.wikipedia.org/wiki/Newton's_method)会很好用。但我认为一个变体仍然可以正常工作:

1)选择一个点。

2)如果我们在斜坡上,在局部采用斜率的斜率并从那里追踪一条线到x截距并将其作为新点(转到1)。

3)如果我们在平坦的平原上(x = 0,衍生物= 0),那么如果左边的位是一个斜率(必须调整这个来计算剩下多少要检查),那么本地搜索(可能是具有容差的二分搜索)以找到函数首先等于零的点。如果没有,那么取这个点和我们尝试的斜率上的最后一个点之间的中间点(用这个新点转到1)。

要估算导数(以确定您是否在斜坡上),您可以向左侧和右侧采样一个点,距离足够远,您可以确信您将获得平滑的近似值。衍生物。