Алгоритм логарифмического преобразования числа в процент - PullRequest
3 голосов
/ 28 ноября 2009

Я ищу способ перевести любое число в процент следующим образом:

  1. 1,00 - это 50%
  2. числа ниже 1,00 приближаются к 0% логарифмически
  3. числа выше 1,00 приближаются к 100% логарифмически.

    x> 0. Поэтому y нужно приблизиться к 0, так как x становится бесконечно малым с положительной стороны.

Я уверен, что это просто сделать, но я не могу вспомнить, как это сделать.

Ответы [ 4 ]

15 голосов
/ 28 ноября 2009

попробуй 1 / (1 + e^(1-x))

это логистическая функция , сдвинутая на 1 единицу

graph

Если вы хотите, чтобы он приближался быстрее, вы можете изменить e на что-то более высокое

Изменить:

чтобы f (0) = 0, вы можете использовать 1 - 2^(-x)

graph

4 голосов
/ 28 ноября 2009

Когда вы говорите логарифмически, вы имеете в виду асимптотически? Если это так, то «y должен приблизиться к 0, так как x становится бесконечно малым на положительной стороне», просто означает, что f (0) = 0, если f непрерывен. В этом случае x / (x + 1) будет работать: http://www.wolframalpha.com/input/?i=x%2F%28x%2B1%29

2 голосов
/ 28 ноября 2009

Из того, что вы описываете, я слышу график x в кубе - очень простой, и он должен быть эффективен в большинстве языков.

График http://jedsmith.org/static/S01813305.png

Это было отображено с помощью y=(x-1)^3+1 (преобразуется в (1,1) источник). Конечно, вы можете сделать результаты в процентах, просто увеличив масштаб на 50.

Вы, в конечном счете, пытаетесь найти эффективное решение, которое даст вам приблизительный процент поведения в языке программирования, а не в Mathematica, верно?

2 голосов
/ 28 ноября 2009

как насчет y = f(t) = 1 - exp(-t/tau)?

Для t около 0, y приблизительно равно t / tau.Для t, приближающегося к бесконечности, y асимптотически приближается к 1.

Что касается подхода f (1) = 0,5, это можно использовать для решения при tau = 1 / log (2).

...