Решатель математических уравнений Java [не нормальные уравнения] - PullRequest
0 голосов
/ 20 ноября 2018

Мне нужен метод в Java, который возвращает решение для уравнения, это уравнение без кода выглядит следующим образом:

  1. получить число (Z)
  2. и угол (C) в радиан

затем найдите значение X, которое является решением для этого уравнения:

a = Integer( z*cos(c) ) // temp must be integer
//now we have the value of a
// we put it in b
b = a
//now we look for the value of x that solves this equation
b =? Integer( X/cos(C) ) // X also must be integer
 X = ?? // we must get X the solves the equation above

Пример: рассмотрим

Z = 15
C = 140 // full angles will be casted ..it will be rooted to ~-0.0629*PI

temp = Integer( 15*cos(140) // -2.96 )
temp <-- -2 //after parsing to integer
-2 = Integer ( X )/cos(140)

what is X ?

Я пытался реализовать этот метод в Java, но в большинстве случаев он застревал, находя результат, этот код не находит прямого решения, как я хочу, чтобы он проверял числа, пока не получит его, но во многих случаях он не может найтирезультат и продолжает цикл до бесконечности.Кроме того, он так медленно находит результат, и я вызываю эту функцию более 500 000 раз в программе

int Rounding(int z, int c){
      int offset = 20 ;
      int x;
      int test = (int) ( z*Math.cos(c) - offset );
      int solution;
      while(true){
        solution = (int) ( test/Math.cos(c) );
        if(solution == z){
          x = solution;
          break;
        }else{
          test++;
        }
        /*
        if(solution > z){
          offset ++;
          solution = (int) ( z*Math.cos(c) - offset );
        }
        */
      }
      return x;
  }
/*Note : the function will return x only when it solves this : */
int returned_Z = (int) ( x/Math.cos(c) )
// returned_Z must be equal to z

После этого эта переменная x будет сохранена в файле ... затем, когда файл откроет этупеременная x будет возвращена в z с помощью этой функции:

int returning(int x, int c){
  int z = (int) ( x/Math.cos(c) );
  return z;
}

Ответы [ 2 ]

0 голосов
/ 20 ноября 2018

Из вашей публикации у нас есть

temp = Integer( 15*cos(140) // -2.96 )
Find X such that
temp = Integer ( X/cos(140) )

Мы можем решить это для X без целочисленных преобразований.

X = 15 / cos^2(140)

или, в общем случае

X = Z / cos^2(C)

Это даст вам точное решение для X;вы можете применить целочисленное промежуточное требование, если это необходимо для какой-либо другой цели.


Обновление для каждого комментария OP

У вас есть определенные математические отношения между X,temp и Z.Усечение промежуточного результата нарушает некоторые из этих отношений.Короче говоря, если вы ограничите X целыми числами, вы не сможете гарантировать, что вы получите точно Z при применении обратных операций.

В частности, у вас есть трансцендентная функция cos;вы не можете диктовать, что это будет соотношение ваших целых чисел temp и X или X и Z.Существуют точечные решения для cos, которые являются известными рациональными числами, но очень немногими.

Если я неправильно понимаю проблему - я понимаю, что у нас есть некоторая проблема перевода - тогда, пожалуйста, обновите свой вопрос, чтобы указатьисправить проблему.

0 голосов
/ 20 ноября 2018

На самом деле Eqn имеет бесконечное количество решений.Скажи temp = 2.И вы пишете:

2 = Integer ( ( X )/cos(140) )

Если мы берем Integer() для всех действительных чисел в диапазоне 2.0 <= num < 3.0, это приводит к 2.Поэтому возможно бесконечное количество решений.Например, если мы возьмем 2.5 из диапазона:

2 = Integer (2.5) is true
so we can write, 
    x / cos(140) = 2.5
 => x = 2.5 * cos(140)
      = −1.915111108

Если мы возьмем еще один 2.3 из диапазона:

x = −1.761902219

Поскольку существует бесконечное число действительных чисел вдиапазон 2.0 <= num < 3.0, число решений тоже бесконечно.

Так что нельзя ожидать единственного решения для x.Если вы это сделаете, то используйте:

int Rounding(int z, int c){
    int test = ( z*Math.cos(c) );
    int x = (int) ( test*Math.cos(c) );

    return x;
}

Это даст вам правильный ответ.Но, как я уже говорил, существует бесконечное количество решений для x.

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