2016-04-11 46 views
0

我遇到了最小值未正确设置的问题。最大值设置完美,但我知道最小值应该小于0.运行此片段,似乎最小值永远不会被设置。有任何想法吗?确定函数的极值

编辑:曲线点应该是从-1到3以下是图像: The curve

public class FindingExtrema { 
    public static void main(String[] args) { 
     double lowestPoint = 0; 
     double highestPoint = 0; 
     double y; 

     double x = -1; 
     int timesCalculated = 0; 

     while (x <= 3) { 
      y = run(x); 

      if (y < lowestPoint) { 
       lowestPoint = y; 
       System.out.printf("y: %1$.5f", y); 
      } 

      if (y > highestPoint) { 
       highestPoint = y; 
      } 

      x += .00001; 
      timesCalculated++; 
     } 

     System.out.println("Done!"); 
     System.out.printf("Lowest: %1$.5f, Highest: %2$.5f; Calculated %3$d times\n", lowestPoint, highestPoint, timesCalculated); 
    } 

    private static double run(double x) { 
     return Math.cbrt(2 * x) - Math.sqrt(8 * x) + x + 16; 
    } 
} 
+1

你的功能没有对于x <0所定义; Math.sqrt(8 * x)是虚数。无论在Wolfram Alpha上的函数都不是您在Java代码中实际使用的函数。 –

+0

那么我该如何解决这个问题呢?只需用'Math.sqrt(8 * x)替换为0? – kneeki

+0

你可以通过在Java中编写正确的函数来解决这个问题,因为你在这里看到的并不像你提供的图表。 –

回答

1

表达

Math.cbrt(2 * x) - Math.sqrt(8 * x) + x + 16; 

不等同于右手边为你图的方程式 - 你得到立方根混淆体积测量,并与平方混淆平方根。

正确表达是

(2 * x * x * x) - (8 * x * x) + x + 16 
2

但我知道,最小值应小于0.1

它不是,如果你绘制它。我将你的函数插入Google,范围为0到3,最小值为15.431。

+0

如果我将lowestPoint的默认值设置为100,我确实看到它已设置为15.xxxx,但这不可能是正确的。 -.- – kneeki

+0

@kneeki它对于你用Java编写的函数来说是正确的值,但我不认为这是你想写的函数。 –

0

请按如下所示设定您的最低点。

double lowestPoint = 1000; 

请问您能否把原始方程?你不能找到负值的平方根。

SQRT 公共静态双SQRT(双一)

返回正确舍入double值的正平方根。特殊情况:如果参数为NaN或小于零,则结果为NaN。 ◦如果参数是正无穷大,那么结果是正无穷大。 ◦如果参数为正零或负零,则结果与参数相同。 否则,结果是最接近参数值的真正数学平方根的double值。参数:a - 一个值。返回:a的正平方根。如果参数是NaN或小于零,则结果是NaN。