Как найти минимальный диапазон для конкретной функции - PullRequest
0 голосов
/ 05 сентября 2018

Я довольно новичок в программировании и только что поступил в колледж. До сих пор я изучил некоторые базовые циклы, но вопрос в том, как определить минимальный диапазон конкретной функции?

Вот случай: «Выберите первый интервал, найдя a и b такие, что ? (?) ∙ ? (?) <0» </p>

и функция, которую я должен использовать: 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 (функция (а) * функция (б)) так, чтобы оно было близко к нулю.

Итак, все начинается с ввода пользователем 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 голосов
/ 05 сентября 2018

Чтобы полностью ответить на ваш вопрос, если вы хотите получить кратчайший интервал, интуитивные методы - это уменьшить его на шаг, определенный следующим образом:

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();
}

но если вам нужен точный результат, тогда шаг маленький, тогда вычисление может быть очень длинным ... Решение состоит в том, чтобы использовать дихотомию. Концепция проста: уменьшите интервал, разделив диапазон файлов на 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();
}

Надеюсь, что это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...