java - 如何找到最接近目标输出 (Y) 的最佳函数输入整数 (X)?

标签 java python excel pseudocode vba

这个答案与 VBA 中的 Excel 宏有关,我正在寻找最佳解决方案。答案可以通过伪代码、Python、Java 或 Excel 兼容的 VBA 提供。该方法应该能够用 Excel VBA 编写。

如果您有替代解决方案(即 Haskell 中的函数式编程),我也希望看到这一点,但这不是主要问题。

我有一个复杂的函数:y = function (x),其中 x 是输入,y 是输出。 x 是一个整数 y 是 double 型(可以包含小数)

我知道 x 必须处于的目标范围,比如说 0 到 2000,或者 800 到 1800。 我也知道你应该是什么。

函数是一个计算量大的函数,应该尽可能少地计算。

我看不到函数的内容,或者它太复杂而无法分析。 该函数的输出是一条递增曲线。 IE。 x=2 > x=1 则 y(2) > y(1)

需要找到 x 值,该值可以为我提供最接近已知 y 值的 y 值。

计算效率最高的方法是什么?

<小时/>

我想到将范围划分为 20 个区域并循环。循环将在第一个大于目标的 y 处停止。 IE。它将运行 2 到 20 次。然后我会转到精确单位(整数)并循环遍历这个子区域或子范围,这意味着最大调用次数为(起始范围/20 - 即,如果起始范围是 0 到 600),那么函数将被调用 2 到 30 次。

有没有更好的方法来做到这一点,也许是递归的。 我好像错过了这里的船?

最佳答案

对于y值总是增加的函数,可以使用binary search快速缩小潜在值的范围。 Python 实现示例:

def binary_search(func, min_x, max_x, target_y):
    while max_x - min_x > 1:
        midpoint = (min_x + max_x) / 2
        if func(midpoint) > target_y:
            max_x = midpoint
        else:
            min_x = midpoint
    return min_x

print binary_search(lambda n: n**2, 0, 600, 300**2)

该算法具有对数效率。对于 0 到 600 的范围,它仅调用 func 十次;对于两倍大的范围,只有十一次。

关于java - 如何找到最接近目标输出 (Y) 的最佳函数输入整数 (X)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24658756/

相关文章:

java - Android JSON 访问缩略图元素

java - 如何检查Java,Maven,Gradle的版本

java - 如何将标签放入我创建的内框架中?

python - 解决方案适用于样本数据,但在线判断给出错误?

vba - 打开问题时自动运行

java - 浏览器渲染和流式传输

python - 使用 Node.js AES CTR 加密并使用 PyCrypto 解密

python - 在 groupby 中的每条记录上显示组

excel - 用于排序和过滤的数据结构

Excel 隐藏/显示功能区上除自定义选项卡之外的所有选项卡