Если я правильно понимаю, вы хотите найти x
такой, что f(x) = y
для константы y
, а f(x)
нелинейный, но не имеет других входов. Это правильно?
Давайте далее предположим, что f(x)
строго увеличивается или уменьшается (то есть: он не шевелится вверх и вниз и не пересекает y
за несколько x
с). Затем вы можете использовать стандартный двоичный поиск, чтобы найти единственный перехват:
найти значения
x_lo
такой, что f(x_lo) < y
x_hi
такой, что f(x_hi) > y
посмотрите на середину 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.