Функция, которая быстро увеличивается и замедляется, достигая предопределенного максимума - PullRequest
0 голосов
/ 14 февраля 2019

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

Лучшее, что я нашел, это квадратный корень из логарифма:

val log = (1..10).map { Math.sqrt(Math.log(it * 1.0)) }
    val max = log.max()
    val rounded = log.map { it * 1000 / max!! }.map { Math.round(it) }

    rounded.forEachIndexed { i, l ->
        if (i + 1 < rounded.size)
            println("${rounded[i + 1] - rounded[i]}")
    }

Тем не менее, я до сих пор не получаю очень маленькие приращения в конце,Если диапазон от нуля до 10: 549, 142, 85, 60, 46, 37, 31, 27, 23 Если диапазон равен 20: 481, 125, 74, 53, 40, 33, 27, 23, 21, 18, 16, 14, 14, 12, 11, 10, 10, 9, 9

Какой алгоритм использовать, чтобы добраться до 1 в конце?

Обновление: На основе формулы Патрика я сделал это решение:

`  val N = 18981.0
    val log = (1..50).map { N - N/it }
    val max = log.max()
    log.map { print("$it, ") }
    val rounded = log.map { it * N / max!! }.map { Math.round(it) }` 

Важно, чтобы N было Double, а не целым числом

1 Ответ

0 голосов
/ 14 февраля 2019

Квадратный корень из логарифма также растет до бесконечности.Попробуйте

f(n) = N - N/n

Это имеет значение 0 при n = 1 и стремится к N, когда n растет без ограничений.Если вам нужна более детальная детализация, добавьте несколько коэффициентов и поэкспериментируйте с ними, пока не получите что-то разумное.Например, вы можете использовать [1 + (n / 1000)] и получить аналогичный, но гораздо более медленный рост.Вы также можете использовать exp(-x) или любую функцию с горизонтальной асимптотой и получить аналогичное поведение.

f(n) = N - exp(-n)

Опять добавьте несколько коэффициентов и посмотрите, как функция изменяется

...