如果您已经知道输出,找到函数输入的最佳方法是什么?

时间:2017-06-24 12:58:35

标签: c algorithm

我在这里处理一个相当复杂的程序,不幸的是我已经把自己画成了一个角落。

我有一个函数(为了简单起见,我将其称为f(x))我知道输出值,我需要找到生成该输出值的输入值(在某个阈值内)

不幸的是f(x)背后的方程式相当复杂,而且我没有完全反向运行它们所需的所有信息 - 所以我被迫执行某种强力搜索找到正确的输入变量。

保证f(x)的输出被排序,使得f(x-1)

找到x值的最有效方法是什么?我不完全确定这是否是根本发现"问题 - 似乎非常接近,但并不完全。我认为这种算法必须有一些官方名称,但我还没能在Google上找到任何东西。

2 个答案:

答案 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,它们都需要根括号

谷歌使用斜体的条款。

参考:Activities: list

答案 1 :(得分:1)

对于一般功能,我会执行以下操作:

  1. 从0开始评估并确定x是正还是负。
  2. (假设是积极的)。 。 。评估2的幂,直到绑定值(1,2,4,8,...)
  3. 一旦你有界限,然后重复二分,直到你得到你正在寻找的精度
  4. 如果多次调用它,我会沿途缓存值以减少后续操作所需的时间。