Java中非线性方程的最大化

时间:2012-07-30 16:02:34

标签: java math mathematical-optimization scientific-computing nonlinear-functions

我想确定某个函数(类似于下一个函数)最大化的x的值: enter image description here

很明显,当x = 0时,达到A的最大值,然后A = 200。

我怎样才能在Java中解决这个问题?

更新:很抱歉没有从头开始说清楚。 x是一个int,但我需要一个方法来找到最大值,当x不是上限时,如下例所示: enter image description here

5 个答案:

答案 0 :(得分:2)

地板函数具有线性上限和下限x-1 < floor(x) < x,这使得可以确定曲线的一般形状。然后可以找到下限的最大值(这是一个线性函数)并枚举x的值,这些值落入A的上限可能达到下限的最大值的区域,即上限超过下限最小值的区域。 如果这个区域是有限的,那么可以找到最大化x的{​​{1}}。如果不是,则表示该函数是循环函数,因此您必须确定其周期并找到该期间的最大值。

在示例中,下限为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的值x == 0,可以减少到{{1}因此,只需检查(200100 - 996 * x) / 1000 > 196100 / 1000的值,从0到4。

答案 1 :(得分:1)

对于给定范围,floor((x+100)/1000)floor(x/1000)都是0。这使得这个例子非常简单。

P.S。我不认为Java与这个问题有任何关系。

答案 2 :(得分:1)

编辑:没看到x必须是整数。

如果某人有一个变量不必是整数的函数,他们可以使用以下函数:

要估算最大值,您可以查看Nelder-Mead method。它易受局部最大值的影响,需要平滑的功能。它在Flanagan's Java Scientific Library中实施。基本上你必须扩展MaximizationFunction并实现函数

public double function(double[] param)

其中包含您的上述功能。此方法在给定参数param(在您的情况下为一个值:x)的情况下评估函数,并返回函数值。

然后你可以像这样使用整个程序:

//Create instance of Maximisation
Maximization max = new Maximization();

// Create instace of class holding function to be maximised
YourFunction funct = new YourFunction();

// initial estimates (your initial x)
double[] start = {30.0};

// initial step sizes (take a good guess)
double[] step = new double[start.length];
Arrays.fill(step, 100);

// convergence tolerance
double ftol = 0.0001;

// maximal number of iterations
int maxIter = 5000;

// Nelder and Mead maximisation procedure
max.nelderMead(funct, start, step, ftol, maxIter);

// result of maximization
double result = max.getMaximum()

由于您的变量有限制,您应该通过addConstraint的{​​{1}}方法添加一些约束。

答案 3 :(得分:0)

这是一个大纲,因为这是家庭作业

public int myMax(int x){ // assuming x is an integer
  // implement the math function as a Java function 
  // Java has a floor function
}

public int findMaxOverRange(int low, int hi) {
    int highestSoFar = 0;
    for (int x = low; x <= hi; x++) {
       // invoke your function, getting the result.  If the result is higher
       // than highestSoFar, reset highestSoFar to the value.
    }
}

floor function

答案 4 :(得分:-1)

在java中,你基本上学习了数学优化的整个领域,并在java中实现了一些算法(和任何其他语言一样) Java没有任何特定的数学工具。您可以搜索库。