我想确定最大化某个函数(类似于下一个函数)的 x 值:
很明显,当x = 0时达到A的最大值,然后A = 200。
我如何用 Java 解决这个问题?
更新:很抱歉没有从一开始就说清楚。 x 是一个 int,但我需要一种方法来在 x 不是上限时也找到最大值,如下一个示例所示:
最佳答案
floor 函数有一个线性上限和一个下限,x-1 < floor(x) < x
, 这应该可以确定曲线的一般形状。然后可以找到下限的最大值(这是一个线性函数)并枚举 x
的值。属于A
上限的区域可能达到下界的最大值,即上界超过下界的最小值的区域。
如果这个区域是有限的,x
最大化 A
从而可以找到。如果不是,则表明该函数是循环的,因此您必须确定它的周期并找到周期的最大值。
在示例中,下限为 (x + 100) / 1000 - 1 + 3 * (x / 1000 - 1) + 200 - x
, 等于 (196100 - 996 * x) / 1000
, 和上限 (x + 100) / 1000 + 3 * (x / 1000) + 200 - x
或 (200100 - 996 * x) / 1000
.下界显然达到了最大值 196100 / 1000
在 x == 0
因此我们只需要检查那些上限较高的 x 值,(200100 - 996 * x) / 1000 > 196100 / 1000
, 可以简化为 x < 4.02
, 所以只需要检查 x
的值从 0 到 4。
关于java - Java中非线性方程的最大化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11725175/