如何找到要放入特定功能的最小范围

时间:2018-09-05 17:18:45

标签: java loops

我对编程很陌生,刚被一所大学录取。 到目前为止,我已经学习了一些基本的循环,但是问题是如何确定特定功能的最小范围?

情况是这样的: “通过找到a和b来选择第一个间隔,使()∙()<0“

我必须使用的函数是:8−4.5(-sin)= 0

现在我被要求在该函数中输入2个数字并将其相乘。

这里是例子:

import java.util.Scanner;

public class Main {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      double a = sc.nextDouble();
      double b = sc.nextDouble();

      System.out.println(function(a)*function(b);

   public static double function(double x) {
      double resultF = 0;
      resultF = 8 - (4.5 * (x - Math.sin(x)));
      return resultF;
}

我已经为此做了一个课程。

现在的问题是,如果我要输入2(function(a)* function(b))并使其接近于零,该如何找到最小值。

因此,首先要使用户输入2个随机数。然后它们都将必须通过8-4.5(-sin)= 0函数。 计算完数字后,您可以将两个“计算出的数字”都乘以它们。  我在这里尝试做的是尝试建立一个循环,该循环将自动缩短“输入”的间隔,并使它们尽可能接近零。 (参考8-4.5(-sin)= 0函数)

到目前为止,我能做的是:

打包com.company;

import java.util.Scanner;

public class Main {
   public static void main(String[] args) {
      Scanner sc = new Scanner(System.in);
      double a = sc.nextDouble();
      double b = sc.nextDouble();
      double resultA = function(a);
      double resultB = function(b);
      double newA = 0;
      double newB = 0;

      System.out.println(resultA * resultB);
      System.out.println(resultA*resultB);
      if (resultA*resultB >=0) {
         if(a<b) {
            while(function(a)*function(b)>=0) {
               newA = a++;
               newB = b--;
            }

         } else if(a > b) {
            while(function(a)*function(b)>=0) {
               newA = a--;
               newB = b++;
            }
      }
   }
}

我知道最小间隔是3和2,但是我不知道如何使循环工作。

感谢您的回复!

感谢大家的帮助! 谢谢

1 个答案:

答案 0 :(得分:0)

如果您想获得最短的间隔,要完全回答您的问题,直观的方法是按照如下所示的步骤减少间隔:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    double a = sc.nextDouble();
    double b = sc.nextDouble();
    double step = sc.nextDouble();
    if (a > b) {
        double tmp = a;
        a = b;
        b = tmp;
    }
    double bResult = function(b);
    while (function(a) * bResult < 0) {
        a += step;
    }
    a -= step;
    double aResult = function(a);
    while (aResult * function(b) < 0) {
        b -= step;
    }
    b += step;
    System.out.println(a + " " + b);
    System.out.println(function(a) + " " + function(b));
    sc.close();
}

但是,如果您想获得精确的结果,则步骤很少,那么计算可能会非常漫长...解决方案包括使用Dichotomy。概念很简单:通过将le范围除以2来减小间隔,直到范围小于所需的间隔,如下所示:

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    double a = sc.nextDouble();
    double b = sc.nextDouble();
    double step = sc.nextDouble();

    if (a > b) {
        double tmp = a;
        a = b;
        b = tmp;
    }
    while (Math.abs(a - b) > step) {
        double mid = (a+b) / 2;
        if (function(mid) == 0) {
            System.out.println(mid);
            return;
        }
        if (function(a) * function(mid) < 0) {
            b = mid;
        } else {
            a = mid;
        }
    }
    System.out.println(a + " " + b);
    System.out.println(function(a) + " " + function(b));
    sc.close();
}

希望对您有帮助。