我在这里处理一个相当复杂的程序,不幸的是我已经把自己画成了一个角落。
我有一个函数(为了简单起见,我将其称为f(x))我知道输出值,我需要找到生成该输出值的输入值(在某个阈值内)
不幸的是f(x)背后的方程式相当复杂,而且我没有完全反向运行它们所需的所有信息 - 所以我被迫执行某种强力搜索找到正确的输入变量。
保证f(x)的输出被排序,使得f(x-1) 找到x值的最有效方法是什么?我不完全确定这是否是根本发现"问题 - 似乎非常接近,但并不完全。我认为这种算法必须有一些官方名称,但我还没能在Google上找到任何东西。
答案 0 :(得分:4)
我假设x
是一个整数,因此结果f(x - 1) < f(x) < f(x + 1)
表示该函数严格单调。
我还假设你的功能不是病态的,比如
f(x) = x * cos(2 * pi * x)
满足您的属性,但在整数值x
之间有各种各样的恶意。
线性二分算法在这里是合适且易处理的(你可以将它调整为对非整数x
表现不佳的函数),布伦特可以更快地恢复解决方案。这样的算法很可能会返回x
的非整数值,但你可以随时检查其中任意一侧的整数,并返回最佳值(如果函数在 all <中单调,则会起作用/ em> x
的实际值。此外,如果你有f(x)
的分析一阶导数,那么 Newton Raphson 的改编可能效果很好,将x
限制为积分(这可能没有多大意义,取决于你的功能;将它应用于上面的病理例子将是灾难性的!)。 Newton Raphson很可爱,因为你只需要一个起点,不像Linear Bisection和Brent,它们都需要根括号。
谷歌使用斜体的条款。
答案 1 :(得分:1)
对于一般功能,我会执行以下操作:
x
是正还是负。如果多次调用它,我会沿途缓存值以减少后续操作所需的时间。