Алгоритм логарифмического преобразования числа в проценты

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

  1. 1.00 is 50%

  2. числа ниже 1,00 приближаются к 0% логарифмически

  3. #P3# <блочная цитата> #P4#

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


person Brent    schedule 28.11.2009    source источник
comment
С бесконечными пределами в любом направлении?   -  person Jed Smith    schedule 28.11.2009
comment
Да - бесконечный - или, по крайней мере, очень большой. Но такой, чтобы разница между действительно большим и бесконечным была бы ничтожно мала.   -  person Brent    schedule 28.11.2009
comment
некоторые предложения здесь: (а) перевести проценты в числа, например. 50% = 0,5, 100% = 1,0 - вы всегда можете вернуться к процентам, умножив на 100. (b) как указал Станислав, если вы имеете в виду асимптотически, а не логарифмически, отредактируйте свой вопрос соответствующим образом. (c) Четко укажите диапазон ввода для вашей функции. От 0 до бесконечности или от -бесконечности до +бесконечности? У нас возникли проблемы с пониманием того, что вы хотите.   -  person Jason S    schedule 28.11.2009


Ответы (4)


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

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

график

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

Изменить:

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

график

person cobbal    schedule 28.11.2009
comment
К сожалению, я упустил один важный момент: x > 0. Таким образом, y нужно приблизиться к 0, поскольку x становится бесконечно малым с положительной стороны. - person Brent; 28.11.2009
comment
Ну, учитывая, что мы вас неправильно поняли, можете ли вы нарисовать график того, что вы хотите, и добавить его к вопросу? - person Jed Smith; 28.11.2009
comment
@cobbal: какое программное обеспечение вы используете? четкие графики! - person Jason S; 28.11.2009
comment
Grapher.app по умолчанию, поставляемый с Mac OS X - person cobbal; 28.11.2009

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

person Stanislav    schedule 28.11.2009
comment
предполагая, что желаемое поведение для y = f (x) является (a) f (0) = 0, (b) f (1) = 0,5 и (c) lim x->бесконечность f (x) = 1, я назначаю этот ответ как лучший простой ответ. Я пытался придумать функцию, включающую просто сложение/вычитание/умножение/деление, которая работала бы, но у меня случился спазм мозга. - person Jason S; 28.11.2009

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

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

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

person Jason S    schedule 28.11.2009

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

http://jedsmith.org/static/S01813305.png

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

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

person Jed Smith    schedule 28.11.2009
comment
Это то, что я искал. Благодарю вас! - person Brent; 28.11.2009
comment
@ Брент: это не имеет смысла. Пожалуйста, переформулируйте свой вопрос, чтобы точно сказать, чего вы хотите. Приведенный выше график приближается к 1 при x=1. Вы упоминаете в своем вопросе, что хотите, чтобы y приближался к 1, когда x приближается к бесконечности, и вы хотите, чтобы y = 0,5, когда x = 1. - person Jason S; 28.11.2009
comment
На самом деле, ты прав, я говорил слишком рано. Это было не то, что я искал, так как Y больше 100 - person Brent; 28.11.2009
comment
@Jason: Нет, он сказал, что хочет процент. Я даю ему кривую, и он сам решает, в каких единицах он хочет ее получить. Формула, которая дает кривую, просто формула, которая дает кривую. Ему придется масштабировать результаты, перемещать начало координат и т. д. — и все это алгебраические преобразования. В этом случае ввод не должен точно соответствовать желаемому выводу - он программирует (по крайней мере, я так понял из алгоритмов), а не передает доказательство. Я завел его, вот и все. - person Jed Smith; 28.11.2009
comment
@Brent: Какого черта ты имеешь в виду, что y становится больше 100? Я дал вам кривую, вам решать масштабировать и манипулировать для получения желаемых результатов. Вы не указали свои диапазоны и ограничения каким-либо разумным образом, и мы работаем с данными, которые нам предоставлены. Масштабируйте выражение и не пытайтесь копировать и вставлять его, не поработав с ним. Я дал вам кривую, а не решение. - person Jed Smith; 28.11.2009
comment
@Jed: это не имеет смысла, имея в виду комментарий Брента, а не ваш ответ. Не хотел критиковать ваш ответ. - person Jason S; 28.11.2009
comment
@Jason: Не думал, что ты был, просто расстроился, потому что я не думаю, что ОП уверен, что он делает, и мы все теряем время. - person Jed Smith; 28.11.2009