Какой самый быстрый способ увеличить значение переменной, пока она не совпадает со значением другой переменной в Javascript? - PullRequest
0 голосов
/ 10 апреля 2019

У меня есть код, который увеличивает значение переменной 'x' на 0,01, и делаю некоторые вычисления, пока она не совпадет со значением другой переменной 'y'. В то время как «X» увеличивается, «y» уменьшается не линейно.

Какая логика лучше всего найти для значений, где 'x' и 'y' одинаковы или наиболее близки? Увеличение «х» на 0,01 делает работу, но, поскольку я действительно нуб, я думаю, что есть умный способ.

Заранее спасибо

1 Ответ

1 голос
/ 10 апреля 2019

Если я правильно понимаю, вы хотите найти x такой, что f(x) = y для константы y, а f(x) нелинейный, но не имеет других входов. Это правильно?

Давайте далее предположим, что f(x) строго увеличивается или уменьшается (то есть: он не шевелится вверх и вниз и не пересекает y за несколько x с). Затем вы можете использовать стандартный двоичный поиск, чтобы найти единственный перехват:

  1. найти значения

    • x_lo такой, что f(x_lo) < y
    • x_hi такой, что f(x_hi) > y
  2. посмотрите на середину m = (x_hi + x_lo) / 2.

    • если f(m) < y, используйте x_lo = m и повторите этот шаг
    • если f(m) > y, используйте x_hi = m и повторите этот шаг
    • если f(m) == y, или оно достаточно близко для ваших нужд, вы закончили!

Простой способ найти начальные значения для x_hi и x_lo, то есть проверить значение f(any), и присвоить x_hi=any или x_lo=any в зависимости от того, больше оно или меньше чем y. Если у вас есть одна крайность, вы можете быстро найти другую, быстро увеличивая или уменьшая ее. Скажем, у нас есть x_lo, мы можем проверить с x_hi = x_lo*(2^i) для i=1, 2, 3, ..., с ^, представляющим возведение в степень.

Если f(x) пересекает y в нескольких точках, это не работает - потому что он может пропустить прямо над важным x в шаге 2.

...