Вопрос математического алгоритма - PullRequest
0 голосов
/ 28 мая 2010

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

Я хочу создать шкалу сдвига для чисел.

Допустим, у меня есть число 26000. Я хочу, чтобы результат этого алгоритма был 6500; или 25% от оригинального номера. Но если у меня есть число 5000, я хочу, чтобы результат был 2500; или 50% от оригинального номера.

Проценты не должны быть точными, это всего лишь пример.

Я просто хочу что-то вроде синусоидальной волны. По мере того, как число входных данных становится больше, выходное число составляет меньший процент от входного значения.

Имеет ли это смысл?

Ответы [ 6 ]

3 голосов
/ 28 мая 2010

Постройте несколько точек в Excel и используйте параметр «Показать формулу» на линии.

2 голосов
/ 28 мая 2010

Что-то вроде f(x) = x / log x?

x         | f(x)
=======================
26000     | 5889 (22.6 %)
5000      | 1351 (27.2 %)
100000    | 20000 (20 %)
1000000   | 166666 (16.6 %)

Просто простой пример.Вы можете настроить его, поиграв с основанием логарифма, добавив мультипликативные константы к числителю (x) или знаменателю (log x), используя квадратные корни, квадрат (или взяв корень) log x илиx и т. Д.

Вот что f(x) = 2*log(x)^2*sqrt(x) дает:

x         | f(x)
=======================
26000     | 6285 (24 %)
5000      | 1934 (38 %)
500       | 325 (65 %)
100       | 80 (80 %)
1000000   | 72000 (7.2 %)
100000    | 15811 (15 %)
1 голос
/ 28 мая 2010

Я бы посоветовал вам поиграть с степенным законом семейством функций, c * x ^ a == c * pow(x,a), где a - мощность. Если вам нужна точная доля вашего ответа, вы бы выбрали a=1, и это будет просто постоянная доля. Но вы хотите, чтобы процент медленно уменьшался, поэтому вы можете выбрать a<1. Например, мы можем выбрать a = 0,9 и c = 0,2 и получить

   1   0.2
  10     1.59
 100     12.6
1000     100.2

Таким образом, оно колеблется от 20% при 1 до 10% при 1000. Вы можете выбрать меньшее значение a, чтобы уменьшить долю быстрее. (И вы можете масштабировать все, чтобы соответствовать вашему диапазону.)

В частности, если c * 5000 ^ a = 2500 и c * 26000 ^ a = 6500, то путем деления мы получим (5.1) ^ a = 2.6, который мы можем решить как a = log (2.6) / log (5.1) ) = 0.58648 .... Затем мы снова подключаемся, чтобы получить c * 147.69 = 2500, поэтому c = 16.927 ...

Теперь прогрессия выглядит так

 1000   973
 3000  1853
 5000  2500
10000  3754
15000  4762
26000  6574
50000  9648
90000 13618
1 голос
/ 28 мая 2010

Может быть возможно точно определить желаемую функцию, если вы укажете третье преобразование в дополнение к двум, которые вы уже упомянули. Если вы имеете в виду какую-то конкретную цель, вполне вероятно, что вам подойдет хорошо известное математическое определение, которое, по крайней мере, один постер может определить для вас. Звучит так, как будто вы говорите о логарифмической функции. Однако для определения полезного алгоритма вам нужно будет более точно определить ваши требования.

1 голос
/ 28 мая 2010

Может помочь подходящая логарифмическая шкала.

0 голосов
/ 28 мая 2010

Это несколько похоже на простые схемы сжатия, используемые для аналогового аудио. См. Запись в Википедии для Companding .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...